0

我创建了一个带有多个 JInternalFrames 的 Swing 应用程序,当鼠标单击时,这些 JInternalFrames 会被添加到 JDesktopPane 中。我只希望 DesktopPane 上出现相同内部框架的一个实例。当用户打开框架时,我不希望同一个框架出现两次..

4

6 回答 6

2

解决您的问题的简单方法是创建一个HashMap<String,JInternalFrame>. 将是key它的标题,JInternalFrame也是当前打开的那个。当第一次打开内部框架时,保存( ) 对。禁用所有窗口的关闭按钮,使用户无法处理显示的窗口。将键注册到每个对象,以便当按下键盘按钮时,当前显示在 .Now上最小化。现在当您单击打开相同的内部框架时,检查 是否存在于其中。如果存在,则检索该valueobjectJInternalframekey,valueHashMapJInternalFrameJInternalFrameescJInternalFrameescJInternalFrameDesktopPanemenu itemtitleJInternalFrameHashMapkeyvaluekey并通过变量引用它JInternalFrame,然后在DesktopPane. 如果titlethat 中不存在对应的条目,则HashMap创建一个新JInternalFrame对象,在 中为相同的条目创建HasMap并显示它。

注意:我在此处发布的任何内容都是针对以下情况的解决方案:您可以拥有多种类型,JInternalFrame每种类型都具有独特的不同functionality,并且您只想保留其中instance的一种JInternalFrame

于 2013-03-17T13:25:47.307 回答
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;
于 2013-03-24T16:37:51.157 回答
1

试试这个简单的代码:

YourJinternalFrame nw = new YourJinternalFrame();

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

}   
于 2013-04-02T21:17:36.667 回答
0

试试这个简单的代码,将类变量 chk 设置为 0,然后调用 jframe 方法 componentremoved 在这个 set chk =0 再次,如果你调用你的内部框架 set chk =1 并在调用 internal 时比较 chk 无论它是零还是不是全部

于 2013-07-19T03:17:45.633 回答
0

我寻求了不同的解决方案:

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

if( !Arrays.asList(frames).contains(loginFrame) ) {
    loginFrame = new LoginFrame();
    desktopPane.add(loginFrame);
    loginFrame.setVisible(true);
}
于 2018-05-18T04:03:57.703 回答
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();
}
于 2021-06-04T00:06:29.723 回答