Я попытался создать небольшой JDialog в виде всплывающего окна для запроса у пользователя двух значений: ширины и высоты. После многих настроек я подумал, что смогу получить эти значения при удалении диалога, используя метод windowClosed оконного адаптера для передачи этих значений объекту вместе с информацией о том, что диалог закрылся как логическое значение. Основной метод просто инициализирует диалог и ждет, пока он сигнализирует о выходе. Я могу проверить, что метод windowClosed был выполнен, но, похоже, он все еще не завершает мой цикл while, ожидая, пока логическое значение объектов изменится на false. Спасибо за помощь заранее.
Из кода были удалены элементы форматирования диалога и импорта.
//dialogSubstitute.java
public class ResizeDialogSubstitute {
// I cant code plz help me, slopy solution for returning from a dialog ):
int Width, Height;
void SetWidth(int width){Width=width;}
void SetHeight(int height){Height=height;}
boolean stillrunning = true;
ResizeDialogSubstitute(){
Width=0;
Height=0;
}
}
// test.java
public class test {
String NewWidth,NewHeight; //Terrible way of returning from a function
public static void main(String[] args) {
ResizeDialogSubstitute uwudaddy = new ResizeDialogSubstitute();
ResizeDialog dialog = new ResizeDialog(100,100, uwudaddy);
dialog.setVisible(true);
while(uwudaddy.stillrunning);
System.out.println(uwudaddy.Height);
System.out.println(uwudaddy.Width);
}
}
// ResizeDialog.java
public class ResizeDialog extends JDialog
{
JTextArea x,y;
ResizeDialogSubstitute uwudaddy;
ResizeDialog(int widthNow, int heightNow, ResizeDialogSubstitute UwuDaddy)
{
uwudaddy=UwuDaddy;
this.setSize(300, 200);
this.setTitle("Resize");
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JLabel label1= new JLabel("Define new Imagesize");
this.add(label1,c);
JLabel label2= new JLabel("Width:");
this.add(label2,c);
x = new JTextArea(Integer.toString(widthNow));
this.add(x,c);
JLabel label3 = new JLabel("Height:");
this.add(label3,c);
y = new JTextArea(Integer.toString(heightNow));
this.add(y,c);
this.addWindowListener(new WindowAdapter()
{
public void windowClosed(WindowEvent e)
{
System.out.println("At least I gotr so far");
//Tell Parent the result of the request, plz kill me
uwudaddy.SetHeight(Integer.parseInt(GetNewHeight()));
uwudaddy.SetWidth(Integer.parseInt(GetNewWidth()));
uwudaddy.stillrunning=false;
}
public void windowClosing(WindowEvent e)
{
}
});
}
String GetNewWidth(){
return x.getText();
}
String GetNewHeight(){
return y.getText();
}
}




Ваша обработка диалогов имеет свои недостатки. Но вы можете пойти совершенно другим путем:
Создайте подкласс JPanel и добавьте свои метки, поля, кнопки — все, что вам нужно. Если хотите, вы можете использовать конструктор пользовательского интерфейса. Добавьте методы получения/установки для интересующих вас полей.
Создайте экземпляр этой настраиваемой панели и используйте установщики для заполнения полей. Затем используйте JOptionPane.showOptionDialog, чтобы отобразить панель (передайте ее как сообщение). Я предпочитаю иметь OK_CANCEL_OPTION для обычных диалогов.
После возврата showOptionDialog проверьте код возврата. Если это OK_OPTION, используйте геттеры панели для доступа к пользовательскому вводу.
Вот код выше:
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class MyPanel extends JPanel {
private final JTextField txtUser;
public MyPanel() {
add(new JLabel("User"));
txtUser = new JTextField();
add(txtUser);
}
public String getUser() {
return txtUser.getText();
}
public void setUser(String user) {
txtUser.setText(user);
}
public static void main(String[] args) {
MyPanel mp = new MyPanel();
mp.setUser("DefaultUser");
if (JOptionPane.showOptionDialog(
null, mp, "Input User", JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, null, null) == JOptionPane.OK_OPTION) {
System.out.println("User entered: " + mp.getUser());
}
}
}
Одним из преимуществ является то, что этот шаблон позволяет повторно использовать пользовательскую панель при создании и редактировании. Это работает и в других ситуациях. Представьте, что пользователь вышел из приложения, но данные не сохранились. Тогда вы можете сделать
switch(JOptionPane.showConfirmDialog(null, "Do you want to save your data?") {
case YES_OPTION:
doSave();
System.exit(0);
case NO_OPTION:
System.exit(0);
case CANCEL_OPTION:
// do nothing, assuming the main window will not exit
}
«Ваша обработка диалогов имеет свои недостатки». Никакого апострофа.
Спасибо, это действительно кажется лучшим подходом. Если бы я только знал, что JOptionsPanes существует, это сэкономило бы мне много времени.
Я не уверен, что именно вы хотите, но я вижу 2 варианта: 1: сделать диалог модальным, прежде чем сделать его видимым. Он заблокирует текущий поток в окне, тогда вам не нужны никакие циклы, просто позаботьтесь о слушателях в полях.