Метод, который возвращает строку из JFrame, которая открывается из другого запускаемого файла JFrame - PullRequest
0 голосов
/ 07 сентября 2018

Это мой первый вопрос о переполнении стека. Я хочу создать метод, который открывает JFrame с JLable (приглашение пользователя), JTextFeild (ввод пользователя) и JButton (кнопка ввода). Кнопка Enter должна закрыть JFrame, а также сообщить методу, что метод, введенный пользователем в JTextField, должен вернуть метод. Я имел успех, заставляя эту концепцию работать в первом контексте, но всякий раз, когда я пытаюсь запустить этот метод из другого JFrame (Второй контекст), он не загружает ни одну из кнопок и застревает в цикле while в конце кода. Также предположим, что у меня есть все правильные операции импорта, чтобы этот код мог работать.
Первый контекст:

public class Main {

public static void main(String[] args) {
    System.out.println(getUserInput("Test", "What is the airspeed velocity of an unladen swallow?", "this is some text"));
}
public static String getUserInput(String title, String prompt, String line) {
    JFrame inputFrame = new JFrame(title);
    JPanel inputPanel = new JPanel();
    JLabel inputPrompt = new JLabel(prompt);
    JTextField inputTextField = new JTextField(line, 30);
    JButton enter = new JButton("Enter");
    String input = "foo";

    inputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    inputFrame.setBounds(screenSize.width /2 - 200, screenSize.height/2 - 100, 400, 200);
    inputFrame.setVisible(true);
    inputFrame.add(inputPanel);
    inputPanel.add(inputPrompt);
    inputPanel.add(inputTextField);

    inputPanel.add(enter);
    enter.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                System.out.println("button pressed");
                inputFrame.setVisible(false);

            } catch (Exception e2) {

            }
        }
    });
    while(inputFrame.isVisible() == true) {
        input = inputTextField.getText();
    }
    return input;
}

Второй контекст:

public class GUI extends JFrame implements ActionListener {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());;
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GUI frame = new GUI();

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                frame.setBounds(screenSize.width /2 - windowWidth /2, screenSize.height / 2 - windowHeight/2, windowWidth, windowHeight);
                frame.setTitle("Start Window");


                JPanel contentPane = (JPanel)frame.getContentPane();
                JButton openUI = new JButton("Open user input panel");
                String userInputStoredAsString = "";

                frame.add(contentPane);
                contentPane.add(openUI);

                openUI.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        userInputStoredAsString = getUserInput("UserInputWindow", "Type some text below", "text here");
                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
    public static String getUserInput(String title, String prompt, String line) {
    JFrame inputFrame = new JFrame(title);
    JPanel inputPanel = new JPanel();
    JLabel inputPrompt = new JLabel(prompt);
    JTextField inputTextField = new JTextField(line, 30);
    JButton enter = new JButton("Enter");
    String input = "foo";

    inputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    inputFrame.setBounds(screenSize.width /2 - 200, screenSize.height/2 - 100, 400, 200);
    inputFrame.setVisible(true);
    inputFrame.add(inputPanel);
    inputPanel.add(inputPrompt);
    inputPanel.add(inputTextField);

    inputPanel.add(enter);
    enter.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                System.out.println("button pressed");
                inputFrame.setVisible(false);

            } catch (Exception e2) {

            }
        }
    });
    while(inputFrame.isVisible() == true) {
        input = inputTextField.getText();
    }
    return input;
}

}

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

...