1

この Java 101 クラスがあり、Netbeans 7.2.1 を使用しています。現在、データベース (MySql) からデータを追加しています。私はこの問題を抱えています:

私は 2 つ (2) JFrame- mainFrame(1)、addForm(2)

mainFrameI use table to view my data ( , ) and (add)button と (refresh) ボタンをクリックしてLastNameFirstName変更するたびにテーブルを更新します。2 番目のフレーム ( addForm) には、テキスト フィールド ( lastnamefirstname) と ( save) ボタンがあります。

シナリオ

mainFrame( add) ボタンをクリックすると、表示addFormされます。( LastNameFirstName) フィールドにデータを入力し、Saveボタンをクリックしてデータを保存しました。その後、ボタンをmainFrameクリックrefreshしてテーブルに新しく追加されたデータを表示する必要があります。

問題

JTableデータを保存した後に自動的に更新する方法はありますか?

保存をクリックするとテーブルに表示されないため、常にクリックrefreshmainFrameて表示します。1つだけ使用すると自動的に表示されますJFrame(YouTubeチュートリアルのクレジットからアップローダーまで)。

教えていただけると幸いです。インターネットで検索しましたが、答えを把握できませんでした。前もって感謝します。

4

1 に答える 1

3

これと同じ質問がこのサイトでよく聞かれますが、解決策はほとんど常に同じです。

メイン ウィンドウが依存する入力をユーザーに処理させる必要がある場合、モーダル ダイアログが必要な場合は、2 つ目の JFrame を使用しないでください。依存ウィンドウを表示するには、モーダル JDialog または JOptionPane を使用します。これを行うと、ダイアログが完全に処理されるまで、メイン ウィンドウからのプログラム フローが中断されます。これにより、メイン プログラムは、ユーザーが依存ウィンドウをプログラムとして操作を完了したことを簡単に検出できます。依存ウィンドウであるモデルダイアログが表示された直後からフローが再開されます。その後、依存ウィンドウによって表示されるフィールドを照会し、含まれている情報を使用して JTable のモデルを更新できます。

もう 1 つのオプションは、CardLayout を使用してメイン ウィンドウに 2 番目のビューを新しいビューとして表示し、ビューを入れ替えることです。

一方、メイン ウィンドウが 2 番目のウィンドウを扱うユーザーに完全に依存しない場合は、それを非モーダル ダイアログとして表示するか、CardLayout または JTabbedPane を介して別のビューとして表示することを検討してください。

例えば:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class DialogEg {

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

      JFrame frame = new JFrame("DialogEg");
      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();
         }
      });
   }
}

class MainWin extends JPanel {
   private String[] COL_NAMES = { "Last Name", "First Name" };
   private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0);
   private JTextField lastNameField = new JTextField(15);
   private JTextField firstNameField = new JTextField(15);

   public MainWin() {
      final JPanel dataPanel = new JPanel();
      dataPanel.add(new JLabel("Last Name:"));
      dataPanel.add(lastNameField);
      dataPanel.add(Box.createHorizontalStrut(15));
      dataPanel.add(new JLabel("First Name:"));
      dataPanel.add(firstNameField);

      JPanel btnPanel = new JPanel();
      btnPanel.add(new JButton(new AbstractAction("Add Name") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            lastNameField.setText("");
            firstNameField.setText("");
            int result = JOptionPane.showConfirmDialog(MainWin.this, dataPanel,
                  "Enter Name", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
            if (result == JOptionPane.OK_OPTION) {
               String lastName = lastNameField.getText();
               String firstName = firstNameField.getText();
               Object[] dataRow = new String[] { lastName, firstName };
               model.addRow(dataRow);
            }
         }
      }));

      setLayout(new BorderLayout());
      add(new JScrollPane(new JTable(model)), BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);

   }
}
于 2013-03-17T00:32:05.923 に答える