JFrames方法setVisible(true)或setVisible(false)不在循环中工作。帧未正确显示

时间:2013-05-21 13:00:37

标签: java swing jframe

JFrames在循环中无法正常显示。 代码: -

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);
                    }
                }
            }
        });
}

});

}

}

2 个答案:

答案 0 :(得分:1)

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

validate();
repaint();

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

答案 1 :(得分:1)

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

一种可能的解决方案可能是启动计时器并在每个计时器上勾选相关事件到EDT,使用SwingUtilities.invokeLater()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();