在actionPerformed上只打开一个窗口

时间:2014-03-04 11:09:56

标签: java swing jframe actionlistener

我查看了有关如何在单击按钮时只打开一个窗口的主题,但没有任何解决方案有帮助,可能是因为我的代码结构有点不同。

所以我有一个扩展JFrame的主窗口类,其中一个按钮应该在单击时打开一个新窗口。我已经在一个单独的类中为新窗口定义了小部件/面板等。目前,每次我点击按钮都会打开一个新窗口。我想这样做,如果一个窗口已经打开,那么一旦再次点击该按钮,它就会切换到该窗口。

以下是我的一些代码:

public class MainWindow extends JFrame{

    /*
     * create widgets and panels
     */
    Button.addActionListener(new ActionListener() { // the button that opens 
                                                    //a new window

                @Override
                public void actionPerformed(ActionEvent e) {
                    Window2 ww = new Window2(); //creating the new window here

                }
            });
    }

NB。如果有任何帮助,Window2类也会扩展JFrame。

谢谢

3 个答案:

答案 0 :(得分:2)

actionPerformed方法中提取ojbect创建,因为每次单击按钮时都会创建新对象。以下可以帮助您: -

  1. 制作一个Window2类singalton,了解有关singalton点击here的更多详情。
  2. 2。添加null检查如下: -

        ....
    Window2 ww = null; // static or instence variable
    ......
    @Override
    public void actionPerformed(ActionEvent e) {
    if(ww==null)
    {
         ww = new Window2(); 
         ww.someMethod();
    
    }
    else
    {
       ww.someMethod();
    
    }
    

    } });

答案 1 :(得分:1)

以下是一个完整的工作示例:

<强> Window2.java

public class Window2 extends JFrame {

    private static final long serialVersionUID = 7843480295403205677L;

}

<强> MainWindow.java

public class MainWindow extends JFrame {

    private static final long serialVersionUID = -9170930657273608379L;

    public static void main(String[] args) {
        MainWindow mw = new MainWindow();
        mw.go();
    }

    private void go() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    private void createAndShowGUI() {
        JButton button = new JButton("Click me");

        button.addActionListener(new ActionListener() {

            private Window2 ww = null;

            @Override
            public void actionPerformed(ActionEvent e) {
                if (ww==null) {
                    ww = new Window2(); //creating the new window here
                    ww.setDefaultCloseOperation(HIDE_ON_CLOSE);
                    ww.setTitle("Window2 created on " + new Date());
                    ww.setSize(500, 200);
                }

                pack();
                ww.setVisible(true);
            }
        });

        setLayout(new BorderLayout());
        add(button);

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        pack();
        setVisible(true);
    }
}

答案 2 :(得分:0)

你可以尝试制作两个窗口并将actionPerformed方法放在主类中,这样当按下按钮时它会显示第二个窗口