如何在不关闭主程序的情况下关闭jframe

我正在创建一个程序来跟踪DVD的列表。 在主页面上我设置了2个JButtons。 当用户单击显示为new的那个时,来自另一个类的新JFrame会出现输入有关新DVD的信息的字段。 我正在尝试在第二帧上创建一个取消按钮,以便当单击取消按钮时,它会重新启动主GUI并关闭新的条目GUI。 代码如下,我无法弄清楚如何做到这一点。

主GUI页面

package dvdlibrary; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; public class bootPage extends javax.swing.JFrame { /** Creates new form bootPage */ public bootPage() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout()); jLabel1.setText("DVD Library"); getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(168, 11, -1, -1)); jLabel2.setText("What would you like to do today?"); getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(113, 70, -1, -1)); jButton1.setText("Create Record"); jButton1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jButton1MouseClicked(evt); } }); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); getContentPane().add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(50, 135, -1, -1)); jButton2.setText("View Library"); jButton2.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jButton2MouseClicked(evt); } }); getContentPane().add(jButton2, new org.netbeans.lib.awtextra.AbsoluteConstraints(224, 135, 111, -1)); pack(); }//  private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { } private void jButton1MouseClicked(java.awt.event.MouseEvent evt) { if(evt.getSource()== jButton1) dvdlibrary.createEntry.createE(); } private void jButton2MouseClicked(java.awt.event.MouseEvent evt) { if(evt.getSource()== jButton2) dvdlibrary.movieChooser.movChoo(); } public static void bootP() { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new bootPage().setVisible(true); new bootPage().setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; } 

创建条目页面

 package dvdlibrary; public class createEntry extends javax.swing.JFrame { public createEntry() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jTextField1 = new javax.swing.JTextField(); jComboBox1 = new javax.swing.JComboBox(); jTextField2 = new javax.swing.JTextField(); jTextField3 = new javax.swing.JTextField(); jTextField4 = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); jTextArea1 = new javax.swing.JTextArea(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText("Title"); jLabel2.setText("Genre"); jLabel3.setText("Length"); jLabel4.setText("Rating"); jLabel5.setText("Description"); jLabel6.setText("Year"); jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); jTextArea1.setColumns(20); jTextArea1.setRows(5); jScrollPane1.setViewportView(jTextArea1); jButton1.setText("Input"); jButton2.setText("Load"); jButton3.setText("Save"); jButton4.setText("Cancel"); jButton4.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jButton4MouseClicked(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() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(19, 19, 19) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel5) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 174, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel4) .addComponent(jLabel6)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 32, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jTextField2) .addComponent(jTextField4) .addComponent(jTextField3, javax.swing.GroupLayout.DEFAULT_SIZE, 133, Short.MAX_VALUE))))) .addGroup(layout.createSequentialGroup() .addGap(51, 51, 51) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(124, 124, 124) .addComponent(jButton1)) .addGroup(layout.createSequentialGroup() .addGap(45, 45, 45) .addComponent(jButton4) .addGap(18, 18, 18) .addComponent(jButton2) .addGap(18, 18, 18) .addComponent(jButton3))) .addGap(23, 23, 23)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(38, 38, 38) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButton1)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(26, 26, 26) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel6) .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(29, 29, 29) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(37, 37, 37) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel4) .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(39, 39, 39) .addComponent(jLabel5) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton3) .addComponent(jButton2) .addComponent(jButton4))) .addContainerGap()) ); pack(); } private void jButton4MouseClicked(java.awt.event.MouseEvent evt) { } public static void createE() { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new createEntry().setVisible(true); } }); } private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JButton jButton4; private javax.swing.JComboBox jComboBox1; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextArea jTextArea1; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; private javax.swing.JTextField jTextField3; private javax.swing.JTextField jTextField4; // End of variables declaration } 

我想你也可以使用DISPOSE_ON_CLOSE :

DISPOSE_ON_CLOSE(JInternalFrame的默认值)

用户关闭窗口时隐藏和处理窗口。 这将从屏幕中删除窗口并释放它使用的任何资源。

您是否阅读了API以找出setDefaultCloseOperation(…)方法的其他值?

您可以使用:

DISPOSE_ON_CLOSE – 框架将关闭。 如果这是应用程序的最后一个打开框架,那么JVM也将终止

HIDE_ON_CLOSE – 框架设置为不可见。

当用户点击一个说新的时,另一个类的新jframe会出现输入有关新DVD的信息的字段。

程序的真正问题在于您使用框架作为弹出窗口。 你应该使用模态JDialog。 应用程序应该只有一个带有多个对话框的JFrame来收集其他信息。 JDialog不允许您使用EXIT_ON_CLOSE。

 frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE) 

我遇到了类似的问题并使用了jFrameInstanceVariable.setVisible(false); 当我按下CANCEL按钮时发生的动作。 但是每次我点击之后弹出JFrame的按钮时,除了按下按钮创建的新内容之外,所有旧内容仍然存在。

每次按下弹出JFrame的按钮时,我都会通过创建一个新的JFrame实例来解决这个问题。

要隐藏窗口而不实际关闭程序,请执行以下操作:

 f.setVisible(false); 

如果是这种情况,请确保使用setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 在初始化时你的JFrame,而不是setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  • 当最后一个JFrame关闭时,DISPOSE_ON_CLOSE将终止您的应用程序。 一旦JFrame关闭,EXIT_ON_CLOSE将终止您的应用程序。 即使隐藏了所有JFrame,HIDE_ON_CLOSE(默认)也不会终止您的应用程序。

如果你只是隐藏程序,使用HIDE_ON_CLOSEset.Visible(false) ,这不是一个很好的选择,因为如果你用更多的帧做更大的事情,隐藏的帧仍将运行,从而降低计算机性能。 正如其他人所说的那样,而不是使用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ,当您单击“X,关闭所有帧时,将终止程序,使用以下内容:

 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

如果你使用像我认为你说的那样的按钮

 this.dispose(); 

会做的伎俩..

试试把this.dispose(); 在取消按钮方法内。