HTM in Javaframe

Status
Niet open voor verdere reacties.

emiel333

Gebruiker
Lid geworden
8 sep 2008
Berichten
14
Ik wil een htm-file die op mijn HD staat openen in een java-frame.
Het frame aanmaken etc lukt wel, maar de htm-file daarin openen krijg ik niet voor elkaar...

Dit is wat ik tot nu toe heb:
Code:
        JFrame frame = new JFrame("BSS");
        frame.setSize(400, 600);  
        //frame.setLocation(x, y);   
                
        // hier moet dus de htm file in het frame geopend worden
       
        frame.pack();
        frame.setVisible(true);

Alvast bedankt!
 
Je kan hier voor een JEditorPane gebruiken.

Er is een constructor die een URL als string accepteerd dus waarschijnlijk mag je zoiets doen:

editor = new JEditorPane("File://voorbeeld.html");
JScrollPane scrollPane = new JScrollPane( editor );
scrollPane.setPreferredSize( new Dimension(300, 200) );
getContentPane().add(scrollPane );

gr.


ps. heb dit zelf nog niet getest.. laat maar weten als het niet werkt.
 
Bedankt voor je reactie Skinflowers!

Het ziet er alsvolgt uit nu:

Code:
JFrame framebss = new JFrame("BSS");      
JEditorPane editor = new JEditorPane("D:\\BSS\\BSS.htm");
JScrollPane scrollPane = new JScrollPane(editor);
scrollPane.setPreferredSize( new Dimension(300, 200) );
framebss.getContentPane().add(scrollPane);

Hij lijkt echter nog problemen te hebben met die URL.
In een link naar een bestand op de HD moet toch \ door \\ vervangen worden?
 
Protocol

Hij geeft overigens aan dat hij een protocol mist...
Bij de foutmeldingen staat telkens "no protocol" of "unknown protocol".

Hoop dat je hier iets aan hebt...
 
Volgens mij moet je URL zijn "FILE:\\D:\BSS\\BSS.htm"..

Je zou het ook kunnen testen met URL "HTTP:\\www.google.com"...
 
Hallo Skinflowers.

Wederom bedankt voor je reactie!
De foutmelding is inderdaad verdwenen na FILE:\\ voor de link te zetten.
Helaas werkt het nog niet zo als zou moeten.
Het frame blijft namelijk leeg. Het frame wordt dus wel aangemaakt en zichtbaar gemaakt etc, maar de htm file is er niet in te zien.

Enig idee waar dit aan kan liggen?

Groet,
Emiel
 
hoi.

Zelf toch maar aan het testen geslagen en de url moet zijn:
"file:/d:/bss/bss.htm"

of via een File object:
File f = new File("d:\\bss\\bbs.htm");
JEditorPane editor = new JEditorPane(f.toURI().toURL());

succes.
 
Probleem

Hoi Skinflowers,

Mijn class werd te lang, waardoor hij helemaal niet meer werkt. Kan je dus ook nog niet zeggen of het nou werkt met het laden van die htm-file in dat frame. Laat ik je nog weten;)

Zit dus nu met een nieuw probleem en aangezien jij me al vaker uit de brand hebt weten te helpen wil ik vragen of jij me kan helpen.

Om mijn code in te korten wil ik int[] waarden die ik genereer in het begin van mijn code in een aparte class gaan genereren en opslaan in een file op mijn schijf, zodat ik ze later gewoon kan laden in de mainclass. Ze blijven immers toch altijd hetzelfde.

Dus mijn vraag is:
Hoe sla ik meerdere integers op in een file en hoe kan ik ze later weer laden in een andere class? Het best is denk om meerdere arrays in 1 file te zetten en ze per regel in te lezen, niet?

Ik heb al iets geprobeerd met Scanner en een BufferedReader (en FileReader), maar het wil nog niet helemaal lukken.

Ik hoop dat je tijd hebt en me kunt helpen!:rolleyes:

Alvast dank en vriendelijke groet, Emiel.
 
Hoi,

Het beste kan je alle waarden die je wil opslaan in een klasse zetten. Dan kan je mbv serialization deze klasse opslaan en later weer inladen:

Code:
public class Data implements Serializable { 
    
    private int[] getallen;
    private String name;
}

Je moet "implements Serializable" toevoegen om aan te geven dat je deze klasse wil opslaan. Deze interface heeft verder geen members.
De klasse zelf mag wel gewoon functies hebben. Dus je kan gewoon de functie om de getallen te berekenen hierin zetten. (je kan hierin ook de functies zetten om de file inlezen...)

Om deze klasse op te slaan in een file en weer in te lezen gebruik je het volgende:

Code:
Data data = new Data();
//bereken getallen...

System.out.println("loading using serialization");    
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("datafile.dat"));
            oos.writeObject(data);
            oos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
}

System.out.println("load old reeks");
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("datafile.dat"));
            //readObject geeft een object terug we moeten de compiler vertellen dat het een Data klasse was vandaar de cast.
            data = (Data) ois.readObject(); 
            ois.close();
        } catch (Exception ex) {
            ex.printStackTrace();
}

Als je iets wijzigt in de Data klasse worden oude bestanden ongeldig. Als je deze toch probeert in te lezen krijg je een exception en moet je je getallen opnieuw berekenen...

succes.
 
Oh geweldig! :D Hartstikke bedankt voor je duidelijke bericht weer!
Ben benieuwd of ik het geregeld krijg... Ga het vanavond proberen. Laat je weten of het gelukt is.

Thanks again! :thumb:
 
Oké, ik ben al een heel eind, maar het werkt nog niet helemaal.

Mijn Data class ziet er alsvolgt uit nu:

Code:
public class Data implements Serializable { 
   public static void main (String args[]) 
            throws InterruptedException, AWTException, IOException {
            
        Robot robot = new Robot();      
   
        Data data = new Data() {};
        
        String fileDCKC = "DC_KC.png"; 
        Image imageDCKC = Toolkit.getDefaultToolkit().getImage(fileDCKC); 
        PixelGrabber grabDCKC = 
        new PixelGrabber(imageDCKC, 0, 0, -1, -1, false); 
        int[] DCKC = null; 
        if (grabDCKC.grabPixels()) { 
        int width = grabDCKC.getWidth(); 
        int height = grabDCKC.getHeight(); 
        DCKC = new int[width * height]; 
        DCKC = (int[]) grabDCKC.getPixels();}

//en vervolgens nog een heleboel arrays die gegenereerd worden
       
        System.out.println("loading using serialization");    
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("dataDC.dat"));
                    oos.writeObject(data);
                    oos.close();
                } 
                catch (IOException ex) {
                    ex.printStackTrace();        
                }
   }
}

En de class waarin ik de int[] 's uiteindelijk nodig heb bevat het volgende:
Code:
class BSwitch{
    public static void main (String args[]) 
            throws InterruptedException, AWTException, IOException {
    
        Data data = new Data() {};      
        
        System.out.println("load old reeks");
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dataDC.dat"));
            //readObject geeft een object terug we moeten de compiler vertellen dat het een Data klasse was vandaar de cast.
            data = (Data) (ois.readObject()); 
            ois.close();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
         
    }
}

Ik krijg echter de volgende foutmeldingen:
Code:
init:
deps-jar:
compile-single:
run-single:
load old reeks
java.io.InvalidClassException: Switch.Data; local class incompatible: stream classdesc serialVersionUID = -6922221404710891470, local class serialVersionUID = 5726855898406869383
        at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        at Switch.BSwitch.main(BSwitch.java:21)
BUILD SUCCESSFUL (total time: 0 seconds)

De regel met de foutcode (BSwitch.java:21) is deze: data = (Data) (ois.readObject());

Ik heb al een hele tijd zitten googlen enz. naar een oplossing, maar dat heeft me niets opgeleverd tot nu toe. Het lijkt mij dat mijn codes kloppen, maar het tegendeel wordt bewezen als ik ze run.

Heb je enig idee?

Groet,
Emiel.
 
Ik heb nog wat aangepast en kan de Data class nu probleemloos draaien.

Ziet er alsvolgt uit:

Code:
public class Data implements Serializable { 
   public static void main (String args[]) 
            throws InterruptedException, AWTException, IOException { 
        
        Robot robot = new Robot();      
              
        Data data = new Data() {};

        String fileDCKC = "DC_KC.png"; 
        Image imageDCKC = Toolkit.getDefaultToolkit().getImage(fileDCKC); 
        PixelGrabber grabDCKC = 
        new PixelGrabber(imageDCKC, 0, 0, -1, -1, false); 
        int[] DCKC = null; 
        if (grabDCKC.grabPixels()) { 
        int width = grabDCKC.getWidth(); 
        int height = grabDCKC.getHeight(); 
        DCKC = new int[width * height]; 
        DCKC = (int[]) grabDCKC.getPixels();}
       
// en de rest van de arrays die gegenereerd worden

        System.out.println("loading using serialization");    
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("dataDC.dat"));
                    oos.writeObject(data);
                    oos.close();
                } 
                catch (IOException ex) {
                    ex.printStackTrace();        
                }
   }
}

De class waar ik de arrays in nodig heb:
Code:
class BSwitch{
    public static void main (String args[]) 
            throws InterruptedException, AWTException, IOException {
     
        Data data = new Data() {};      
        
        System.out.println("load old reeks");
        try {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("dataDC.dat"));
            //readObject geeft een object terug we moeten de compiler vertellen dat het een Data klasse was vandaar de cast.
            data = (Data) ois.readObject(); 
            ois.close();
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
         
    }
}

Code:
init:
deps-jar:
compile-single:
run-single:
load old reeks
java.lang.ClassCastException: Switch.Data$1 cannot be cast to javax.xml.crypto.Data
        at Switch.BSwitch.main(BSwitch.java:21)
BUILD SUCCESSFUL (total time: 0 seconds)

Het lijkt er dus op dat er iets mis gaat met die cast. (Die tijd van 0 seconden klopt, omdat ik alles wat onnodig is op het moment uitgezet heb)

Bij de vorige post ging het mis, omdat de Data class geen main method had. Bovendien had ik hem veranderd, waardoor gebeurde waar je al voor gewaarschuwd had. :rolleyes:

Dit ziet er in ieder geval minder dramatisch uit dan mijn vorige post, dus ik heb er het volste vertrouwen in dat jij de oplossing weet!
 
Ik denk dat je per ongeluk ergens foute Data import hebt staan.. (import javax.xml.crypto.data).. Dit is ook een data class maar niet die van jou :D
 
Dat was het inderdaad! Het werkt nu! SUPER!

Als ik nu arrays wil vergelijken geeft hij aan dat data geen int[], dus ik ga nog even uitzoeken hoe dat kan. Als ik daar achter ben is het helemaal klaar.

Heel erg veel dank voor je hulp! Geweldig!!
 
Dat was het inderdaad! Het werkt nu! SUPER!

Als ik nu arrays wil vergelijken geeft hij aan dat data geen int[], dus ik ga nog even uitzoeken hoe dat kan. Als ik daar achter ben is het helemaal klaar.

Heel erg veel dank voor je hulp! Geweldig!!

En ook dat is nu gelukt!

Door int[] DCKC = (int[]) ois.readObject(); te gebruiken.

Groet en nogmaals hartelijk dank!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan