Hallo!
Ich möchte mein Problem anhand eines sehr einfachen Beispiels erklären.
Ich habe einen JDialog mit einem Button und einem Label erstellt. Beim Klick auf einen Start Button möchte ich im Label counterLabel mit einem bestimmten zeitlichen Abstand hochzählen. Ich hab das mit Thread.sleep(100) versucht:
Mein Problem:
Die println() Anweisung wird in jedem Schleifendurchlauf auf der Console angezeigt.
Der Text des counterLabels wird nur einmal ganz am Ende (auf 9) aktualisiert.
Warum wird der Text im counterLabel nicht alle 100 Millisekunden aktualisiert?
Habe ich einen komplett falschen Ansatz?
Ich möchte mein Problem anhand eines sehr einfachen Beispiels erklären.
Ich habe einen JDialog mit einem Button und einem Label erstellt. Beim Klick auf einen Start Button möchte ich im Label counterLabel mit einem bestimmten zeitlichen Abstand hochzählen. Ich hab das mit Thread.sleep(100) versucht:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class NewJDialog extends javax.swing.JDialog {
{
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
e.printStackTrace();
}
}
private JButton Start;
private JLabel counterLabel;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
NewJDialog inst = new NewJDialog(frame);
inst.setVisible(true);
}
});
}
public NewJDialog(JFrame frame) {
super(frame);
initGUI();
}
private void initGUI() {
try {
GridLayout thisLayout = new GridLayout(1, 1);
thisLayout.setHgap(5);
thisLayout.setVgap(5);
thisLayout.setColumns(1);
getContentPane().setLayout(thisLayout);
{
Start = new JButton();
GroupLayout StartLayout = new GroupLayout((JComponent)Start);
Start.setLayout(null);
getContentPane().add(Start);
Start.setText("start");
Start.setPreferredSize(new java.awt.Dimension(150, 100));
Start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
StartActionPerformed(evt);
}
});
StartLayout.setHorizontalGroup(StartLayout.createParallelGroup());
StartLayout.setVerticalGroup(StartLayout.createParallelGroup());
}
{
counterLabel = new JLabel();
getContentPane().add(counterLabel);
counterLabel.setText("");
}
pack();
} catch (Exception e) {
e.printStackTrace();
}
}
private void StartActionPerformed(ActionEvent evt) {
counterLabel.setText("");
for(int counter = 0; counter < 10; counter++)
{
System.out.println(counter);
counterLabel.setText(String.valueOf(counter));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Mein Problem:
Die println() Anweisung wird in jedem Schleifendurchlauf auf der Console angezeigt.
Der Text des counterLabels wird nur einmal ganz am Ende (auf 9) aktualisiert.
Warum wird der Text im counterLabel nicht alle 100 Millisekunden aktualisiert?
Habe ich einen komplett falschen Ansatz?