使用按钮关闭JFrame而不终止程序

时间:2011-04-25 12:22:51

标签: swing jframe

有两个框架,当您单击第一个框架上的按钮时,它会打开第二个框架。在第二帧我正在尝试创建一个按钮,按下该按钮关闭JFrame而不终止程序,但我没有运气。这是我试图用于第二帧的代码,没有按钮编译好:

class Time_First_Depot extends JFrame
{   
    Time_First_Depot()
    {
        Container c = getContentPane(); \\ creates content pane
        c.setLayout ( null );

        Color b = new Color(100,200,255); \\ set colour of JFrame 
        c.setBackground( b );

        JButton exit = new JButton("EXIT"); \\creats button
        exit.addActionListener(new ExitButtonListener()); \\ adds listener to button

        exit.setForeground(Color.BLUE); \\edits buton
        exit.setFont(new Font("Time", Font.BOLD, 12));

        c.add(exit);\\adds button

        exit.setBounds(250, 375, 90, 30);\\ sets location of button

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds((int) screenSize.getWidth()/2 - 370, (int) screenSize.getHeight()/2 - 300, 600, 450);  // set position and size
        this.setResizable(false);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        this.setTitle("Time");
        this.setVisible(true);
        this.setResizable(false);
    }
}

class ExitButtonListener implements ActionListener
{
    ExitButtonListener(){}
            public void actionPerformed(ActionEvent e)
            {
                    if (e.getActionCommand().equals("EXIT"))
                    {

                            dispose();
                    }
            }

}

编译时我收到以下错误消息:

cannot find symbol
symbol  : method dispose()
location: class ExitButtonListener
                            dispose();
                            ^

(注意:我删除了与问题无关的位或不相关的代码。)

提前感谢任何人都可以帮助我。

4 个答案:

答案 0 :(得分:1)

如果要处置Time_First_Depot帧,则必须在该类的实际活动实例上调用dispose();所以事件处理程序需要访问该实例。你可以通过各种方式做到这一点。一种方法:将“this”传递给ExitButtonListener的构造函数;让构造函数接受一个JFrame参数并将其存储在一个成员变量中,然后通过该成员调用dispose()。

答案 1 :(得分:1)

方法disposeJFrame的一种方法。因此,我建议您将ActionListener

的引用传递给我
class ExitButtonListener implements ActionListener {
    private final JFrame frame;

    ExitButtonListener(JFrame frame) {
        this.frame = frame;
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("EXIT")) {
            frame.dispose();
        }
    }
}

答案 2 :(得分:0)

  

有两个框架,当您单击第一个框架上的按钮时,它会打开第二个框架。在第二帧我试图创建一个按钮,按下时关闭JFrame而不终止..

如果您可以将第二个JFrame换成JOptionPane(或模态JDialog),大部分问题都将得到解决。

答案 3 :(得分:0)

你应该考虑触发DefaultCloseOperation除了触发相同的过程之外什么也不做,就像你按下JFrame右上角的红色x一样。

然后处理将由JFrame本身完成,或者更确切地说是已经指定的:

this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

您可以通过this question's answers以多种方式实现这一目标。

Possiblity one:你将一个WindowEvent排队,从而伪造一个CloseOperation:

public void actionPerformed (Event e) {
    WindowEvent wev = new WindowEvent(
         SwingUtilities.windowForComponent((Component) e.getSource()),
         WindowEvent.WINDOW_CLOSING
    );
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
}

可能性二:您在不排队事件的情况下处置Window,但从而跳过您指定的所有EventListener:

public void actionPerformed (Event e) {
     JFrame rootWindow = ((JFrame) SwingUtilities.getRoot((Component) e.getSource()));
     rootWindow.dispose();
}