只能一次打开一个JInternalFrame

时间:2013-03-17 13:00:57

标签: java swing jinternalframe jdesktoppane

我创建了一个包含多个JInternalFrame的Swing应用程序,在单击鼠标时会将其添加到JDesktopPane。我想只需要在DesktopPane上显示相同内部框架的一个实例。当用户打开框架时,我不希望同一帧出现两次..

6 个答案:

答案 0 :(得分:2)

问题的简单解决方案是创建HashMap<String,JInternalFrame>key将是JInternalFrame的标题,value将是当前打开的object的{​​{1}}。保存(JInternalframe)第一次打开内部框架时在key,value中配对。禁用所有HashMap窗口的关闭按钮,以便用户无法处置显示的JInternalFrame窗口。向每个JInternalFrame对象注册esc键,以便在按下键盘的JInternalFrame按钮时,esc上的当前显示JInternalFrame最小化。现在当你点击DesktopPane打开相同的内部框架,检查menu itemtitle的{​​{1}}是否存在JInternalFrame HashMap。如果它存在,则检索key的{​​{1}}并通过value变量引用它,然后在key上恢复它。如果JInternalFrame中不存在DesktopPane的相应条目,请创建一个新的title对象,在HashMap中为其创建一个条目并显示它。

  

注意:无论我在这里发布什么,都是针对这种情况的解决方案   你可以有许多类型的JInternalFrame,每个都有唯一的   不同的HasMap,并且您只想保留一个JInternalFrame   每个functionality

答案 1 :(得分:2)

以下是示例代码。希望这个帮助。 在主应用程序中调用内部框架的菜单操作,其中包含JdesktopPane。

 private void YourJinternalFrameMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                                 

    YourJinternalFrame nw = YourJinternalFrame.getInstance();
    nw.pack();
    //usefull part for you.. if open shows, if not creates new one 
    if (nw.isVisible()) {
    } else {
        desktopPane.add(nw);
        nw.setVisible(true);
    }
    try {

        nw.setMaximum(true);
    } catch (PropertyVetoException ex) {
        Logger.getLogger(MainApplication.class.getName()).log(Level.SEVERE, null, ex);
    }
}   

将此内容放入YourJinternalFrame

private static YourJinternalFrame myInstance;

public static YourJinternalFrame getInstance() {
    if (myInstance == null) {
    myInstance = new YourJinternalFrame();
    }
return myInstance;

答案 2 :(得分:1)

试试这个简单的代码:

YourJinternalFrame nw = new YourJinternalFrame();

private void YourJinternalFrameMenuItemActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    if(!nw.isVisible()){
        YourJDesktopPane.add(nw);
        nw.setVisible(true);
    }

}   

答案 3 :(得分:0)

试试这个简单的代码 取类变量chk并设置为0 然后调用jframe方法 的componentRemoved 在这个集chk = 0再次 如果你调用你的内部框架集 chk = 1 并且在调用内部时比较chk它是否为零 多数民众赞成

答案 4 :(得分:0)

我选择了另一种解决方案:

final JInternalFrame[] frames = desktopPane.getAllFrames();

if( !Arrays.asList(frames).contains(loginFrame) ) {
    loginFrame = new LoginFrame();
    desktopPane.add(loginFrame);
    loginFrame.setVisible(true);
}

答案 5 :(得分:0)

这对我有用(检查类名):

final JInternalFrame[] frames = desktopPane.getAllFrames();
LoginFrame loginFrame = new LoginFrame();

if( !Arrays.asList(frames).toString().contains("LoginFrame") ) {
    desktopPane.add(loginFrame);
    loginFrame.setVisible(true);
    loginFrame.validate();
}