JAVA: как установить строковое значение, которое будет возвращаться при нажатии кнопки?

#java #swing

#java #swing

Вопрос:

Когда я вызываю Main.main(null) из другого файла .java,
return_str = "Not assigned!"; возвращается main(), прежде чем пользователь сможет нажать кнопку «Student» и return_str = "student sign-in"; выполняется.

 
public class Main extends JFrame {

    private static JPanel contentPane;
    static Main frame;
    static String return_str;
    static JButton btnStudent = new JButton("Student");

    /**
     * Launch the application.
     */

    public static String main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frame = new Main();
                    frame.setVisible(true);

                    btnStudent.addActionListener(new Action_student());
                    contentPane.add(btnStudent);
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        return_str = "Not assigned!";
        System.out.println(return_str);
        return return_str;
    }

    /**
     * Create the frame.
     */
    public Main() {
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        
        btnStudent.setFont(new Font("Times New Roman", Font.PLAIN, 16));
        btnStudent.setBounds(171, 148, 85, 21);
        contentPane.add(btnStudent);
        
    }
    
    static class Action_student implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            return_str = "student sign-in";
        }
        
    }
    
}
  

Комментарии:

1. Не связанные: узнайте о соглашениях об именовании java. Имена классов идут в случайном порядке, поэтому оно должно быть ActionStudent или даже лучше: вы бы просто использовали для этого лямбда-выражение, вместо того, чтобы создавать внутренний класс, как вы это делали.

Ответ №1:

Как уже указано в методе, создание фрейма «вызывается позже», что означает в другом потоке. Итак, вы должны позволить своей основной подпрограмме дождаться нажатия кнопки.

Добавьте новую переменную в основной класс:

 static boolean studentEntered = false;
  

В прослушивателе действий для флага studentEntered устанавливается значение true:

 static class Action_student implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        return_str = "student sign-in";
        Main.studentEntered = true;
    }
}
  

В основном методе вы меняете свои последние строки на:

 return_str = "Not assigned!";
while (!studentEntered) {
    // loop as long as the flag is not switched
}
System.out.println(return_str);
try {
    return return_str;
} finally {
    // close the frame by the application otherwise your application will not stop
    frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
  

Комментарии:

1. Спасибо! Это помогло. Но единственная проблема сейчас заключается в том, что когда я возвращаю значение return_str, оно не присваивается str_send . Я вызываю это так …str_send = Main.main(null);

2. System.out.println(return_str); Выводит ли правильное значение?

Ответ №2:

Проблема в том, как работает слушатель!

Когда вы создаете свою кнопку, вы назначаете ей прослушиватель, это означает, что ТОЛЬКО при нажатии кнопки ваша строка изменится!

Вывод правильный, потому что после создания прослушивателя он выполняет остальную часть кода, в вашем случае

 return_str = "Not assigned!";
System.out.println(return_str);
  

Вы должны изменить способ возврата строки.