在特定事件期间,有没有办法在Processing中禁用窗口的关闭按钮?
以下是代码片段:
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
if (youWin == 0) // condition that is supposed to keep the application opened
{
JOptionPane.showMessageDialog(frame,"You can't exit until you finish this game. OK?");
// keep applet opened
}
}
}
);
编辑:我想在不使用JFrame的情况下这样做。
答案 0 :(得分:0)
编辑:我想在不使用JFrame的情况下这样做。
太糟糕了。您已使用JFrame
,但您根本就不知道。
处理将为您创建JFrame
,即使它存储在Frame
变量中。如果您不相信我,请查看PSurfaceAWT的第453行。
这意味着您可以使用JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
告诉框架,当您单击X按钮时,不执行任何操作。这会禁用自动关闭JFrame的低级侦听器。
import javax.swing.JFrame;
void setup() {
((JFrame)frame).setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
void draw() {
background(0);
ellipse(mouseX, mouseY, 10, 10);
}
但这只是战斗的一半。 Processing还有自己的侦听器,可以检测用户在低级侦听器顶部单击X按钮的时间。这个监听器调用exit()
函数,无论如何都会关闭草图。
要解决 ,您必须覆盖exit()
功能。 (您也可以删除Processing添加的侦听器,但这更容易imho。)
import javax.swing.JFrame;
void setup() {
((JFrame)frame).setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
void exit() {
println("not exiting");
}
void draw() {
background(0);
ellipse(mouseX, mouseY, 10, 10);
}
好的,我们已经完全删除了使用X按钮关闭框架的功能。现在我们必须添加在我们想要的时候关闭它的能力。您可以通过在super.exit()
函数中添加对exit()
的调用来执行此操作:
void exit() {
if(reallyExit){
super.exit();
}
}
调用super.exit()
将为您关闭草图。由您决定如何设置reallyExit
变量。
另一种方法是将WindowListner
添加到处理结束事件的JFrame
:
void setup() {
((JFrame)frame).setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent we) {
if (reallyExit) {
frame.dispose();
}
}
}
);
}
这是一个使用这两种方法的完整示例。您只需要 拨打frame.dispose()
或拨打super.exit()
。这完全取决于个人偏好。
import javax.swing.JFrame;
void setup() {
((JFrame)frame).setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent we) {
if (mouseX < 10) {
frame.dispose();
}
}
}
);
}
void exit() {
if(mouseX <10){
super.exit();
}
}
void draw() {
background(0);
ellipse(mouseX, mouseY, 10, 10);
}