禁用处理中的关闭按钮

时间:2015-06-11 19:08:29

标签: java awt processing

在特定事件期间,有没有办法在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的情况下这样做。

1 个答案:

答案 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);
}