gpt4 book ai didi

java - 使用 JButton 更新 JTable

转载 作者:行者123 更新时间:2023-11-30 04:35:06 25 4
gpt4 key购买 nike

我试图在 Swing 库界面上包含一个刷新按钮,该按钮的目的是在调用添加/删除/更新查询后刷新 JTable 的内容。我做了一些研究,发现来自 AbstractTableModel 类的 tableDataChanged() 。问题是我不确定应该在哪里调用它。我使用的是 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() 方法应该在哪里(如果需要)被召唤。

最佳答案

  1. 请看一下,从

    开始
  2. 尽量避免在 EventDispatchThread 上更新两个(上午)XxxResultSetTableModel ,

  3. Workers ThreadRunnable#Thread 启动所有 JDBCJTable 更新,最好从 SwingWorker 开始,否则 Swing GUI 将卡住,直到 JDBCJTables 更新结束

  4. 注意,这两段代码都是代码示例,必须将所有 Xxx.close() 移动到(添加创建新的)finally block (尝试 - 捕获 - 最后)

关于java - 使用 JButton 更新 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13699121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com