【问题标题】:How to pause execution of a program until a button is clicked in Java Swing如何暂停程序的执行,直到在 Java Swing 中单击按钮
【发布时间】:2009-12-07 08:40:36
【问题描述】:

我有一个带有 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 方法创建时才会发生。

【问题讨论】:

标签: java multithreading


【解决方案1】:

不,您应该只使用JDialog。

【讨论】:

  • 没什么区别,我认为这不是这里的问题,问题在于等待和通知业务。
  • 等待和通知与此无关。这不是同步和多线程问题。
  • 那么我如何让它在按钮被点击后让程序继续执行呢?
  • 它是自动完成的 - 这是 modal 对话框的行为
【解决方案2】:

你需要一个 modal 对话窗口。 Here 是关于对话框的教程。对于简单的情况,使用JOptionPane 更容易。

对话框可以是模态的。当模态对话框可见时,它会阻止用户对程序中所有其他窗口的输入。

【讨论】:

  • 无论我使用对话框还是框架似乎都没有区别,但我可能应该让它与对话框一起使用,因为这似乎更符合我使用它的目的.
【解决方案3】:

正如其他两个答案所暗示的那样,您需要一个模态 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 模态的非常好的文章。

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多