有两个框架,当您单击第一个框架上的按钮时,它会打开第二个框架。在第二帧我正在尝试创建一个按钮,按下该按钮关闭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();
^
(注意:我删除了与问题无关的位或不相关的代码。)
提前感谢任何人都可以帮助我。
答案 0 :(得分:1)
如果要处置Time_First_Depot帧,则必须在该类的实际活动实例上调用dispose();所以事件处理程序需要访问该实例。你可以通过各种方式做到这一点。一种方法:将“this”传递给ExitButtonListener的构造函数;让构造函数接受一个JFrame参数并将其存储在一个成员变量中,然后通过该成员调用dispose()。
答案 1 :(得分:1)
方法dispose
是JFrame
的一种方法。因此,我建议您将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();
}