2013-09-30 3 views
0

У меня есть класс, который создает фрейм с jcombobox и jtextfield init, где пользователь вставляет некоторые данные. Тогда у меня есть другой класс, в котором пользователь вызывает класс с помощью swing. Хотя класс swing работает правильно, когда я вызываю его из другого класса, он появляется только после завершения программы. Мне нужно, чтобы он был открыт до тех пор, пока пользователь не вставит данные и не щелкнет так, чтобы введенные данные могли использоваться далее в коде.Вызов gui из другого класса, но появляется после завершения кода

Я призываю класс свинг главное с этим:

new constraints(); 
     constraints.main(null); 

и класс свинг основным является:

public static void main(String[] args) 
      { 
       Runnable runnable = new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         new constraints().displayGUI(); 
        } 
       }; 
       EventQueue.invokeLater(runnable); 
     } 

полный код:

public class constraints { 



     private static JTextField tField; 
     private MyDocumentFilter documentFilter; 
     private JLabel amountLabel; 
     private static String amountString = "Select Quantity of Products (in ktones): "; 
     public static String textstr = "" ; 
     public static String sig="" ; 
     public static String sigfinal=""; 

     private void displayGUI() 
     { 
      // final JFrame frame = new JFrame("Constraints"); 

      final JDialog dialog = new JDialog(); 
      // frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      dialog.setDefaultCloseOperation(
        JDialog.DISPOSE_ON_CLOSE); 

      amountLabel = new JLabel(amountString); 

      JPanel contentPane = new JPanel(); 
      contentPane.setBorder(
       BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
      tField = new JTextField(10); 

      amountLabel.setLabelFor(tField); 

      String[] Strings = { "Less", "Equal", "More"}; 
      final JComboBox combo = new JComboBox(Strings) ; 
      combo.setSelectedIndex(0); 

      JButton button = new JButton("Ok"); 
      button.addActionListener(new ActionListener(){ 
        public void actionPerformed(ActionEvent ae){ 

          textstr = tField.getText(); 



          sig = (String) combo.getSelectedItem(); 

          if (sig=="Less") { 
           sigfinal="l"; 
          }else if (sig=="Equal"){ 
           sigfinal="e" ; 
          }else if (sig=="More"){ 
           sigfinal="m"; 
          } 


         } 
        }); 

      JButton button2 = new JButton("Close"); 
      button2.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) 
       { 
        dialog.dispose(); 

       } 
     }); 


      ((AbstractDocument)tField.getDocument()).setDocumentFilter(
        new MyDocumentFilter());   


      contentPane.add(amountLabel); 
      contentPane.add(combo); 
      contentPane.add(tField); 
      contentPane.add(button); 
      contentPane.add(button2); 

      // JRootPane rootPane = frame.getRootPane(); 
      JRootPane rootPane = dialog.getRootPane(); 
      rootPane.setDefaultButton(button); 

      dialog.pack(); 
      dialog.setVisible(true); 
      dialog.setContentPane(contentPane); 
      dialog.setLocationByPlatform(true); 

//   frame.setContentPane(contentPane); 
//   frame.pack(); 
//   frame.setLocationByPlatform(true); 
//   frame.setVisible(true); 
     } 

     public static void main(String[] args) 
     { 
      Runnable runnable = new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        new constraints().displayGUI(); 
       } 
      }; 
      EventQueue.invokeLater(runnable); 
    } 
    } 

    class MyDocumentFilter extends DocumentFilter 
    { 
     @Override 
     public void insertString(DocumentFilter.FilterBypass fp 
       , int offset, String string, AttributeSet aset) 
            throws BadLocationException 
     { 
      int len = string.length(); 
      boolean isValidInteger = true; 

      for (int i = 0; i < len; i++) 
      { 
       if (!Character.isDigit(string.charAt(i))) 
       { 
        isValidInteger = false; 
        break; 
       } 
      } 
      if (isValidInteger) 
       super.insertString(fp, offset, string, aset); 
      else 
       Toolkit.getDefaultToolkit().beep(); 
     } 

     @Override 
     public void replace(DocumentFilter.FilterBypass fp, int offset 
         , int length, String string, AttributeSet aset) 
              throws BadLocationException 
     { 
      int len = string.length(); 
      boolean isValidInteger = true; 

      for (int i = 0; i < len; i++) 
      { 
       if (!Character.isDigit(string.charAt(i))) 
       { 
        isValidInteger = false; 
        break; 
       } 
      } 
      if (isValidInteger) 
       super.replace(fp, offset, length, string, aset); 
      else 
       Toolkit.getDefaultToolkit().beep(); 
     } 
    } 

Ошибки:

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The window is showing on screen. 
    at java.awt.Window.setLocationByPlatform(Unknown Source) 
    at constraints.displayGUI(constraints.java:101) 
    at constraints.access$1(constraints.java:29) 
    at constraints$3.run(constraints.java:116) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$200(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

ответ

2

Вам нужно использовать какой-то диалог, который остановит выполнение кода в точке, где диалог становится видимым.

Посмотрите на How to make dialogs для более подробной информации.

Основной рекомендацией на данном этапе было бы изменить JFrame на JDialog. Убедитесь, что вы сделали его модальным.

обновляется на основе изменений в ОП

Не забудьте сделать диалог модальным!

final JDialog dialog = new JDialog(); 
dialog.setModal(true); 
dialog.setDefaultCloseOperation(
       JDialog.DISPOSE_ON_CLOSE); 

диалоговое окно может быть модальным. Когда модальный диалог отображается, он блокирует вход пользователя во все остальные окна программы. JOptionPane создает JDialogs, которые являются модальными. Чтобы создать немодальный диалог, вы должны напрямую использовать класс JDialog.

От How to make dialogs

Хотя немного более продвинутый, вы посмотрите на How to use modality in dialogs

Обновлено может на основе дополнительного исключения

Путь открытия вы диалог/окно проблематичным. Вероятно, оно создаст окно размером 0x0. Вместо того, чтобы ...

dialog.pack(); 
dialog.setVisible(true); 
dialog.setContentPane(contentPane); 
dialog.setLocationByPlatform(true); 

Попробуйте использовать ...

dialog.setContentPane(contentPane); 
dialog.pack(); 
dialog.setLocationByPlatform(true); 
dialog.setVisible(true); 

После внесения последнего набора изменений кода, то появится диалоговое окно, как и следовало ожидать ...

enter image description here

Вы также можете иметь чтения через Code Conventions for the Java Programming Language

Обновлено ...

Изменить метод displayGUI в constraints от private до public ...

public void displayGUI() { 

Изменить вы «бегун» класс выглядеть как ...

EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     Constraints constraints = new Constraints(); 
     constraints.displayGUI(); 
     System.out.println("Hello world"); 
    } 
}); 

Проблема заключается в том, constraints основной проходящий работу по созданию и показывая UI прочь к Event Диспетчерская Thread (который хорошо и правильно) и немедленно возвращаются, оставив код вызывающего абонента для продолжения работы ...

знал, что цепь вызова собирался поохотиться меня ...

+0

Я действительно не понимаю, как это работает. Я должен удалить мои компоненты поворота и заменить их на JOptionPane ?? @MadProgrammer – user2598911

+0

Вы можете просто изменить свою ссылку на 'JFrame' для' JDialog', убедившись, что вы сделали диалог модальным, как вы это делаете ... – MadProgrammer

+0

Так что я вообще не использую Frame? @MadProgrammer – user2598911

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