【发布时间】:2018-10-01 20:37:08
【问题描述】:
我正在尝试使用另一个站点的示例来弄清楚如何在模型发生更改后更新表格窗口。一切正常,但是一旦表格模型发生更改,我不知道如何刷新窗口。
编辑:我使用了 Bell 的建议并重新安排了一些事情,以便构造函数调用我的 getmodel3 方法来填充表格。我以为我可以使用 setmodel 方法来更改模型并更新表格,但它并没有像我想象的那样工作。以下是我认为会发生但没有发生的情况:
-
main方法使用从getmodel3方法传递的模型创建表的新实例。 - 构建表后,我调用
setmodel方法,使用getmodel4返回的模型将不同的数据加载到新模型中。 - 第 1 步中的实例使用新模型数据进行更新,新数据显示在表格中。
实际发生的情况是,创建了一个新实例并使用从 getmodel3 返回的模型,然后 setmodel 方法运行并从不同的数据集更新模型变量,但表格没有显示改变。
public class myTable extends JFrame
{
public volatile DefaultTableModel model = (DefaultTableModel) myTable.getmodel3();
public void setmodel(DefaultTableModel newModel)
{
this.model = newModel;
}
public myTable()
{
JTable table = new JTable( model );
JScrollPane scrollPane = new JScrollPane( table );
getContentPane().add( scrollPane );
JPanel buttonPanel = new JPanel();
getContentPane().add( buttonPanel, BorderLayout.SOUTH );
}
public static void main(String[] args)
{
myTable frame = new myTable();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
frame.setmodel(getmodel4());
}
这里是getmodel3,它与getmodel4 相同,只是它们指向不同数据的不同数据库文件。
public static DefaultTableModel getmodel3(){
Vector<Object> columnNames = new Vector<Object>();
Vector<Object> data = new Vector<Object>();
try
{
// Connect to an Access Database
String url = "jdbc:sqlite:c:\\sqlite3\\test.db";
Connection conn = DriverManager.getConnection(url);
// Read data from a table
String sql = "Select * from Tasks";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
// Get column names
for (int i = 1; i <= columns; i++)
{
columnNames.addElement( md.getColumnName(i) );
}
// Get row data
while (rs.next())
{
Vector<Object> row = new Vector<Object>(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)
{
System.out.println( e );
}
// Create table with database data
DefaultTableModel model = new DefaultTableModel(data, columnNames)
{
@Override
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;
}
};
System.out.println("got model");
return model;
}
【问题讨论】:
-
这项技术已经死了。
-
要么创建新的
TableModel并应用于现有的JTable,要么更新模型本身的数据 -
我可以更新模型中的数据,但表格没有显示更改。
标签: java jframe refresh defaulttablemodel