0

JFrame 无法在循环中正确显示。代码:-

import javax.swing.*;    
import java.awt.event.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class SwingDemo {

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
        final JFrame jfrm= new JFrame("A Simple Swing Application");

        final JFrame jfrm2= new JFrame("A Simple Swing Application 2");
        jfrm.setSize(275,100);

        jfrm.setLocation(100,100);
        jfrm2.setLocation(50,50);    
        jfrm2.setSize(275,100);
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    

        jfrm2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);           
        JLabel jlab = new JLabel("Swing means powerful GUIs.");         
        jfrm.add(jlab);    
        JButton button0= new JButton("loop");
        jfrm.add(button0);          
        jfrm.setLayout(new FlowLayout());    
        JLabel jlab2 = new JLabel("Swing means powerful GUIs again");           
        jfrm2.add(jlab2);    
        //jfrm2.setVisible(true);               

        jfrm.setVisible(true);

        button0.addActionListener(new ActionListener() {

            private boolean confirmAction;

            @Override
            public void actionPerformed(ActionEvent e) {

                confirmAction = true;
                if (confirmAction) {
                    try {
                while(true)
                {
                    jfrm.setVisible(false);
                                jfrm2.setVisible(true);    

                    try{
                        Thread.sleep(15000);
                    }
                    catch(InterruptedException ie)
                    {
                        System.out.println("nothing");
                    }
                            jfrm2.setVisible(false);
                    jfrm.setVisible(true);
                    }   
                    } catch (Throwable t) {
                        t.printStackTrace(System.out);
                    }
                }
            }
        });
}

});

}

}
4

2 回答 2

1

该方法 @Override public void actionPerformed(ActionEvent e) { ... } 在 EDT 中执行。一旦您在 EDT 中实现了无限循环,它将停止处理任何更远的事件,并且您的 GUI 将停止响应。

一个可能的解决方案可能是启动一个计时器,并在每个计时器滴答时将相关事件发布到 EDT,使用SwingUtilities.invokeLater()or invokeAndWait()

将 的内容替换为actionPerformed(ActionEvent e)以下内容:

Timer timer = new Timer(15000, new ActionListener() {
    boolean flip = false;
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                jfrm.setVisible(flip);
                jfrm2.setVisible(!flip);
                flip =! flip;
            }
        });
     }
});
timer.start();
于 2013-05-21T13:25:43.740 回答
1

如果问题是它们没有正确更新(这是我唯一的想法,因为您没有解释问题),您应该尝试在循环中包含这些方法:

validate();
repaint();

如果您的问题有所不同,请告知我们。

于 2013-05-21T13:08:22.913 回答