1

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

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

mainFrameI use table to view my data ( LastName, FirstName) 和 (add) 按钮中,我得到了 (refresh) 按钮,每次更改表格时我都会单击它来刷新表格。在第二帧 ( addForm) 中,我得到了文本字段 (for lastname, firstname) 和 ( save) 按钮。

设想

mainFrame我单击 ( add) 按钮,然后addForm出现。我向 ( LastName, FirstName) 字段提供数据并单击Save按钮以保存数据。之后,我需要返回mainFrame单击refresh按钮以查看新添加到表中的数据。

问题

保存数据后有没有办法自动刷新我JTable的数据?

因为当我单击已保存时,它不会出现在表格中,我总是单击refreshmainFrame查看它。JFrame仅使用一个(从 youtube 教程学分到上传者)时,我可以自动看到它。

希望有时间教我。我已经通过互联网搜索但未能掌握答案。提前致谢。

4

1 回答 1

3

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

如果您需要让用户处理主窗口所依赖的输入,当您需要模态对话框时,不要使用第二个 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);

   }
}
于 2013-03-17T00:32:05.923 回答