我正在使用一个GUI,该GUI具有一个已手动连接到数据库的表。在该表上方有3个单选按钮,它们将“决定”在提取数据时要使用的条件(所有行都有布尔值,具体取决于所按下的按钮是返回1、0还是全部返回)。



这是表格的代码(注意,我正在使用netbeans gui设计器)

ServiceTable = new javax.swing.JTable();
int radiovalue = 0;
if (RadioActive.isSelected()) radiovalue = 0;
else if (RadioAll.isSelected()) radiovalue = 1;
else if (RadioFinished.isSelected()) radiovalue = 2;
Object[][] DataAct = null;
try {
DataAct = SQL.MYSQL_FETCH_OMNI_DATA(radiovalue);
} catch (Exception ex) {
Logger.getLogger(MainforAdmin.class.getName()).log(Level.SEVERE, null, ex);
}
String[] Colnombs = SQL.MYSQL_ROW_NOMBER();
ServiceTable.setAutoCreateRowSorter(true);

ServiceTable.setModel(new javax.swing.table.DefaultTableModel( DataAct, Colnombs ));

TableContainer.setViewportView(ServiceTable);


这可以正常工作,并且2个外部函数返回使表显示其应显示内容的数组(这是程序启动所有“活动”事务的时候)

但是我希望能够更改表,以便它将评估放射性是否等于0、1或2(该数字将确定函数获取的数据)。该程序通过不同的标准完美地通过System.out.print输出MYSQL表。所以我知道我的功能正在工作。但是我不知道选择另一个单选按钮后如何使整个表“刷新”。

这是我的Mousepressed单选按钮的事件代码。

TableRefresher();
System.out.println("Pressed");


并输出Pressed,所以我知道单击单选按钮后此代码已被召唤。这是TableRefresher函数。

 Write.Echo("The TableRefresher method hath been summoned");
    //This code is going to evaluate which button is selected as of now.
    MainforAdmin table = new MainforAdmin();
    if (table.RadioActive.isSelected()) radiovalue = 0;
    else if (table.RadioAll.isSelected()) radiovalue = 1;
    else if (table.RadioFinished.isSelected()) radiovalue = 2;
    Object[][] DataAct = null; //This code is going to innitialize the tablecontents.
    try {
        DataAct = SQL.MYSQL_FETCH_OMNI_DATA(radiovalue);//This code assigns the table contents And i know this works because it correctly outputs the table with the diffrent where clause (where state = x or the status as you saw on the picture.)
    } catch (Exception ex) {
        Logger.getLogger(MainforAdmin.class.getName()).log(Level.SEVERE, null, ex);
    }
    String[] Colnombs = SQL.MYSQL_ROW_NOMBER(); //Assigns the column names and works is used as the table is created so this works.
    table.TableContainer.remove(table.ServiceTable);
    table.add(table.ServiceTable, null);
    table.ServiceTable.setModel(new javax.swing.table.DefaultTableModel( DataAct, Colnombs ));
    table.ServiceTable.revalidate();
    table.ServiceTable.repaint();
    table.TableContainer.setViewportView(table.ServiceTable);


然而,由于这种方法被召唤(我从控制台输出中知道它),GUI中的JTable不会发生任何事情……它保持不变。

那么,在应用了用于获取数据的不同标准之后,我应该如何刷新表?我在此站点上查看了其他建议,但是这些建议都没有奏效,也没有给我我所需要的建议。

任何答案将不胜感激,如果这是一个简单的问题,请原谅我,我绝不是编程神。

如果有任何区别,则JTable位于滚动窗格中。

真诚的...

// OrvilleNordström。

最佳答案

作为开始:


  如果有任何区别,则JTable位于滚动窗格中。


没错,它必须保持这种方式。解决主要问题没有什么区别。


  那么,在应用了不同的获取数据标准之后,我应该如何刷新表?


代码引用:

table.TableContainer.remove(table.ServiceTable);
table.add(table.ServiceTable, null);
table.ServiceTable.setModel(new javax.swing.table.DefaultTableModel( DataAct, Colnombs ));
table.ServiceTable.revalidate();
table.ServiceTable.repaint();
table.TableContainer.setViewportView(table.ServiceTable);


请注意,这是一种意粉代码,目前尚不清楚要更新的表。但是,更新表的正确方法不是删除/重新创建/重新定位它,而是使用/刷新其表模型。请参见示例here(包括在后台线程中进行数据库调用的SwingWorker),herehere。请看一下这些答案,这里有一些解释可以使您明白这一点。

题外话

查看上面引用的行,我建议您避免使用静态成员。这些是针对非常特殊的情况(即常量)的,而不是针对一般用途的,并且经常破坏封装原理。在这种特殊情况下,它们导致了难以理解的呼叫链,这可能是错误的,并导致意外的难以调试的行为(对我们而言)。

09-11 17:47
查看更多