java swing FocusGoverd模式对话框不会停止底层框架上的ActionPerformed事件

java swing FocusGoverd模式对话框不会停止底层框架上的ActionPerformed事件,java,swing,events,dialog,modal-dialog,Java,Swing,Events,Dialog,Modal Dialog,我有一个JavaSwing应用程序,希望用户在执行JButton上的actionPerformed事件之前输入一些文本。为此,我在按钮上添加了一个焦点侦听器,该按钮创建了一个模式对话框,用于读取用户的文本输入,如以下代码示例所示: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.Focus

我有一个JavaSwing应用程序,希望用户在执行JButton上的actionPerformed事件之前输入一些文本。为此,我在按钮上添加了一个焦点侦听器,该按钮创建了一个模式对话框,用于读取用户的文本输入,如以下代码示例所示:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ModularDialogBug {

  static String msg = "";

  public static void main(String[] args) {

JFrame frame = new JFrame("Bug?");

JButton button = new JButton("press me");

button.addFocusListener(
        new FocusListener() {
  @Override
  public void focusGained(FocusEvent e) {
    if (e.getOppositeComponent() != null) {
      System.out.println("focusGained");
    }
    //fails to block actionPerformed event on "press me" button:
    msg = JOptionPane.showInputDialog(null, "please input msg");
  }

  @Override
  public void focusLost(FocusEvent e) {
  }
}
);

button.addActionListener(
        new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    System.out.println("actionPerformed");
    JOptionPane.showInputDialog(null, msg);
  }
}
);

JPanel p = new JPanel();

p.add(new JButton("initial focus"));
p.add(button);

frame.add(p);

frame.pack();
frame.setVisible(true);
}
}
问题在于,在FocusGoven中创建的对话框不是真正的模态对话框,在模态对话框返回之前,actionPerformed事件(由模态对话框的事件循环)被执行。如果我用阻塞操作(例如从stdin读取)替换模式对话框,那么一切都会按预期工作。 从我对模态对话框的理解来看,这似乎是一个bug(在模态对话框返回之前不应执行actionPerformed)。有趣的是,这在win7(64位java8)和mint17(也是64位java8)上都会发生。 swing实现是特定于供应商的,还是windows和linux共享相同的swing代码? oracle,到底谁对swing bug负责?
此外,我还没有找到任何明确的定义,如何在swing中实现模态,所以可能行为是预期的?我了解到,当模式对话框运行时,某些事件会被阻止执行。

这不是错误,而是功能。您只需在操作中移动输入对话框的代码。
JOptionPane.showInputDialog(frame,msg)?从JavaDocs“parentComponent-确定对话框显示的帧;如果为空,或者parentComponent没有帧,则使用默认帧”-“默认”帧来自内存,是由
JOptionPane
创建的不可见帧,我自己检查了文档,并尝试设置框架,如:JOptionPane.showInputDialog(frame,msg);它没有区别(它只是确定对话框的中心位置)。如果将null指定为frame,那么对话框相对于所有其他帧都是模态的,至少我读到的是模态的。因此,它应该与frame或null一起工作,但在这两种情况下都不起作用。