Пока форма работает, другие команды выполняются - PullRequest
2 голосов
/ 13 ноября 2010

я пишу метод для создания формы, затем некоторые другие команды после этого в main. (Java)

package pak2;
import javax.swing.*;

public class form6 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

          JFrame jframe = new JFrame();

          JButton jButton = new JButton("JButton");

          jframe.getContentPane().add(jButton);

          jframe.pack();
          jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          jframe.setVisible(true);

            System.out.println("test***ok");//testtttttttttttttt


    }
}

я хочу выполнить "System.out.println (" test *** ok ");" после этого формы закрываются. но когда я запускаю программу, прежде чем ввести информацию в форму, выполняются другие команды! Пока форма работает, другие команды выполняются! как я могу установить его.

Ответы [ 4 ]

1 голос
/ 09 декабря 2010

Есть две важные вещи, которые вы должны знать о Swing и Frames, прежде чем продолжить:

  1. Создание компонентов и вызов методов на компонентах должно всегда выполняться в потоке диспетчеризации событий (EDT). В этой статье объясняется принцип однопоточного правила в Swing. Обратите внимание, что это правило также относится к основному потоку. Используйте SwingUtilities.invokeLater и SwingUtilities.invokeAndWait, чтобы сделать это правильно.
  2. JFrame s являются независимыми элементами. Создание одного видимого не заблокирует вызывающий поток. Однако, если это то, что вы хотите сделать, используйте JDialog. Диалоги предназначены для блокировки и ожидания ввода пользователя, и , если вы создаете модальное диалоговое окно , его отображение будет блокировать вызывающий поток (а если вы установите родительский Frame или Dialog, то вы может заставить его остаться на вершине тоже). Хорошим примером этого является JOptionPane (попробуйте!) Кроме этого, и тот факт, что JDialog расширяет Dialog вместо Frame, он практически идентичен, и вы можете добавить любые элементы, которые вы хотите базовый диалог.

Пример кода:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            // The boolean parameter 'modal' makes this dialog block.
            JDialog d = new JDialog((Frame) null, true);
            d.add(new JLabel("This is my test dialog."));
            d.setLocationRelativeTo(null);
            d.pack();

            System.out.println("Dialog is opening...");
            d.setVisible(true);
            System.out.println("Dialog is closed.");
            System.exit(0);
        }
    });
}

Надеюсь, это ответит на ваш вопрос. :)

1 голос
/ 13 ноября 2010

Вы идете по этому поводу неправильно.

Вот пример с комментариями:

public class Form2  {

    public static void main(String[] args) {

        final JFrame jframe = new JFrame();

        final JButton jButton = new JButton("JButton");

        /**
         * Once you create a JFrame, the frame will "listen" for events.
         * If you want to do something when the user clicks a button for example
         * you need to add an action listener (an object that implements ActionListener)
         * 
         * One way of doing this is by using an anonymous inner class:
         */
        jButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource().equals(jButton)){
                    jframe.dispose();
                    System.out.println("Button clicked!");
                }

            }
        });

        jframe.getContentPane().add(jButton);
        jframe.pack();
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // displaying the form will NOT block execution
        jframe.setVisible(true);
        System.out.println("test***ok");// testtttttttttttttt
    }
}
0 голосов
/ 13 ноября 2010

Я не уверен, какова реализация вашей формы, но она вам понадобится, чтобы заблокировать ввод, если вы не хотите, чтобы позже код выполнялся сразу после этого, возможно, с использованием Scanner?

0 голосов
/ 13 ноября 2010

В вашем коде main () функция является вызывающей функцией, а form6 () является вызываемой функцией. После вызова функции form6 () из функции main () она возвращается к функции main (). Помните, что элемент управления всегда возвращается к вызывающей функции после выполнения вызываемой функции.

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