-1

如何在不退出 JVM/整个应用程序的情况下关闭并打开 JFrame?我希望只退出并立即打开 JFrame,而不关闭 JFrame1,也不主要退出 JVM/整个应用程序。我想用 JButton 来做。

我想要一个这样的 JButton: JButton("我关闭这个 JFrame 并立即打开它,以便再次执行构造函数,而不退出 JVM/应用程序");

我想要但我不知道该怎么做是:我需要一种方法,当您单击窗口的“x”时,以同样的方式关闭 JFrame 窗口。如下: JFrame.close(); //就像一个窗口的“x” JFrame.setVisible(true)

谢谢。

JFrame 功能的打印在这里:
在此处输入图像描述

我做了一个自我回答

4

3 回答 3

2

我用谷歌搜索,我找到了解决方案,是这样的:

       WindowEvent closingEvent = new WindowEvent(frame, WindowEvent.WINDOW_CLOSING);
       Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(closingEvent);
       frame.setVisible(true);

它使用 WindowEvent 来执行与“x”单击相同的操作。

无论如何谢谢你们的帮助!!!

于 2012-07-06T08:46:13.127 回答
2

不要显示“子”JFrame,因为应用程序通常只显示一个 JFrame。您正在谈论的工作,即依赖于父窗口的窗口的工作是模态或非模态 JDialog 的用途,如果关闭将永远不会导致应用程序退出的窗口。尽管已经说过这也考虑其他替代方案,例如使用 CardLayout 来交换 JComponents 或 JTabbedPane。

请理解,JDialog 可以显示与任何 JFrame 上显示的 GUI 一样复杂和丰富的 GUI。

编辑,关于:

我在 JFrame 有一个 JTable,是的,我想再次实例化 JFrame 以显示不同的 GUI 状态,关闭和打开 JFrame,因为代码在其构造函数上。

代码可以移出构造函数。对于 GUI 中的状态更改,我强烈建议您使用 CardLayout。将您的 JTable 放入 JPanel,然后交换 JFrame 的 contentPane 持有的 JPanel。如果您没有在视图中弹出和弹出窗口,则用户界面会更加流畅。

编辑 2
好的,如果你想显示一个编辑 JTable 行的窗口,我会做的是创建一个 JPanel 来保存 JTextFields 中的行中的数据,然后在 JOptionPane.showConfirmDialog(. ..),然后使用 JTextFields 保存的数据来编辑您的 JTable 行。我不会为此创建一个单独的 JFrame。

编辑 3 例如:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("serial")
public class Foo1 extends JPanel {
   private static final String[] COLUMN_NAMES = { "Foo", "Bar", "Licious" };
   private static final Object[][] DATA = { { 1, "Abaddon", "A" },
         { 2, "Beelzebub", "B" }, { 3, "Chuck", "C" }, { 4, "Dagon", "D" },
         { 5, "Eisheth", "E" }, {6, "Forneus", "F"}};
   private DefaultTableModel tableModel = new DefaultTableModel(DATA,
         COLUMN_NAMES);
   private JTable table = new JTable(tableModel);

   public Foo1() {
      JPanel bottomPanel = new JPanel();
      bottomPanel.add(new JButton(new EditRowAction()));

      setLayout(new BorderLayout());
      add(new JScrollPane(table));
      add(bottomPanel, BorderLayout.PAGE_END);
   }

   private class EditRowAction extends AbstractAction {
      public EditRowAction() {
         super("Edit Row");
         putValue(MNEMONIC_KEY, KeyEvent.VK_E);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         int rowIndex = table.getSelectedRow();
         if (rowIndex != -1) {
            Object[] row = new Object[table.getColumnCount()];
            for (int column = 0; column < row.length; column++) {
               row[column] = tableModel.getValueAt(rowIndex, column);
            }
            MyRowPanel myRowPanel = new MyRowPanel(row);
            int result = JOptionPane.showConfirmDialog(Foo1.this, myRowPanel,
                  "Edit Row Information and Press \"OK\"", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
            if (result == JOptionPane.OK_OPTION) {
               for (int col = 0; col < row.length; col++) {
                  tableModel.setValueAt(myRowPanel.getFieldText(col), rowIndex,
                        col);
               }
            }
         }
      }
   }

   private class MyRowPanel extends JPanel {
      private JTextField[] textFields;

      public MyRowPanel(Object[] row) {
         textFields = new JTextField[row.length];
         for (int i = 0; i < row.length; i++) {
            textFields[i] = new JTextField(String.valueOf(row[i]), 10);
            add(textFields[i]);
         }
      }

      public String getFieldText(int index) {
         // check first that index is not out of range and throw exception if it
         // is
         if (index < 0 || index > textFields.length) {
            throw new ArrayIndexOutOfBoundsException("for index = " + index);
         }

         return textFields[index].getText();
      }

   }

   private static void createAndShowGui() {
      Foo1 mainPanel = new Foo1();

      JFrame frame = new JFrame("Foo1");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

编辑4关于:

是的,我理解您的观点,它确实有效,也就是说,我将识别已编辑的行并替换为较新的值。但实际上,我想刷新以将真实数据持久保存在数据库中,而不是化妆“编辑”JTable。

好的,那么在上面的代码示例中,我将在显示 JOptionPane 和我的 if 块内部后立即创建一个 PreparedStatement,并在 PreparedStatement 上调用 executeUpdate(当然是在后台线程中)。

于 2012-07-06T00:56:31.663 回答
0

如果您只想关闭并重新打开嵌套框架而不退出 JVM/整个应用程序,您应该更改嵌套框架的“ defaultCloseOperation ”属性。

查看我的简单示例并注意 setDefaultCloseOperation 的用法:

    JFrame mainFrame = new JFrame("Main Frame");
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    final JFrame nestedframe = new JFrame("Nested Frame");
    nestedframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    JButton btn = new JButton("Close & Reopen Nested Frame");
    btn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            nestedframe.dispose();
            nestedframe.setVisible(true);
        }
    });

    mainFrame.getContentPane().add(btn);
    mainFrame.setSize(350, 200);
    nestedframe.setSize(250,150);

    mainFrame.setLocation(0,0);
    nestedframe.setLocation(400,0);

    mainFrame.setVisible(true);
    nestedframe.setVisible(true);
于 2012-07-06T06:41:49.760 回答