【问题标题】:JButton not re-enabling upon closing JInternalFrame关闭 JInternalFrame 后 JButton 未重新启用
【发布时间】:2014-03-29 09:52:34
【问题描述】:

我用一个 JDesktopPane 和几个 JButton 制作了一个简单的用户界面。该程序的工作原理是,当单击按钮时,会加载 JInternalFrame 并且禁用该按钮以防止创建内部框架的副本。 JInternalFrame 上的 Cancel 按钮关闭框架并再次启用 JButton。我的代码如下:

adminAddUser addNew = new adminAddUser();
private javax.swing.JButton newUserButton;

private void newUserButtonActionPerformed(java.awt.event.ActionEvent evt)
{                                              
    AdminPane.add(addNew);
    addNew.setVisible(true);
    newUserButton.setEnabled(false);
}   

adminAddUser 类上取消按钮的动作监听器。 dispose() 方法用于关闭 JInternalFrame。

private void cancelActionPerformed(java.awt.event.ActionEvent evt) {                                      
    int option;

    option = JOptionPane.showConfirmDialog(rootPane, "Cancel?", "", JOptionPane.YES_NO_OPTION);

    switch(option)
    {
        case (JOptionPane.YES_OPTION):
            dispose();
            break;

        case (JOptionPane.NO_OPTION):
            break;

        default:
            break;
    }
}                        

最后,我在内部框架关闭时重新启用 JButton 的处理代码。

private void AdminPaneComponentRemoved(java.awt.event.ContainerEvent evt) {                                           
    if(evt.getChild() == addNew)
    {
        newUserButton.setEnabled(true);
    }
}      

当单击 JInternalFrame 上的默认关闭按钮时,该按钮重新启用正常,但取消按钮工作一次,并且在尝试第二次使用它时,JInternalFrame 关闭,但 JButton 不会重新启用。如何重新启用它?

任何帮助将不胜感激,因为我是 Java 的 GUI 编码新手。

【问题讨论】:

  • 你为什么这么频繁地使用选项面板?自己创建对话框。

标签: java swing jbutton actionlistener jinternalframe


【解决方案1】:

这是一个可能的解决方案。

  • 创建一个interface(我只这样做,因为没有公开主要的JFrame)。让JFrame 表单类实现它。它只有 一个 方法,getNewUserButtont();

    public interface GetButtonInterface {
        JButton getUserButton();
    } 
    
    public NewJFrame extends JFrame implements GetButtonInterface {
        private JButton newUserButton;
    
        @Override
        JButton getUserButton() {
            return newUserButton;
        }
    }
    
  • 然后在您的JInternaFrame 类中,它应该在构造函数中使用GetButtonInterface 参数。这样您就可以访问newUserButton

    public AdminAddUser extends JInternalFrame {
        private JButton newUserButton;
    
        public AdminAddUser(GetButtonInterface gbi) {
            newUserButton = gbi.getUserButton();
        }
    }
    
  • 现在你可以用那个按钮做你想做的事了。每个新的AdminAddUser 都将使用newUserButton 的相同实例。所以你可以 1. 使用InternalFrameListener 并覆盖internalFrameClosing() 以在窗口关闭时启用按钮。 2. 使用cancelButtonActionPerrfomed的按钮

    public AdminAddUser extends JInternalFrame {
        private JButton newUserButton;
    
        public AdminAddUser(GetButtonInterface gbi) {
            newUserButton = gbi.getUserButton();
    
            addInternalFrameListener(new InternalFrameAdapter(){
                @Override
                public void internalFrameClosing(InternalFrameEvent e) {
                    newUserButton.setEnabled(true);
                }
            });
        }
    
        private void cancelButtonActionPerformed(ActionEvent e) {
            dispose();
            newUserButton.setEnabled(true);
        }
    } 
    
  • 当你实例化一个新的AdminAddUser 时,使用传递NewJFrame.this 给它。这是GetButtonInterface的一个实例

    AdminAddUser addNew = new AdminAddUser(NewJFrame.this);
    

【讨论】:

    【解决方案2】:

    我不明白。在我看来,adminAddUser 只创建一次。在这种情况下,您不应使用dispose,因为该对象将被销毁且无法重用。

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2021-05-18
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多