Anzeige:
Ergebnis 1 bis 7 von 7

Thema: java - wieso verhält sich das so komisch?

  1. #1
    Registrierter Benutzer
    Registriert seit
    23.02.2003
    Ort
    schweiz
    Beiträge
    37

    java - wieso verhält sich das so komisch?

    ich habe da ein ganz merkwürdiges problem. erstmal der code:
    Code:
    public void DoIt(String cmdline){
            getContentPane().setLayout(null);
    	setSize(600,300);
    	setLocation(150,70);
            JTextArea outputarea = new JTextArea();
            JScrollPane scrollpane = new JScrollPane(outputarea);
            place(scrollpane,10,10,570,220);
            outputarea.setEditable(false);
            setVisible(true);
       
            try { 
                String line; 
                Process p = Runtime.getRuntime().exec(cmdline); 
                BufferedReader input = new BufferedReader (new InputStreamReader(p.getErrorStream())); 
                while ((line = input.readLine()) != null){ 
                    outputarea.append(line + "\n");
                } 
                input.close(); 
    	} 
            catch (IOException ioe) {} 
    }
    eigentlich müsste ja die JTextArea gleich angezeigt werden und während dem ausführen müsste der output des programms reingeschrieben werden. wird aber nicht. die JTextArea wird erst angezeigt, nachdem der try/catch-block abgeschlossen ist. sowas ist aber irgendwie witzlos.
    auch wenn der output statt in die JTextArea nach System.out geschrieben wird, ändert das nichts an der sache.

    kann mir jemand erklären, wie ich es anstellen muss, dass das programm gemäss meinen wünschen ausgeführt wird?
    Geändert von neonknight (24-03-2003 um 14:53 Uhr)

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Die TextArea bzw. jede GUI Komponeten wird im Thread der GUI gezeichnet.
    Wenn dieser Thread deine Methode aufruft, kann er erst wieder paint aufrufen, wenn er diese Methode abgearbeitet hat.

    Alle Änderungen, wie zB die neue TextArea, werden also erst sichtbar, wenn der Thread wieder frei wird.

    Du musst den blockierenden Teil der Methode in einem zweiten Thread abarbeiten.

    Und bitte Code Tags verwenden. Danke.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.02.2003
    Ort
    schweiz
    Beiträge
    37
    wie kann ich einen zweiten thread starten?

    sorry für die vergessenen code-tags...

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von neonknight
    wie kann ich einen zweiten thread starten?
    Du kannst entweder von java.lang.Thread ableiten und in der run() Methode deine Sache implementieren, oder du machst eine Klasse, die das Runnable Interface implementiert und machst alles in deren run() Methode.
    Eine Runnable Klasse kann man dann wiederum von einenm Thread ausführen lassen (siehe Konstruktor von java.lang.Thread, der Runnable als Parameter hat)


    sorry für die vergessenen code-tags...
    Bearbeiten und hinzufügen

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.02.2003
    Ort
    schweiz
    Beiträge
    37

    jetzt mit neuem problem ;-)

    alles klar, das hat prima geklappt. ich habe die ausführung in eine neue klasse gepackt.

    nun habe ich allerdings ein kleines problem. nach der ausführung soll das fenster geschlossen werden. wie muss ich den befehl übergeben? ich habe versucht das so zu regeln:

    klasse Gui:
    Code:
    public class Gui extends JFrame implements ActionListener {
        public Gui(String cmdline) {
            Layoutblablabla
             
            Execute p = new Execute(cmdline);
            new Thread(p).start();
        }
    
     restlicher code
    }
    klasse Execute:
    Code:
    public class Execute implements Runnable {
        Gui gui;
        public Execute(String cmdline) {
            hier befehle ausführen, danach:
    
             gui.dispose(); //<-- führt zu nullpointer-exception
        }
        
    }
    wie muss ich das umändern?
    Geändert von neonknight (24-03-2003 um 14:54 Uhr)

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    gui ist nicht gesetzt worden, also hat es nocht den Initialwert null.

    Probier mal eine Referenz von Gui als zweiten Parameter von Execute's Konstruktor und diese dann in deiner Variable speichern.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    23.02.2003
    Ort
    schweiz
    Beiträge
    37
    super, hat geklappt!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •