2012-12-11 47 views
2

我已經創建和應用,其中的標籤被打開的打開的JInternalFrame有標題爲選項卡窗格1選項卡窗格2兩個標籤。在一個標籤主體Tabbedpane 1包含一個JInternalFrame其中有一個搜索按鈕。點擊該按鈕後,主JInternalFrame內將打開另一個JInternalFrame關閉正在另一個的JInternalFrame內同時改變的JTabbedPane中

誰能告訴我如何關閉上述開口了JInternalFrame即搜索JInternalFrame而點擊標題爲第二個選項卡的TabbedPane 2

我的財產變化試圖.setClosed(true).setVisible(true)還是它nt爲我工作。

+1

請在這裏發表您的代碼應該是短期和可運行/ compliable( [SSCCE](http://sscce.org))。 –

回答

3

使用ChangeListenerJTabbedPane狀態變化(即標籤交換),這將得到通知:

final JTabbedPane tabbedPane = new JTabbedPane(); 

tabbedPane.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent e) { 
     //tab has been changed 
    } 
}); 

的問題是,我們需要一種方法來監測前一個標籤,即我們是在它之前的標籤

tabbedPane.addChangeListener(new ChangeListener() { 
    int prev_index = 0; 
    int curr_index = 0; 

    public void stateChanged(ChangeEvent e) { 
     prev_index = curr_index; 
     curr_index = tabbedPane.getSelectedIndex(); 

     System.out.println("Tab (Current): " + curr_index); 
     System.out.println("Tab (Previous): " + prev_index); 
    } 
}); 

更新1:改變了這種可以通過做

要關閉JInternalFrame我建議在它的實例調用dispose()

更新2:

這是你的固定代碼,基本上都添加了一個getter方法Search類,從而JIFrame1getSearch()方法,使我們能夠GAIM訪問在JIFrame1創建的搜索類當前實例,在changedState(..)我打電話jiFrame1.getSearch().dispose()這將確保我們處理的是已經創建的實例:

import java.awt.Container; 
import java.awt.event.MouseListener; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class Sample extends javax.swing.JFrame { 

    JIFrame1 jiframe1 = new JIFrame1(); 

    public Sample() { 
     initComponents(); 

     Container jiframe1cont = tab1; 
     for (MouseListener listener : ((javax.swing.plaf.basic.BasicInternalFrameUI) jiframe1.getUI()).getNorthPane().getMouseListeners()) { 
      ((javax.swing.plaf.basic.BasicInternalFrameUI) jiframe1.getUI()).getNorthPane().removeMouseListener(listener); 
     } 
     jiframe1.setLocation(10, 10); 
     jiframe1cont.add(jiframe1); 
     jiframe1.setVisible(true); 

     JIFrame2 jiframe2 = new JIFrame2(); 
     Container jiframe2cont = tab2; 
     for (MouseListener listener : ((javax.swing.plaf.basic.BasicInternalFrameUI) jiframe2.getUI()).getNorthPane().getMouseListeners()) { 
      ((javax.swing.plaf.basic.BasicInternalFrameUI) jiframe2.getUI()).getNorthPane().removeMouseListener(listener); 
     } 
     jiframe2.setLocation(10, 10); 
     jiframe2cont.add(jiframe2); 
     jiframe2.setVisible(true); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     tab1 = new javax.swing.JDesktopPane(); 
     tab2 = new javax.swing.JDesktopPane(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     tabbedPane.setTabPlacement(javax.swing.JTabbedPane.LEFT); 
     tabbedPane.addChangeListener(new javax.swing.event.ChangeListener() { 
      public void stateChanged(javax.swing.event.ChangeEvent evt) { 
       tabbedPaneStateChanged(evt); 
      } 
     }); 

     tab1.setBackground(new java.awt.Color(240, 240, 240)); 
     tabbedPane.addTab("Tabbedpane 1", tab1); 

     tab2.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background")); 
     tabbedPane.addTab("Tabbedpane 2", tab2); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 731, Short.MAX_VALUE)); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(tabbedPane, javax.swing.GroupLayout.DEFAULT_SIZE, 503, Short.MAX_VALUE)); 

     pack(); 
    }// </editor-fold> 

    private void tabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) { 
     try { 
      jiframe1.getSearch().dispose(); 
     } catch (Exception ex) { 
      Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Sample().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JDesktopPane tab1; 
    private javax.swing.JDesktopPane tab2; 
    private final javax.swing.JTabbedPane tabbedPane = new javax.swing.JTabbedPane(); 
    // End of variables declaration 
} 

class Search extends javax.swing.JInternalFrame { 

    public Search() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jTextField1 = new javax.swing.JTextField(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTable1 = new javax.swing.JTable(); 
     jButton1 = new javax.swing.JButton(); 

     jTextField1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); 

     jTable1.setModel(new javax.swing.table.DefaultTableModel(
       new Object[][]{ 
        {null, null, null, null}, 
        {null, null, null, null}, 
        {null, null, null, null}, 
        {null, null, null, null} 
       }, 
       new String[]{ 
        "Title 1", "Title 2", "Title 3", "Title 4" 
       })); 
     jScrollPane1.setViewportView(jTable1); 

     jButton1.setText("CLOSE"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE) 
       .addContainerGap()) 
       .addGroup(layout.createSequentialGroup() 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(205, Short.MAX_VALUE)))) 
       .addGroup(layout.createSequentialGroup() 
       .addGap(158, 158, 158) 
       .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 75, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(172, Short.MAX_VALUE))); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
       .addGap(22, 22, 22) 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(18, 18, 18) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(18, 18, 18) 
       .addComponent(jButton1) 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); 

     pack(); 
    }// </editor-fold> 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     this.dispose(); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JButton jButton1; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTable jTable1; 
    private javax.swing.JTextField jTextField1; 
    // End of variables declaration 
} 

class JIFrame1 extends javax.swing.JInternalFrame { 

    public JIFrame1() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     pane = new javax.swing.JDesktopPane(); 
     jButton1 = new javax.swing.JButton(); 

     pane.setBackground(new java.awt.Color(240, 240, 240)); 

     jButton1.setText("SEARCH"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 
     jButton1.setBounds(170, 60, 90, 23); 
     pane.add(jButton1, javax.swing.JLayeredPane.DEFAULT_LAYER); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(pane, javax.swing.GroupLayout.DEFAULT_SIZE, 567, Short.MAX_VALUE)); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(pane, javax.swing.GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)); 

     pack(); 
    }// </editor-fold> 
    private Search search; 

    public Search getSearch() { 
     return search; 
    } 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     search = new Search(); 
     Container searchcont = pane; 
     for (MouseListener listener : ((javax.swing.plaf.basic.BasicInternalFrameUI) search.getUI()).getNorthPane().getMouseListeners()) { 
      ((javax.swing.plaf.basic.BasicInternalFrameUI) search.getUI()).getNorthPane().removeMouseListener(listener); 
     } 
     search.setLocation(10, 10); 
     searchcont.add(search); 
     search.setVisible(true); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JButton jButton1; 
    private javax.swing.JDesktopPane pane; 
    // End of variables declaration 
} 

class JIFrame2 extends javax.swing.JInternalFrame { 

    public JIFrame2() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     jLabel1 = new javax.swing.JLabel(); 

     jLabel1.setText("JIFrame2.............."); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
       .addGap(100, 100, 100) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 157, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(137, Short.MAX_VALUE))); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
       .addGap(86, 86, 86) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(145, Short.MAX_VALUE))); 

     pack(); 
    }// </editor-fold> 
    // Variables declaration - do not modify 
    private javax.swing.JLabel jLabel1; 
    // End of variables declaration 
} 

更新3:

原因NPE是在這裏:

private void tabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) { 
     try { 
      jiframe1.getSearch().dispose(); 
     } catch (Exception ex) { 
      Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

改成這樣:

private void tabbedPaneStateChanged(javax.swing.event.ChangeEvent evt) { 
    try { 
     Search s=jiframe1.getSearch(); 
     if(s!=null) 
     s.dispose(); 
    } catch (Exception ex) { 
     Logger.getLogger(Sample.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
+0

好的但如何關閉打開的搜索JInternalFrame。我嘗試嘗試新的搜索()。setClosed(true); Logger.getLogger(Sample.class.getName()).log(Level.SEVERE,null,ex); } –

+0

仍然沒有工作 –

+0

@NidhinKrishnan也不是通過使用'new'關鍵字,每次你應該在先前創建的實例上調用'dispose()'時創建一個新的搜索實例 –

相關問題