java swing FocusGoverd模式对话框不会停止底层框架上的ActionPerformed事件
我有一个JavaSwing应用程序,希望用户在执行JButton上的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
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一起工作,但在这两种情况下都不起作用。