showInputDialog冻结其他窗口

时间:2013-12-15 20:41:31

标签: java swing input joptionpane

我在程序中使用了几个showInputDialogs。 当其中一个输入弹出时,它会冻结背景中的所有其他窗口,直到收到输入为止,有没有办法让它不冻结其他窗口?

2 个答案:

答案 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