Update swingUtilities Repaint in der Schleife

ms_cikar

Mitglied
Hallo,

irgend wie möchte mein Code heute nicht funktionieren.
Ich möchte ganz einfach wenn ich auf ein Button klicke, dass mein code auch in einer while schleife die werte von Jlabel ändert.
Irgend wie funktioniert das nicht ganz. Text von jlabel wird erst wenn die Schleife zu ende geführt wird geändert.

Ich habe mit:
contentPane.invalidate();
contentPane.validate();
contentPane.repaint();
SwingUtilities.updateComponentTreeUI(contentPane);
probiert. Leider funktioniert nicht.

Zur Einfachheit habe ich ein test Code geschrieben.

Was mache ich falsch?


Javascript:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class main extends JFrame {

    public static  JPanel contentPane;
public static int i=0;
public static JButton btnButton;
public static JLabel lblText;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    main frame = new main();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        btnButton = new JButton("button");
        btnButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                while(i<10) {
                    System.out.println(String.valueOf(i));
                    try {Thread.sleep(400);} catch (Exception l) {}   
                    lblText.setText(String.valueOf(i));
                    i=i+1;
                    
                    contentPane.invalidate();
                    contentPane.validate();
                    contentPane.repaint();
                    SwingUtilities.updateComponentTreeUI(contentPane);
                    SwingUtilities.updateComponentTreeUI(lblText);
                    
                }
            }
        });
        btnButton.setBounds(161, 35, 89, 23);
        contentPane.add(btnButton);
        
        lblText = new JLabel("Text");
        lblText.setBounds(180, 88, 46, 14);
        contentPane.add(lblText);
    }
}
 
Dann müsstest Du die while Schleife in einen anderen Thread auslagern. Wenn Du den UI Thread der fürs zeichnen verantwortlich ist blockierst, dann kann er auch die UI nicht neu zeichnen.
 

Zurück
Oben