2016-08-12 5 views
1

Ich habe folgenden Code. Ich muss das JTextPane-Objekt aktualisieren, wenn sich die Ergebnisvariable ändert. Ergebnisvariable ändert sich ordnungsgemäß, es wurde getestet. Dieser Code funktioniert als Thread. Ich habe wirklich keine Idee, wie ich es lösen könnte, vielleicht wäre ein eventlistener dort gut?Thread JFrame muss aktualisiert werden JTextPane

public class GeneralShopFrame implements Runnable, Observer{ 
    private double result = 0 ; 
    JFrame jf = new JFrame(); 
    JPanel buttonPanel = new JPanel(); 
    JTextPane jtp = new JTextPane(); 
    @Override 
    public void run() { 
     String[] tab = { "Data_0.txt", "0" } ; 
     GeneralShopThread gst = new GeneralShopThread(tab); 
     Runnable r = gst; 
     Thread t = new Thread(r); 
     t.start(); 

     GeneralShopFrame gsf = new GeneralShopFrame(); 
     gst.addObserver(gsf);  

     jtp.setText("Current value of result is " + result); //I NEED UPDATE IT 

     buttonPanel.add(jtp); 

     buttonPanel.setPreferredSize(new Dimension(400, 200)); 

     jf.add(buttonPanel, BorderLayout.CENTER); 
     jf.pack(); 
     jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jf.setVisible(true); 
    } 

    public GeneralShopFrame(String[] args) { 
    }  

    @Override 
    public void update(Observable o, Object arg) { 

     result = (double) arg; 
     System.out.println(makespan);  
    } 
} 

Antwort

4

Sie setText(...) auf dem JTextPane aus der Update-Methode aufrufen, sollte darauf sicher sein, nehmen, dass es auf dem Swing-Ereignis-Thread aufgerufen wird, zB aus einem Runnable, die auf das Ereignis Faden SwingUtilities.invokeLater(...) Warteschlange gestellt wird . zB

// code not tested 
@Override 
public void update(Observable o, Object arg) { 
    SwingUtilities.invokeLater(() -> { 
     result = (double) arg; 
     jtp.setText("Current value of result is " + result); 
    }); 
} 

Aber Sie sagen, dass es nicht funktioniert, und Ihr Code zeigt, warum: Sie oben andere GeneralShopFrame Objekt in Ihrer run-Methode zu schaffen, eine, die nicht angezeigt wird, und aus diesem Grunde , Sie benachrichtigen die falsche GeneralShopFrame Objekt der Änderungen an einer beobachtbaren. Tu das nicht. Stattdessen vielleicht das aktuelle GeneralShopFrame-Objekt oder this in diesen Anruf:

+0

Das ist Arbeit !! Danke! Ich habe ein paar Stunden verloren, um es zu lösen. – marylin17

Verwandte Themen