Я создал пользовательский JDialog, у которого есть некоторые во внутреннем состоянии, которые я хочу запросить в родительском JFrame после закрытия JDialog. Я установил модальность JDialog на «true», которая блокирует JFrame до тех пор, пока JDialog не будет удален.
В JDialog я обновляю состояние, и утилита вызывается с помощью взаимодействия с пользователем. Я проверяю, что состояние обновлено. Однако, когда родительский фрейм возобновляет работу после закрытия JDialog, запрашиваемое мной состояние не соответствует состоянию, в котором я установил JDialog. Я не уверен, что я делаю не так здесь. Любая помощь приветствуется.
Вот снимок моего кода:
открытый класс IndexFrame расширяет JFrame {
private static final long serialVersionUID = 9084040250695639818L;
private JMenu _filemenu;
private JMenuBar _menubar;
public IndexFrame() {
super("Index");
init();
}
private boolean init() {
this._new_filemenu_item = new JMenuItem("New");
this._open_filemenu_item = new JMenuItem("Open");
FileMenuOpenActionListener open_filemenu_actionlistener = new FileMenuOpenActionListener(this);
this._open_filemenu_item.addActionListener(open_filemenu_actionlistener);
this._close_filemenu_item = new JMenuItem("Close");
FileMenuCloseActionListener close_filemenu_actionlistener = new FileMenuCloseActionListener(this);
this._close_filemenu_item.addActionListener(close_filemenu_actionlistener);
this._exit_filemenu_item = new JMenuItem("Exit");
CloseButtonActionListener exit_filemenu_actionlistener = new CloseButtonActionListener(this);
this._exit_filemenu_item.addActionListener(exit_filemenu_actionlistener);
this._filemenu = new JMenu("File");
this._filemenu.add(this._new_filemenu_item);
this._filemenu.add(this._open_filemenu_item);
this._filemenu.add(this._close_filemenu_item);
this._filemenu.add(this._exit_filemenu_item);
this._menubar = new JMenuBar();
this._menubar.add(this._filemenu);
this.setJMenuBar(this._menubar);
this.pack();
this.setVisible(true);
return true;
}
}
открытый класс FileMenuOpenActionListener реализует ActionListener {
private IndexFrame _frame;
public FileMenuOpenActionListener(IndexFrame frame) {
this._frame = frame;
}
@Override
public void actionPerformed(ActionEvent arg0) {
File file;
JFileChooser fc;
LogInDialog ld;
fc = new JFileChooser();
if (fc.showOpenDialog(this._frame) == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile();
ld = new LogInDialog(this._frame);
if (ld.isSuccess()) {
this._frame.refresh();
}
}
else {
}
}
}
открытый класс LogInDialog расширяет JDialog {
private JFrame _paraentframe;
private JLabel _userlabel;
private JTextField _userfield;
private JPanel _userpanel;
private JLabel _pwdlabel;
private JPasswordField _pwdfield;
private JPanel _pwdpanel;
private JPanel _inputpanel;
private JButton _loginbutton;
private JButton _cancelbutton;
private JPanel _buttonpanel;
private JPanel _dialogpanel;
private boolean _success;
public LogInDialog(JFrame pf) {
super(pf, "Log In", true);
this._paraentframe = pf;
init();
}
private boolean init() {
this._userlabel = new JLabel("Username");
this._userfield = new JTextField(20);
this._userpanel = new JPanel();
this._userpanel.add(this._userlabel);
this._userpanel.add(this._userfield);
this._pwdlabel = new JLabel("Password");
this._pwdfield = new JPasswordField(20);
this._pwdpanel = new JPanel();
this._pwdpanel.add(this._pwdlabel);
this._pwdpanel.add(this._pwdfield);
this._inputpanel = new JPanel();
this._inputpanel.add(this._userpanel);
this._inputpanel.add(this._pwdpanel);
this._loginbutton = new JButton("Log In");
LogInDialogLogInButtonActionListener loginbuttonlistener = new LogInDialogLogInButtonActionListener(this);
this._loginbutton.addActionListener(loginbuttonlistener);
this._cancelbutton = new JButton("Cancel");
CloseButtonActionListener cancelbuttonlistener = new CloseButtonActionListener(this);
this._cancelbutton.addActionListener(cancelbuttonlistener);
this._buttonpanel = new JPanel();
this._buttonpanel.add(this._loginbutton);
this._buttonpanel.add(this._cancelbutton);
this._dialogpanel = new JPanel();
this._dialogpanel.setLayout(new BorderLayout());
this._dialogpanel.add(this._inputpanel, BorderLayout.CENTER);
this._dialogpanel.add(this._buttonpanel, BorderLayout.SOUTH);
this.setContentPane(this._dialogpanel);
this.pack();
this.setVisible(true);
this._success = false;
return true;
}
public boolean isSuccess() {
return this._success;
}
public void setSuccess(boolean s) {
this._success = s;
}
public String getUserName() {
return this._userfield.getText();
}
public String getPassWord() {
return String.valueOf(this._pwdfield.getPassword());
}
}
открытый класс LogInDialogLogInButtonActionListener реализует ActionListener {
private LogInDialog _dialog;
public LogInDialogLogInButtonActionListener(LogInDialog dialog) {
this._dialog = dialog;
}
@Override
public void actionPerformed(ActionEvent arg0) {
String username;
String password;
username = this._dialog.getUserName();
password = this._dialog.getPassWord();
if (true) {
this._dialog.setSuccess(true);
this._dialog.dispose();
}
}
}