使用 JButton 更新 JTable

Posted

技术标签:

【中文标题】使用 JButton 更新 JTable【英文标题】:Update JTable using JButton 【发布时间】:2012-12-04 08:55:19 【问题描述】:

我试图在 Swing 库界面上包含一个刷新按钮,该按钮的目的是在调用添加/删除/更新查询后刷新 JTable 的内容。我做了一些研究,发现tableDataChanged() 来自AbstractTableModel 类。问题是我不确定应该在哪里调用它。我用的是DefaultTableModel,所以我相信这个方法也可以用。

/*This is where I create the query and add the JTable to a scrollPane, an ResultsPanel
 object is then added to a JFrame object*/




 public class SitePanel extends JPanel implements Constants  
 ResultsPanel resultsPanel = new ResultsPanel();
   JTable table;
   DefaultTableModel model;
   JPanel sitePanel = new JPanel();
   JPanel results = new JPanel();

   public SitePanel()
addComponents();


public void addComponents()
    sitePanel.setLayout(new BorderLayout());
    sitePanel.add(buttonPanel, BorderLayout.NORTH);
    sitePanel.add(resultsPanel, BorderLayout.CENTER);
    sitePanel.setVisible(true);
    add(new JScrollPane(sitePanel));


 class ButtonPanel extends JPanel
 JPanel buttons = new JPanel();

       public ButtonPanel()
      buttons.setLayout(new FlowLayout());
      buttons.add(refreshButton);
      show();
      buttons.setVisible(true);
      add(buttons);

    
  public void show()

  refreshButton.addActionListener(new ActionListener()
   @Override
            public void actionPerformed(ActionEvent arg0) 
                new ResultsPanel();
                table.setModel(model);
            
        
                );
 
 public class ResultsPanel extends JPanel


     public ResultsPanel()

        execute();
        results.add(scrollPane);
        javax.swing.SwingUtilities.invokeLater(new Runnable()
            public void run()
                results.setBorder(greenB);
                results.setToolTipText("Results");
                results.setVisible(true);
                add(results);

            
        );
    

        public void execute() 
        Vector columnNames = new Vector();
        Vector data = new Vector();

        try
            Connection conn = Connect.getConnection();
            String query = "Select Name from Location Order By Name";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            for (int i=1; i<=columns;i++)
                columnNames.addElement(md.getColumnName(i));
                   
            while (rs.next())
                Vector row = new Vector(columns);

                for(int i=1; i<=columns;i++)   
                    row.addElement(rs.getObject(i));
                
                data.addElement(row);
            
            rs.close();
            stmt.close();
            conn.close();
        
        catch (Exception e)
            e.printStackTrace();
        
        model = new DefaultTableModel(data, columnNames);

        model.addTableModelListener(table);
        table = new JTable(model)
            public boolean isCellEditable(int row, int col)
                return false;
            

            public Class getColumnClass(int column)
                for (int row=0; row<getRowCount();row++)
                    Object o = getValueAt(row, column);

                    if(o!=null)
                        return o.getClass();
                    
                
                return Object.class;
            
        ;

        scrollPane = new JScrollPane(table);
        scrollPane.setBorder(border);
        scrollPane.getVerticalScrollBar().setBackground(Color.LIGHT_GRAY);
    


           

这是带有 main 方法的类。

import java.net.URL;
import java.sql.*;
import javax.swing.*;



 public class Connect extends JFrame

public static String user = null;
public static String password = null;
static Connection conn = null;

public static void loginGUI() throws Exception
    JPasswordField passwordField = new JPasswordField();
    JTextField userField = new JTextField();
    passwordField.setEchoChar('*');
    Object[] obj = "Username:\n", userField, "Password:\n", passwordField;
    Object stringArray[] = "OK", "Cancel";
    if(JOptionPane.showOptionDialog(null, obj, "Login", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, stringArray, obj)==JOptionPane.YES_OPTION);
    password = new String (passwordField.getPassword());
    user = userField.getText();
    Conn.formConnection();






public static void main (String[] args) throws Exception
            javax.swing.SwingUtilities.invokeLater(new Runnable()
        public void run()
            try 
                                    Connect.loginGUI();
             catch (Exception e) 
                e.printStackTrace();
            
        
    );

/**
 * Static connection class can only be created once at any given time.
 * @author Nosheen Mahate
 *
 */
public static class Conn

    public static Connection formConnection() throws Exception
        try
            String driver = "net.sourceforge.jtds.jdbc.Driver";
            String url = "jdbc:jtds:sqlserver://BHX4DT-4FPQ35J:1433/Forecast;instance=SQLEXPRESS" +
                    ";user=" +user +";password="+ password +";ssl=request;Encrypt=true;TrustServerCertificate=true";
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);

            try
                password = null;
                JFrame frame = new JFrame();
                                              frame.add(new SitePanel());
                                              frame.pack();
                                              frame.setVisible(true);
            
            catch (Exception e)
                System.exit(1);
                JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);


                e.printStackTrace();

            
        
        catch (Exception e)
            if(password != null || user !=null)
                JOptionPane.showMessageDialog(null, e, "Error",      JOptionPane.ERROR_MESSAGE);
            
            else
            System.exit(1);

            
            System.out.println("No Connection");
        

        return conn;

    
    /**
     * Used to check that the connection is still established
     */

public static Connection getConnection()
    return conn;


/**
 * Close the connection to the server
 * @throws SQLException
 */
public static void closeConnection() throws SQLException
    conn.close();
    conn = null;


我知道那里有很多代码,但我不太确定您可能需要什么。 只是为了重新运行,我想知道单击JButton 后如何更新JTable,以及应该在哪里调用fireTableDataChanged() 方法(如果需要)。

【问题讨论】:

“我知道那里有很多代码,但我不太确定您可能需要什么。” 这不是“相当多”的 IMO。如果您发布一个 SSCCE 而不是 2 个 sn-ps,我希望人们可能会查看(或至少编译)更多 LOC。 @AndrewThompson 认为这更清楚,感谢您的提示。 很好的编辑,但请注意,SSCCE 需要 main(String[]) 才能将其投射到屏幕上,就像在这个 small example 中一样。 对不起,我忘了把它包含在另一个类中。 SSCCE 中有多个班级。例如。这个SSCCE with 2 classes. 【参考方案1】:

    请看,从

    开始

    ResultSetTableModel

    Table From Database by @camickr

    尽量避免在EventDispatchThread 上同时更新(上午)XxxResultSetTableModel

    Workers Thread开始所有JDBCJTables更新,从Runnable#Thread开始,最好从SwingWorker开始,否则Swing GUI将冻结直到JDBCJTables更新结束了

    注意,两个代码都是代码示例,必须将所有 Xxx.close() 移动到(添加创建新的)finally 块 (try - catch - finally)

【讨论】:

谢谢,我需要阅读您发布的这些链接。您是否指出我的表没有得到更新的原因是因为线程的使用方式,或者这会在我的代码运行时更好吗? 除了 mKorbel 发布的内容之外,我发现 this article 也很有帮助。

以上是关于使用 JButton 更新 JTable的主要内容,如果未能解决你的问题,请参考以下文章

如何在条件下启用 JButton?

通知 JButton 以了解更改的内容

使用 JButton 更改 ImageBackground?

使用前景标签将图像添加到 Jbutton

使用 JButton 在 Java 中创建自定义按钮

在另一个 JFrame 中使用 JButton 刷新 JTable?