-1

JVM /アプリケーション全体を終了せずに、JFrameを閉じて結果的に開くにはどうすればよいですか?JFrame1を閉じたり、主にJVM /アプリケーション全体を終了したりせずに、JFrameのみを終了してすぐに開くようにします。JButtonでやりたいです。

次のようにJButtonが必要です。JButton( "このJFrameを閉じてすぐに開くと、JVM /アプリケーションを終了せずにコンストラクターが再度実行されます");

私が欲しいのですが、どうすればいいのかわかりません。ウィンドウの「x」をクリックしたときに同じようにJFrameウィンドウを閉じるメソッドが必要です。次のようになります。JFrame.close(); //ウィンドウの「x」のようにJFrame.setVisible(true)

ありがとう。

JFrame機能の印刷はここにあります:
ここに画像の説明を入力してください

私は自己回答をしました

4

3 に答える 3

2

アプリケーションは通常1つのJFrameしか表示しないため、「サブ」JFrameは表示しないでください。あなたが話している仕事、親ウィンドウに依存するウィンドウの仕事は、モーダルまたは非モーダルJDialogの目的であり、ウィンドウを閉じてもアプリケーションが終了することはありません。これは言ったが、CardLayoutを使用してJComponentsまたはJTabbedPaneを交換するなどの他の代替案も検討してください。

また、JDialogは、JFrameに表示されるものと同じくらい複雑でリッチなGUIを表示できることを理解してください。

編集、に関して:

私はJFrameにJTableを持っていますが、コードがコンストラクター上にあるため、JFrameを再度インスタンス化して、GUIの別の状態を表示し、JFrameを閉じたり開いたりしたいと思います。

コードはコンストラクターから移動できます。GUIでの状態変化については、CardLayoutを使用することを強くお勧めします。JTableをJPanelに入れてから、JFrameのcontentPaneが保持しているJPanelを交換します。ウィンドウが表示されたり表示されなかったりしない場合、ユーザーインターフェイスははるかにスムーズになります。

編集
2OK、JTableの行を編集するウィンドウを表示する場合は、JTextFieldsの行のデータを保持するJPanelを作成し、JPanelを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 に答える
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 に答える
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 に答える