我在程序中使用了几个showInputDialogs。 当其中一个输入弹出时,它会冻结背景中的所有其他窗口,直到收到输入为止,有没有办法让它不冻结其他窗口?
答案 0 :(得分:3)
如果通过“冻结”表示用户无法访问其他窗口,则关键是使新对话框成为非模态对话框。您可以从JOptionPane中提取JDialog,然后选择以非模态方式显示它。 JOptionPane API将告诉您如何操作。搜索标题为“直接使用:”的部分
编辑:正如安德鲁所述! 1 +
玩代码......
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.*;
public class Foo {
public static void main(String[] args) {
final JTextField textfield = new JTextField(10);
textfield.setFocusable(false);
final JPanel panel = new JPanel();
panel.add(textfield);
panel.add(new JButton(new AbstractAction("Push Me") {
private JOptionPane optionPane;
private JDialog dialog;
private JTextField optionTextField = new JTextField(10);
@Override
public void actionPerformed(ActionEvent arg0) {
if (dialog == null) {
JPanel optionPanel = new JPanel(new BorderLayout());
optionPanel.add(new JLabel("Enter some stuff"),
BorderLayout.PAGE_START);
optionPanel.add(optionTextField, BorderLayout.CENTER);
optionPane = new JOptionPane(optionPanel,
JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
dialog = optionPane.createDialog(panel, "Get More Info");
dialog.setModal(false);
dialog.addComponentListener(new ComponentAdapter() {
@Override
public void componentHidden(ComponentEvent arg0) {
Integer value = (Integer) optionPane.getValue();
if (value == null) {
return;
}
if (value == JOptionPane.OK_OPTION) {
textfield.setText(optionTextField.getText());
}
}
});
}
dialog.setVisible(true);
}
}));
JFrame frame = new JFrame("Frame");
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
答案 1 :(得分:3)
使用非模态JDialog
代替。有关详细信息,请参阅How to Use Modality in Dialogs。