通过单击其他JFrame中的按钮来刷新JFrame中的JTable

时间:2013-03-17 00:29:26

标签: java swing netbeans jtable jframe

我们有这个Java 101类,我们使用的是Netbeans 7.2.1。截至目前,我们正在从数据库(MySql)添加数据。我有这个问题:

我两(2)JFrame - mainFrame(1),addForm(2)

mainFrame我使用表格查看我的数据(LastNameFirstName)和(添加)按钮,我得到(刷新)按钮,我点击每次刷新我的表我改变了它的时间。在第二帧(addForm)中,我获得了文本字段(适用于lastnamefirstname)和一个(save)按钮。

方案

mainFrame我点击(add)按钮,然后addForm出现。我向(LastNameFirstName)字段提供数据,然后点击Save按钮以保存数据。之后,我需要返回mainFrame点击refresh按钮,查看我新增的数据。

问题

保存数据后,有没有办法自动刷新JTable

因为当我点击保存时,它似乎不会显示在表格中,我始终会点击refresh中的mainFrame进行查看。我只能使用一个JFrame(从youtube教程学分到上传者)自动查看。

希望你有时间教我。我在互联网上搜索但未能掌握答案。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这个问题在这个网站上被提出了很多问题,解决方案几乎总是一样的:

如果您需要让用户处理主窗口所依赖的输入,请不要在需要模式对话框时使用第二个JFrame。使用模态JDialog或JOptionPane显示依赖窗口。执行此操作时,主窗口中的程序流将被中断,直到对话框完全处理完毕,这样主程序将很容易检测到用户何时完成了作为程序的从属窗口的操作当依赖窗口(模型对话框)显示时,流程将从该点之后立即恢复。然后,您可以查询从属窗口显示的字段,并使用包含的信息来更新JTable的模型。

请注意,另一个选项是使用CardLayout交换视图,将第二个视图显示为主窗口上的新视图。

另一方面,如果主窗口不完全取决于处理第二个窗口的用户,则考虑将其显示为非模态对话框或通过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);

   }
}