Хотите остановить код, пока пользователь не использует кнопку - PullRequest
0 голосов
/ 27 ноября 2018

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

Я видел похожие вопросы илиУчебники, но я не нахожу подходящего решения для моей проблемы.

Как я уже видел, JFrame , ActionListener и ActionEvent имеютдля создания GUI с кнопкой.

Объект, который расширяет JFrame и реализует ActionListener, записывается в методе main.

Проблема в том, что код, написанный в основной метод открывает окно графического интерфейса и продолжает работать.Я просто хочу, чтобы код ждал, пока пользователь нажмет кнопку, а затем продолжит.

Дополнительным решением является написание нужного мне кода в методе actionPerformed , но:

  • Окно графического интерфейса пользователя остается открытым после выбора кнопки
  • Мне нет смысла писать остальную часть кода в методе actionPerformed .

Или написать цикл while, пока не будет нажата кнопка.Должно существовать более разумное решение, которого я не знаю или не понимаю, как это должно работать.

Вот часть кода.

@Override
     public void actionPerformed(ActionEvent e) {
        if(e.getSource() == testStringA) {
            setVariableTo = "testString_a";
            try {
                runMethodWithNewVariable(setVariableTo);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            System.exit(0);
        } else {
            setVariableTo = "project";
            try {
                runMethodWithNewVariable(setVariableTo);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            System.exit(0);
        }
     }

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Вместо JFrame, почему бы вам не использовать JOptionPane (showOptionDialog) с двумя кнопками, например, «строка A» и «проект» вместо «Да» и «Нет»?

JOptionPanes, такие как "Show Option Dialog", по сути блокируются.Если вы поместите один из них в метод main (), выполнение «подождет», пока пользователь не выберет что-то в диалоговом окне, и диалоговое окно вернет индикатор к тому, что было выбрано, прежде чем выполнение в main () продолжится.

0 голосов
/ 27 ноября 2018

В начале вашей программы покажите пользователю модальный JDialog!Вы можете сделать это, используя JOptionPane.show() методы, например:

String[] buttonTexts = {"first","second"}; //create the button texts here

//display a modal dialog with your buttons (stops program until user selects a button)
int userDecision =  JOptionPane.showOptionDialog(null,"title","Select a button!",JOptionPane.DEFAULT_OPTION,JOptionPane.PLAIN_MESSAGE,null,buttonTexts,buttonTexts[0]);

//check what button the user selected: stored in the userDecision
// if its the first (left to right) its 0, if its the second then the value is 1 and so on

if(userDecision == 0){
  //first button was clicked, do something
} else if(userDecision == 1) {
  //second button was clicked, do something
} else {
 //user canceled the dialog
}

//display your main JFrame now, according to user input! 
0 голосов
/ 27 ноября 2018

У вас в основном работают два потока - основной поток и поток GUI.Вы явно не создаете поток GUI, но он есть.

Вы можете использовать несколько методов для синхронизации этих двух потоков.Самым основным является старый добрый synchronized, wait и notify.Что-то Semaphore также может быть использовано.В основном потоке вы создадите графический интерфейс и подождите, пока условие не будет выполнено.В потоке GUI (т.е. actionPerformed) вы бы уведомили.

...