使用 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
开始所有JDBC
和JTable
s更新,从Runnable#Thread
开始,最好从SwingWorke
r开始,否则Swing GUI将冻结直到JDBC
和JTables
更新结束了
注意,两个代码都是代码示例,必须将所有 Xxx.close(
) 移动到(添加创建新的)finally
块 (try
- catch
- finally
)
【讨论】:
谢谢,我需要阅读您发布的这些链接。您是否指出我的表没有得到更新的原因是因为线程的使用方式,或者这会在我的代码运行时更好吗? 除了 mKorbel 发布的内容之外,我发现 this article 也很有帮助。以上是关于使用 JButton 更新 JTable的主要内容,如果未能解决你的问题,请参考以下文章