2013-12-15 3 views
0

Im используя несколько showInputDialogs в программе. Когда один из этих входных данных всплывает, он замораживает все остальные окна в фоновом режиме, пока не получит вход, есть ли способ сделать это не заморозить другие окна?showInputDialog замерзает другие окна

ответ

3

Если «замораживание» означает, что пользователь не может получить доступ к другим окнам, тогда ключ должен сделать новый диалог немодальным диалогом. Вы можете извлечь JDialog из JOptionPane, а затем выбрать, чтобы отобразить его немодальным способом. 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

* «Искать раздел под названием« Прямое использование: »« О, я не думал об этом. +1 Это * - это проблема, связанная с воссозданием функциональности 'JOptionPane'. –

+0

Я проверил ее, но я не вижу, как она работает с inputdialogs? У меня есть inputdialogs в стилях tablename = JOptionPane.showInputDialog ("Enter tablename * (используйте заглавные буквы)"); – Looptech

Смежные вопросы