簡體   English   中英

如何暫停程序的執行,直到在Java Swing中單擊按鈕為止

[英]How to pause execution of a program until a button is clicked in Java Swing

我有一個帶有GUI的程序,需要打開一個單獨的窗口並等待用戶選擇和選擇,然后繼續。 我認為我應該使用wait()和notify()方法來執行此操作,但是我仍在嘗試弄清楚如何使用它們。 一個復雜的因素是,當第二個窗口在actionPerformed()方法中創建時,事情似乎有所不同。

我認為這是應該在這里完成的方式,顯然這不太正確...

這應該創建一個帶有按鈕的窗口,當按下按鈕時,應該創建另一個帶有按鈕的窗口,並且當按下該按鈕時,程序應該打印“ End”。

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方法創建窗口時才會發生這種情況。

不,您應該只使用JDialog

您需要一個模式對話框窗口。 這里是對話框的教程。 對於簡單情況,使用JOptionPane會更容易。

對話框可以是模式對話框。 當模式對話框可見時,它將阻止用戶輸入程序中的所有其他窗口。

正如其他兩個答案所示,您需要一個模式JDialog。 您不需要處理任何線程類。 一旦處理了用戶輸入,JDialog窗口將處理您的控制權。 您可以通過幾種方法來設置對話框模式。 這是兩個例子。

new JDialog(Dialog owner, boolean modal)

要么

new JDialog(Dialog owner, String title, boolean modal)

您還可以執行以下操作:

JDialog dialog = new JDialog(owner);
dialog.setModal(true);

我認為是一篇有關JAVA模態的不錯的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM