如何在Java Swing中单击按钮之前暂停程序的执行

时间:2009-12-06 22:39:54

标签: java multithreading

我有一个带有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方法创建窗口时才会发生这种情况。

3 个答案:

答案 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模态的一篇非常好的文章。