【问题标题】:How to close previous jInternalFrame when open new jInternalFrame in the jDesktopPane在 jDesktopPane 中打开新的 jInternalFrame 时如何关闭以前的 jInternalFrame
【发布时间】:2012-11-29 07:02:00
【问题描述】:

我在java 中使用netbeans 创建了MDI(多文档界面),其中我有两个jbuttons 和一个jdesktoppane,所以当单击这两个按钮时,两个jinternalframes 都会在同一个jdesktoppane 中打开,所以我想如何@ 987654325@ 当open new jinternalframejdesktoppane 中?

检查快照以更好地了解我的问题我想要什么...

第一个 jButton 代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
      try
      {

       tst t = new tst();
        JInternalFrame internalFrame1 = new JInternalFrame("Test Window1"); 
        internalFrame1.add(t.getContentPane());
        internalFrame1.pack();

        internalFrame1.setVisible(true);
        q.add(internalFrame1);

        internalFrame1.setClosable(true);  

        BasicInternalFrameUI ui = (BasicInternalFrameUI)internalFrame1.getUI();
        Container north = (Container)ui.getNorthPane();
        north.remove(0);
        north.validate();
        north.repaint();

        for(MouseListener listener : ((javax.swing.plaf.basic.BasicInternalFrameUI) internalFrame1.getUI()).getNorthPane().getMouseListeners()){
        ((javax.swing.plaf.basic.BasicInternalFrameUI) internalFrame1.getUI()).getNorthPane().removeMouseListener(listener);
        }

         internalFrame1.setSelected(true);

      }
      catch(Exception ex)
      {
          JOptionPane.showMessageDialog(null, ex);
      }
    }   

第二个按钮代码:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try
        {

        zxy z = new zxy();
        JInternalFrame internalFrame = new JInternalFrame("Test Window2"); 
        internalFrame.add(z.getContentPane());
        internalFrame.pack();
        internalFrame.setSize(570,420);

        internalFrame.setVisible(true);
        q.add(internalFrame);

        internalFrame.setClosable(true);  

        BasicInternalFrameUI ui = (BasicInternalFrameUI)internalFrame.getUI();
        Container north = (Container)ui.getNorthPane();
        north.remove(0);
        north.validate();
        north.repaint();

        for(MouseListener listener : ((javax.swing.plaf.basic.BasicInternalFrameUI) internalFrame.getUI()).getNorthPane().getMouseListeners()){
        ((javax.swing.plaf.basic.BasicInternalFrameUI) internalFrame.getUI()).getNorthPane().removeMouseListener(listener);
        }

         internalFrame.setSelected(true);

        }
      catch(Exception ex)
      {
          JOptionPane.showMessageDialog(null, ex);
      }
    } 

【问题讨论】:

    标签: java swing netbeans-7 jinternalframe jdesktoppane


    【解决方案1】:

    试试这个。

    将此添加到您的 JButton 事件中:

    JDesktopPane.removeAll();
    JDesktopPane.updateUI();
    
    //then add the JInternalFrame into the JDesktopPane

    我知道,我知道,这个问题是 2 年前的问题,但希望这对其他人有帮助:)

    【讨论】:

      【解决方案2】:

      只需在 JInternalFrame 实例上调用 dispose()

      为此,您需要将您的 JInternalFrame 声明移出方法,以便我们可以检查该实例是否不是 null(因此存在一个现有实例,然后在该实例上调用 dispose()创建一个新的:

      JInternalFrame internalFrame1;
      
      private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            try
            {
      
             if(internalFrame1 !=null) {//make sure its not null
                 internalFrame1.dispose();//close the previos internalframe
             }
      
              tst t = new tst();
              internalFrame1 = new JInternalFrame("Test Window1"); //create new instance of internal frame
              internalFrame1.add(t.getContentPane());
              internalFrame1.pack();
      
              internalFrame1.setVisible(true);
              q.add(internalFrame1);
      
              internalFrame1.setClosable(true);  
      
              BasicInternalFrameUI ui = (BasicInternalFrameUI)internalFrame1.getUI();
              Container north = (Container)ui.getNorthPane();
              north.remove(0);
              north.validate();
              north.repaint();
      
              for(MouseListener listener : ((javax.swing.plaf.basic.BasicInternalFrameUI) internalFrame1.getUI()).getNorthPane().getMouseListeners()){
              ((javax.swing.plaf.basic.BasicInternalFrameUI) internalFrame1.getUI()).getNorthPane().removeMouseListener(listener);
              }
      
               internalFrame1.setSelected(true);
      
            }
            catch(Exception ex)
            {
                JOptionPane.showMessageDialog(null, ex);
            }
          }   
      

      【讨论】:

      • 感谢您的帮助,它不适合我可能是我犯了错误....我添加了简单的 dispose();在 JInternalFrame 和上面的 jInternaleframe1 代码之后,当按下按钮 2 时,它关闭整个应用程序,而按钮 1 也不起作用代码......
      • @AyazAli 我不确定是否请发布 SSCCE,但请记住我们只想在 JInternalFrame 实例上调用 dispose,而不是其他任何东西。复制和粘贴我的一键代码是否有效?
      • 感谢您的回复...我发现了我的错误,现在代码正在为我工​​作,并且此代码仅适用于相同的 jinternaleframe 处理......现在你能帮我吗?也就是说,如果 jinternalframe 1 是打开的,那么我将打开 jinternalframe 2,因此 jinternalfamre 1 会自动关闭,并且只有 jinternalframe 2 在 jdesktopane 中打开......
      • @AyazAli 你会对其他按钮执行与此按钮相同的操作,而不是在 jinternalframe1 创建按钮中,只需像上面的代码一样添加调用来处理 jinternalframe1
      • 我在两个按钮之后都做了 jinternalframe 1 和 jinternalframe 2 重复打开停止但是当我点击按钮 1 时它打开 jinternalframe 1 并且当我点击按钮 2 它打开 jinternalframe 2 所以两个 ijinternalframes打开将在桌面窗格中打开,当我单击一个按钮 1 打开其打开的 jinternalframe 1 时,当我单击按钮 2 时,它打开 jinternalframe 2 然后自动关闭 jinternalframe 1 ......那么该怎么做呢?跨度>
      猜你喜欢
      • 2011-11-21
      • 2013-08-28
      • 2011-06-03
      • 2014-12-14
      • 2011-10-15
      • 2012-04-20
      • 2011-12-29
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多