关闭JInternalFrame时JButton不会重新启用

时间:2014-03-29 09:52:34

标签: java swing jbutton actionlistener jinternalframe

我使用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编码新手。

2 个答案:

答案 0 :(得分: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 arg。这样您就可以访问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);
    

答案 1 :(得分:0)

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