Это мой первый вопрос о переполнении стека. Я хочу создать метод, который открывает 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;
}
}
Я вполне уверен, что эти проблемы как-то связаны с отсутствием у меня знаний о потоках, и я готов учиться в случае необходимости. Я пока посмотрю, но если бы кто-нибудь мог помочь с этим, это тоже было бы хорошо.