2014-04-14 3 views
0

안녕하세요, 내부 프레임을 만들고 있는데, 메뉴 항목을 통해 내부 프레임을 닫고 싶지만 전체 프레임을 닫았습니다. 도와주세요.JMenuItem을 통해 JInternalFrame 닫기

다음

내 코드는,

public class CloseWindow extends javax.swing.JFrame { 

    JTextArea tx; 
    int i=0; 
    public CloseWindow() { 
     initComponents(); 
    } 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents 
    private void initComponents() { 

     tPane = new javax.swing.JTabbedPane(); 
     jMenuBar1 = new javax.swing.JMenuBar(); 
     jMenu1 = new javax.swing.JMenu(); 
     Crete = new javax.swing.JMenuItem(); 
     close = new javax.swing.JMenuItem(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jMenu1.setText("File"); 

     Crete.setText("Create"); 
     Crete.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       CreteActionPerformed(evt); 
      } 
     }); 
     jMenu1.add(Crete); 

     close.setText("Close"); 
     close.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       closeActionPerformed(evt); 
      } 
     }); 
     jMenu1.add(close); 

     jMenuBar1.add(jMenu1); 

     setJMenuBar(jMenuBar1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(tPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(tPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 279, Short.MAX_VALUE) 
     ); 

     pack(); 
    }// </editor-fold>//GEN-END:initComponents 
    private void CreteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CreteActionPerformed 
     ActionEvent ae=evt; 
     final JInternalFrame internalFrame = new JInternalFrame(""); 
     i++; 
     internalFrame.setName("Document"+i); 
     internalFrame.setClosable(true); 
     internalFrame.setSize(700, 700); 
     tx = new JTextArea(); 
     internalFrame.add(tx); 
     tPane.add(internalFrame); 
     internalFrame.setSize(internalFrame.getMaximumSize()); 
     internalFrame.pack(); 
     internalFrame.setVisible(true); 
     internalFrame.addInternalFrameListener(new InternalFrameAdapter() { 
     @Override 
     public void internalFrameClosing(InternalFrameEvent e) { 

      tPane.remove(internalFrame); 
     } 
    }); 


    }  



    private void closeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeActionPerformed 
     WindowEvent tabClosingEvent = new WindowEvent(this,WindowEvent.WINDOW_CLOSING); 
      Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(tabClosingEvent); 
    } 

    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(CloseWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(CloseWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(CloseWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(CloseWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new CloseWindow().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify//GEN-BEGIN:variables 
    private javax.swing.JMenuItem Crete; 
    private javax.swing.JMenuItem close; 
    private javax.swing.JMenu jMenu1; 
    private javax.swing.JMenuBar jMenuBar1; 
    private javax.swing.JTabbedPane tPane; 
    // End of variables declaration//GEN-END:variables 
} 

답변

0

당신은 새로운 WindowEvent

WindowEvent tabClosingEvent = new WindowEvent(this,.... 

로를 만들고 이벤트 큐에이 게시되어있다. 여기서 this은 메인 프레임을 나타냅니다. 그것이 폐쇄 된 이유입니다.

그러나 일반적으로 이 아니고은 이벤트 큐를 수동으로 처리해야합니다. 대신 원하는 작업을 수행하는 메서드를 사용하여 프로그래밍 방식으로 각 작업을 수행해야합니다.

약간의 정리 혜택을 누릴 수있는 최초의 { 마지막 } 사이의 코드의 일부가 있지만 실제 문제를 해결하기 위해, 당신은 이런 식으로 closeActionPerformed 방법을 변경할 수 :

private void closeActionPerformed(java.awt.event.ActionEvent evt) 
{ 
    Component c = tPane.getSelectedComponent(); 
    if (c instanceof JInternalFrame) 
    { 
     JInternalFrame f = (JInternalFrame)c; 
     f.dispose(); 
     tPane.remove(f); 
    } 
} 

(그런 다음 더 이상 InternalFrameListener이 필요하지 않음)