我想知道是否有人可以向我解释为什么我的这个不能编译?当用户点击[x]按钮时,我试图在java中关闭一个Frame。我不确定你是否需要一个听众或类似的东西在java中,但因为我一直在查找这个问题,似乎这就是你需要的。
import javax.swing.JFrame;
public class BallWorld
{
public static void main( String[] args )
{
BallWorldFrame world = new BallWorldFrame();
world.setDefaultCloseOperation(world.DISPOSE_ON_CLOSE);
world.setVisible( true );
}
}
答案 0 :(得分:1)
这不起作用的原因是因为您的BallWorldFrame
类没有您尝试调用的方法。试试这个:
public class BallWorldFrame extends JFrame {
...
}
请注意,我们正在扩展JFrame
,从而允许我们使用setDefaultCloseOperation
和setVisible
等方法。
现在要创建一个关闭框架的按钮,您需要使用ActionListener
。你可以尝试这样的东西(把所有东西放在一个单独的类中):
public class BallWorld extends JFrame implements ActionListener {
private JButton x;
public BallWorld() {
x = new JButton("x");
x.addActionListener(this);
add(x);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new BallWorld();
}
public void actionPerformed(ActionEvent e) {
dispose(); // close the frame
}
}
注意我们的班级现在如何实施ActionListener
并覆盖actionPerformed
来关闭框架。 x.addActionListener(this)
表示“单击'x'按钮时,执行我们班级actionPerformed
方法中定义的操作,即关闭框架。”
答案 1 :(得分:0)
根据您的说法,听起来您的BallWorldFrame
不会从JFrame
延伸,因为默认关闭操作是JFrame
的独有功能
尝试一个更简单的例子:
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
BallWorldFrame world = new BallWorldFrame();
// All these compile and run without issue...
world.setDefaultCloseOperation(world.DISPOSE_ON_CLOSE);
world.setDefaultCloseOperation(BallWorldFrame.DISPOSE_ON_CLOSE);
world.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
world.setVisible(true);
}
});
}
public static class BallWorldFrame extends JFrame {
}
nb static
decleration来自这样一个事实:在我的例子中,BallWorldFrame
是我主类的内部类。如果您的BallWorldFrame
存在于其自己的类文件中,则不需要它。