Avatar billede 5floor Nybegynder
11. august 2004 - 11:59 Der er 16 kommentarer og
2 løsninger

Skrive til .html-fil

Ja, så er det endnu et spm vedrørende udskrivning fra Java.
I mit program har jeg en ordre der bliver vist i en JList. Denne ordre og informationerne vil jeg gerne kunne skrive ud.
Har læst, at det kan være nemmere først at skrive det til en
.html for så at printe derfra.
Spørgsmålet er så bare hvordan jeg skriver til .html?

MvH
Mads
ps: Eksempler modtages gerne...tak
Avatar billede 5floor Nybegynder
11. august 2004 - 12:14 #1
Det behøver ikke nødvendigvis at være .html. Årsagen tildet umiddelbare valg ligger I, at jeg gerne vil kunne kontrollere opsætning, placering af tekst og fonte  mv - hvis altså muligt.
Mads
Avatar billede arne_v Ekspert
11. august 2004 - 12:16 #2
Umiddelbart mener jeg bare at udskriver.

Lav en PrintWriter og udskriv med println metoden !
Avatar billede mikkelbm Nybegynder
11. august 2004 - 12:18 #3
Super simpelt eksempel:

import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Testing extends JFrame
{
    private DefaultListModel model = new DefaultListModel();
    private JList list;
    private JButton gem = new JButton("Gem");
   
    public static void main(String[] args)
    {
        new Testing().setVisible(true);
    }
   
    public Testing()
    {
        setSize(300, 300);
        list = new JList(model);
       
        model.addElement("1. stk etellerandet 200,-");
        model.addElement("3. stk etellerandet 200,-");
        model.addElement("2. stk etellerandet 200,-");
        model.addElement("total: 1200,-");
       
        gem.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                gem();   
            }
        });
       
        this.getContentPane().add(list, BorderLayout.CENTER);
        this.getContentPane().add(gem, BorderLayout.SOUTH);
    }   
   
    public void gem()
    {
        String start = "<html><body>";
        String slut = "</body></html>";
       
        String ordre = start;
       
        for (int i = 0; i<model.getSize(); i++)
        {
            ordre += "<br />" + model.getElementAt(i);
        }
       
        ordre += slut;
       
        skriv(ordre);
    }
   
    public void skriv(String html)
    {
        try
        {
            PrintWriter pw = new PrintWriter(new FileOutputStream("c:\\ordre.html"));
            pw.println(html);
            pw.close();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
11. august 2004 - 12:20 #4
Du kan opbygge et XML DOM træ med XHTML og så udskrive det.

Men det er 10 gange mere bevsærligt.
Avatar billede 5floor Nybegynder
11. august 2004 - 14:56 #5
Hej Mikkel.
Dit eksempel ser fint ud, dog udskirver den ikke filen?
Hvilke escape-characters, font-koder mv. kan jeg benytte for at opstille ordren som jeg gerne vil den skal se ud i .html?
Mads
Avatar billede arne_v Ekspert
11. august 2004 - 15:23 #6
Du skriver HTML koden fuldstændigt som du vil have den.

Overskrifter med H1, H2 etc. tags.

Linieskift med BR tag.

Strukturerer data med TABLE.

Udskrivning gør du med javax.print pakken.
Avatar billede arne_v Ekspert
11. august 2004 - 15:29 #7
Jeg tror nok at vi læste dit spørgsmål som om at der var styr på print men at
du kun manglede at skrive filen.

javax.print beskrives her:
  http://www-106.ibm.com/developerworks/java/library/j-mer0322/
Avatar billede 5floor Nybegynder
11. august 2004 - 15:49 #8
Hej igen.
Umiddelbart tror jeg, at jeg er tæt på.
Har min JList liste i min kode. Har en Knap "Print" med en tilknyttet actionListener. Jeg tænker, at jeg kan genbruge Mikkels gem og print metoder. Jeg har dog ikke kunne få den til at skrive den eksisterende liste ud - det virker fint, hvis jeg bare add strenge som i Mikkels ex.
----ActionListener-----

    if(e.getSource() == printButton)
    {
      printList = new JList(model);
      model.addElement(liste); //liste er JList fyldt med data
      gem();   
    }

Med denne løsning kommer der til at stå følgende i html-filen:

javax.swing.JList[,0,0,632x450,alignmentX=null,alignmentY=null,border=,flags=296,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=204,g=204,b=255],selectionForeground=javax.swing.plaf.ColorUIResource[r=0,g=0,b=0],visibleRowCount=8,layoutOrientation=0]

Hvad gør jeg galt?
...og ja, jeg går straks igang med at læse mere om javax.print
Avatar billede arne_v Ekspert
11. august 2004 - 15:52 #9
Du skal vel ikke udskrive JList'en men den bagvedliggende model !?

Under alle omstændigheder bliver du nok nødt til at iterere over dine data og
outputte dem passende.

Jeg kunne forestille mig at en HTML TABLE var en god konstruktion.
Avatar billede mikkelbm Nybegynder
11. august 2004 - 16:07 #10
Har siddet og rodet lidt med det og fundet ud af, at hvis man bruger JEditorPane er det faktisk nemt at udskrive html (og det er også muligt at vise det - altså en slags 'vis udskrift')

Med udgangspunkt i eksemplet fra før, har jeg fundet frem til følgende:

import javax.swing.*;
import javax.print.*;
import java.awt.print.*;
import java.awt.*;
import java.awt.event.*;

public class Testing extends JFrame
{
    private DefaultListModel model = new DefaultListModel();
    private JList list;
    private JButton gem = new JButton("Vis udskrift");
   
    public static void main(String[] args)
    {
        new Testing().setVisible(true);
    }
   
    public Testing()
    {
        setSize(300, 300);
        list = new JList(model);
       
        model.addElement("1. stk etellerandet 200,-");
        model.addElement("3. stk etellerandet 200,-");
        model.addElement("2. stk etellerandet 200,-");
        model.addElement("total: 1200,-");
       
        gem.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                gem();   
            }
        });
       
        this.getContentPane().add(list, BorderLayout.CENTER);
        this.getContentPane().add(gem, BorderLayout.SOUTH);
    }   
   
    public void gem()
    {
        String start = "<html><body>";
        String slut = "</body></html>";
       
        String ordre = start;
       
        for (int i = 0; i<model.getSize(); i++)
        {
            ordre += "<br>" + model.getElementAt(i);
        }
       
        ordre += slut;
       
        skriv(ordre);
    }
   
    public void skriv(String html)
    {
        final MyEditorPane p = new MyEditorPane();
        p.setContentType("text/html");
        p.setText(html);
       
        JFrame f = new JFrame();
        f.setSize(300, 300);
        f.getContentPane().add(p, BorderLayout.CENTER);
       
        JButton print = new JButton("Print");
        print.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    PrinterJob pj = PrinterJob.getPrinterJob();
       
                    pj.setPrintable(p);
       
                    if (pj.printDialog())
                        pj.print();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
       
        f.getContentPane().add(print, BorderLayout.SOUTH);
        f.setVisible(true);
    }
}
Avatar billede mikkelbm Nybegynder
11. august 2004 - 16:07 #11
Og så en lille klasse der arver fra JEditorPane og implementere Prinable:

import javax.swing.*;
import java.awt.print.*;
import java.awt.*;

public class MyEditorPane extends JEditorPane implements Printable
{
    public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException
    {
        if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;
       
        Graphics2D g2 = (Graphics2D) g;
        g2.translate(pf.getImageableX(), pf.getImageableY());
        paint(g2);
        return Printable.PAGE_EXISTS;
      }
}
Avatar billede mikkelbm Nybegynder
11. august 2004 - 16:10 #12
Og hvis du ikke ønsker 'vis udskrift' metoden laver du bare skriv() om til

public void skriv(String html)
{
    MyEditorPane p = new MyEditorPane();
    p.setContentType("text/html");
    p.setText(html);
       
    try
    {
        PrinterJob pj = PrinterJob.getPrinterJob();
       
        pj.setPrintable(p);
       
        if (pj.printDialog())
            pj.print();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
}
Avatar billede mikkelbm Nybegynder
12. august 2004 - 22:08 #13
Kommet videre?
Avatar billede 5floor Nybegynder
13. august 2004 - 11:08 #14
Hej Mikkel.
Ja, jeg har fået det til at virke, delvist i hvert fald. Som Arne påpegede rodede jeg lidt rundt i det - det var jo ikke min liste der indeholdt data, men derimod en Vector??? Må have været træt e.lign?
Nu opretter jeg fint en .html fil med den indeholdende ordre - har lånt brudstykker af din kode Mikkel, hope it is ok?
Jeg arbejder videre med det i aften, så jeg venter lige med at lukke spm.
Indtil videre x1000 tak for hjælpen.
Mads
Avatar billede arne_v Ekspert
13. august 2004 - 11:22 #15
Fra reglerne:
  Det vil sige alle brugere frit må benytte de løsninger der udveksles på Eksperten.
Avatar billede mikkelbm Nybegynder
13. august 2004 - 11:34 #16
Selvfølgelig er det ok - ellers havde jeg ikke lagt det ud her :) - Som Arne også påpeger...

Jeg lægger et svar i tilfælde af, at du synes det var point værd.
Avatar billede 5floor Nybegynder
13. august 2004 - 21:47 #17
Hej Arne og Mikkel.
Så har jeg fået det til at virke, x1000 tak for hjælpen.
Arne læg et svar, så får du din del af kagen.
God weekend
Mads
Avatar billede arne_v Ekspert
13. august 2004 - 21:49 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester