JFrame проблемы - PullRequest
       3

JFrame проблемы

2 голосов
/ 29 мая 2011

Я создаю всплывающее окно JFrame, которое будет содержать сообщение и кнопки «да / нет».Я использую этот метод двумя способами.В 1 основная программа вызывает этот метод, а в другом этот метод вызывается непосредственно после закрытия предыдущего JFrame.Этот метод работает при вызове из главной программы, но когда другой JFrame вызывает его, JFrame, созданный в этом методе, отображается полностью пустым и графический интерфейс пользователя зависает.Я не могу выйти из JFrame, но я могу переместить его.Замораживание является результатом Thread.yield, потому что ответ всегда нулевой, но в каких случаях JFrame не будет создан должным образом?

Примечание: ответ является статической переменной.Также, когда этот JFrame создается другим JFrame, исходный JFrame не завершается корректно.Этот JFrame имеет JComboBox, и выбранная опция замораживается в раскрывающемся списке.Когда он не вызывает этот метод, он закрывается правильно.

public static String confirmPropertyPurchase(String message)
    {
        response = null;
        final JFrame confirmFrame = new JFrame("Confirm");
        confirmFrame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev){
                response = "No";
            }
            public void windowDeactivated(WindowEvent e) {
                confirmFrame.requestFocus();
            }
        });

        final JPanel confirmPanel = new JPanel();
        final JButton yes = new JButton();
        final JButton no = new JButton();
        yes.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                response = "Yes";
                confirmFrame.setVisible(false);
            }
        });
        no.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0){
                response = "No";
                confirmFrame.setVisible(false);
            }
        });

        final JLabel confirmLabel = new JLabel("      " + message);
        yes.setText("Yes");
        yes.setPreferredSize(new Dimension(100, 100));
        no.setText("No");
        no.setPreferredSize(new Dimension(100,100));
        confirmFrame.add(confirmLabel, BorderLayout.CENTER);
        confirmPanel.add(yes);
        confirmPanel.add(no);
        confirmFrame.add(confirmPanel, BorderLayout.AFTER_LAST_LINE);
        confirmFrame.setPreferredSize(new Dimension(520, 175
        ));

        confirmFrame.pack();
        confirmFrame.setVisible(true);

        while(response == null)
        {
            Thread.yield();
        }
        return response;
    }

Ответы [ 2 ]

5 голосов
/ 29 мая 2011

Опять же, вы не должны использовать JFrame в качестве диалога.Фактически весь ваш кусок кода может быть заменен простым JOptionPane.Например,

  Component parent = null;  // non-null if being called by a GUI
  queryString = "Do you want fries with that?";
  int intResponse = JOptionPane.showConfirmDialog(parent, queryString,
           "Confirm", JOptionPane.YES_NO_OPTION);
  myResponse = (intResponse == JOptionPane.YES_OPTION) ? "Yes" : "No";
  System.out.println(myResponse);

И это:

    while(response == null)
    {
        Thread.yield();
    }

никогда не следует вызывать в основном потоке Swing, EDT или потоке диспетчеризации событий.Причина, по которой код работает, когда он работает, заключается в том, что вы вызываете это немного выше EDT, но когда вы вызываете его на EDT, он замораживает EDT и, следовательно, весь графический интерфейс.Просто не делай этого.

3 голосов
/ 29 мая 2011

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

Не пытайтесь создать свой собственный диалог из JFrame - используйте JOptionPane или JDialog, которые предназначены для внутренней обработки этой ситуации для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...