GUI hängt

dl9hda

Mitglied
Hallo, ich habe folgendes Problem. Ich starte ein Programm, welches die GUI initialisert. Dann kommt eine Pause und dann soll in eine Text in die GUI geschrieben werden. Nur leider erscheint das Fenster beim Programmstart und nach einer Pause wird es mit den Elementen gefüllt und dann steht auch schon der Text da.

Die Pause ist nur zur Verdeutlichung des Problems. Normalerweise läuft da anderer Code.

Was mache ich verkehrt?

Gruß
Holger

Code:
import java.awt.EventQueue;

public class TestKlasse
{
    private GUI gui;
   
    public TestKlasse()
    {
        gui = new GUI();
   
                try
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
       
        gui.textPane.setText("TestKlasse");
    }
       
       
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new TestKlasse();
            }
        });
    }
}

Code:
import java.awt.Font;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;


public class GUI
{
    private JFrame hauptFenster;
    private JPanel buttonPanel;
   
    public JTextPane textPane;
       
    private int channelAreaX = 20;
    private int channelAreaY = 30;

    private ArrayList<JButton> configButtons = new ArrayList<JButton>();
   
    public GUI()
    {
        buildGUI();
    }
   
    public void buildGUI()
    {
        hauptFenster = new JFrame("TestKlasse");
        hauptFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        hauptFenster.getContentPane().setLayout(null);
               
        buttonPanel = new JPanel();
        buttonPanel.setLayout(null);
        buttonPanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
        buttonPanel.setBounds(channelAreaX, channelAreaY, 290, 130);
       
        String buttonPanelTitle = "Konfiguration";
        Border borderbuttonPanel = BorderFactory.createTitledBorder(buttonPanelTitle);
        buttonPanel.setBorder(borderbuttonPanel);
        hauptFenster.getContentPane().add(buttonPanel);

        StyleContext.NamedStyle centerStyle = StyleContext.getDefaultStyleContext().new NamedStyle();
        StyleConstants.setAlignment(centerStyle,StyleConstants.ALIGN_CENTER);
        textPane = new JTextPane();
        textPane.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
        textPane.setEditable(false);
        textPane.setBounds(channelAreaX, 70, 251, 40);
        textPane.setLogicalStyle(centerStyle);
       
        textPane.setText("");
        textPane.setFont(new java.awt.Font("Courier New", Font.PLAIN, 14));
        textPane.setFocusable(false);
        buttonPanel.add(textPane);          
       
        configButtons.add(new JButton());
        configButtons.get(0).setText("Load");
        configButtons.get(0).setBounds(channelAreaX, channelAreaY, 65, 23);
        configButtons.get(0).setEnabled(false);
        buttonPanel.add(configButtons.get(0));
       
        configButtons.add(new JButton());
        configButtons.get(1).setText("Save/Send");
        configButtons.get(1).setBounds(channelAreaX + 75, channelAreaY, 95, 23);
        configButtons.get(1).setEnabled(false);
        buttonPanel.add(configButtons.get(1));
       
        configButtons.add(new JButton());
        configButtons.get(2).setText("Reset");
        configButtons.get(2).setBounds(channelAreaX + 180, channelAreaY, 70, 23);
        configButtons.get(2).setEnabled(false);
        buttonPanel.add(configButtons.get(2));
       
        hauptFenster.setPreferredSize(new java.awt.Dimension(350, 220));
        hauptFenster.pack();
        hauptFenster.setResizable(false);
        hauptFenster.setLocationRelativeTo(null);
       
        hauptFenster.setVisible(true);
    }
}
 

Flown

Administrator
Mitarbeiter
Der Grund dafür - warum es hängt - ist das du Arbeit (Initialisierung) im EDT (event-dispatcher thread) machst. Ein einfaches SwingUtilities#invokeLater sollte dabei helfen:

Java:
gui = new GUI();

SwingUtilities.invokeLater(() -> {

  try {
    Thread.sleep(1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  gui.textPane.setText("TestKlasse");
});
 
K

kneitzel

Gast
Der Grund dafür - warum es hängt - ist das du Arbeit (Initialisierung) im EDT (event-dispatcher thread) machst. Ein einfaches SwingUtilities#invokeLater sollte dabei helfen:

Java:
gui = new GUI();

SwingUtilities.invokeLater(() -> {

  try {
    Thread.sleep(1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  gui.textPane.setText("TestKlasse");
});
Öhm, invokeLater führt doch auch im UI Thread aus und somit hast du auch wieder ein blockieren der Applikation? Oder habe ich das jetzt missverstanden?
"Causes doRun.run() to be executed asynchronously on the AWT event dispatching thread. This will happen after all pending AWT events have been processed. This method should be used when an application thread needs to update the GUI. In the following example the invokeLater call queues the Runnable object doHelloWorld on the event dispatching thread and then prints a message."

Das Erwähnen von SwingUtilities.invokeLater ist aber sehr gut, denn das ist das Hilfsmittel, um aus anderen Threads heraus die UI zu ändern.
 

Flown

Administrator
Mitarbeiter
Öhm, invokeLater führt doch auch im UI Thread aus und somit hast du auch wieder ein blockieren der Applikation? Oder habe ich das jetzt missverstanden?
Kurze Antwort: Ja das stimmt. Aber es führt Codeblock "asynchron" aus, wenn es Zeit hat. (i.d.R. heißt das es wird nachgereiht und hat dann diesen "stuck" flavor nicht)
 

dl9hda

Mitglied
Moin allerseits, vielen Dank! Ich habe einfach alles mit Zeitaufwand in einen swingworker verbracht. Nun läuft alles zufriendstellend.

Holger
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
CptK Achsenskalierung in Koordinatensystem hängt Programm auf Java Basics - Anfänger-Themen 5
N httpclient - Verbindung hängt ? Java Basics - Anfänger-Themen 13
Fishmeaker Methoden mit Methoden aufrufen - Programm hängt sich auf Java Basics - Anfänger-Themen 5
Lord.Djerun (Netbeans) Bei TimeUnit.Seconds,Sleep() hängt sich das komplette Programm auf.. Java Basics - Anfänger-Themen 8
P Eingabeaufforderung hängt sich auf Java Basics - Anfänger-Themen 2
S Programm hängt sich auf Java Basics - Anfänger-Themen 2
D Programm hängt evtl. Deadlock? Java Basics - Anfänger-Themen 8
J JFRAME hängt sich auf Java Basics - Anfänger-Themen 12
O java.util.Scanner hängt sich auf Java Basics - Anfänger-Themen 5
R Netbeans hängt sich beim profilen auf Java Basics - Anfänger-Themen 4
P BlueJ hängt sich beim compilen auf Java Basics - Anfänger-Themen 9
F Primitiver Lucas-Lehmer-Test hängt sich auf Java Basics - Anfänger-Themen 7
S JDK hängt beim Ausführen von Dateien Java Basics - Anfänger-Themen 13
R JFileChooser hängt java Programm auf Java Basics - Anfänger-Themen 6
O Editor hängt sich auf Java Basics - Anfänger-Themen 21
T BufferedReader oder Prozess, wer hängt sich auf? Java Basics - Anfänger-Themen 6
D Runtime Prozeß hängt sich auf. in der Kommandozeile gehts Java Basics - Anfänger-Themen 5
G GUI hängt sich auf! Java Basics - Anfänger-Themen 20
W sleep "hängt" bei vielen Threads Java Basics - Anfänger-Themen 2
G Compiler hängt schon wieder Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben