当前位置: 首页 > 知识库问答 >
问题:

dispose()之后未反映JDialog的更新状态

薛利
2023-03-14

我创建了一个自定义的JDialog,其中有一些处于内部状态,我想在JDialog关闭后在父JFrame中查询这些状态。我将JDialog的模态设置为“true”,这会阻止JFrame,直到JDialog被释放。

在JDialog中,我更新状态并使用用户交互调用dispose。我验证状态是否已更新。但是,当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();
    }                
}

}

共有1个答案

单耘豪
2023-03-14

LogInDialoginit方法中,在调用setVisible后,将\u success设置为false。。。

this.setVisible(true);  

this._success = false;

这意味着对话框关闭后,\u success将设置为false:/

 类似资料:
  • 问题内容: 在这里,我尝试设置为’hello’,然后打印它,但是状态似乎为空。当我刚刚使用更新状态时怎么办?设置为全局变量。 问题答案: 从reactjs文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。 https://facebook.github.io/react/docs/component- api.html 您可以做的是将状态更新后传递给回调函数:

  • 问题内容: 在对话框上使用setVisible(false)并在以后重用它是否有意义,还是每次调用dispose()并创建新的JDialog更为安全。用setVisible(false)处理内存泄漏怎么办? 编辑:我的问题不是关于退出应用程序。有关以主框架为父框架并在应用程序生命周期中打开和关闭的对话框的更多信息。例如,假设我的应用程序大约有10个对话框,这些对话框每次打开时都会显示不同的数据。我

  • 我正在尝试新的hooks功能,并坚持认为我的状态没有更新。 实际上,状态已更新(我可以在console.log中看到更新的值,并且我的组件会重新运行useEffect),但是useEffect方法使用我的旧状态,并仅将签名保存给第一个用户,而活动用户在状态中确实发生了更改。 我想过添加useCallback,并将我的方法移动到use效果或组件本身,但我可以设法让它工作。 状态: 这是我的效果: 这

  • 问题内容: 我必须查询数据库以获取要写入的数据并加速打开对话框 我没有创建任何文本,并在完成处理后设置了文本 但是文字没有更新 有什么办法可以做到这一点 这是我对话框的src代码: 问题答案: 为了使您能够进行后台工作,您需要调用方法。如果您不添加它,那么…它将不知道何时开始工作。就像其他任何变量一样: 但是,如果您从未将其添加到任何内容(或未添加到),则将永远不会添加/执行该内容。 在构造函数内

  • 编辑:这是在添加到购物车按钮onclick事件时执行的函数: addToCart action creator如下所示:

  • 我创建了一个TableView,并为每个TableColumn注册了属性。内部数据的编辑可以很好地反映在TableView中。 然而,对于ListView,情况就不同了。除非我关闭框架并再次打开它,否则更改不会立即显示。