我有一个带有GUI的程序,需要打开一个单独的窗口并等待用户选择和选项,然后继续。我想我应该使用wait()和notify()方法来做这件事,但我仍然试图弄清楚如何使用它们。一个复杂的因素是,当在actionPerformed()方法中创建第二个窗口时,事情看起来会有所不同。
以下是我认为应该在这里完成的事情,显然它不太正确......
这应该创建一个带按钮的窗口,当按下按钮时,应该创建另一个带按钮的窗口,当按下该按钮时,程序应该打印“结束”。
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class WtfExample {
public static void main(String[] args) {
JFrame jf = new JFrame();
JButton butt = new JButton("Button");
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
WtfExample we = new WtfExample();
we.display();
}
});
jf.getContentPane().add(butt);
jf.setSize(new Dimension(1000, 500));
jf.setVisible(true);
System.out.println("End");
}
public synchronized void display() {
JFrame jf = new JFrame();
JButton butt = new JButton("Button");
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
synchronized(WtfExample.this) {
WtfExample.this.notifyAll();
}
}
});
jf.getContentPane().add(butt);
jf.setSize(new Dimension(1000, 500));
jf.setVisible(true);
while(true) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
}
编辑 - 我在一件事情上不够清楚 - 打开的第二个窗口是空白的,就像它的组件从未添加到它一样。无论是框架还是对话框都是如此,但只有在从actionPerformed方法创建窗口时才会发生这种情况。
答案 0 :(得分:4)
不,你应该只使用JDialog。
答案 1 :(得分:2)
您需要一个模态对话框窗口。 Here是关于对话框的教程。对于简单的情况,使用JOptionPane
会更容易。
对话可以是模态的。当模态对话框可见时,它会阻止用户输入程序中的所有其他窗口。
答案 2 :(得分:0)
另外两个答案表明你需要一个模态JDialog。您不需要处理任何Thread类。一旦处理了用户输入,JDialog窗口将处理给予您控制权。有几种方法可以设置对话框模态。这是两个例子。
new JDialog(Dialog owner, boolean modal)
或
new JDialog(Dialog owner, String title, boolean modal)
您也可以这样做:
JDialog dialog = new JDialog(owner);
dialog.setModal(true);
我认为this是关于JAVA模态的一篇非常好的文章。