如何按下按钮从另一个帧刷新JTable?

时间:2015-02-11 11:46:35

标签: java sqlite netbeans jtable

Java, How to refresh JTable in one frame from another frame

How to refresh a JTable after database operations without frame reload?

我知道有非常类似的问题。但是,所提供的答案都没有解决我的问题。

所以我在Java中有一个处理与几个数据库交互的应用程序。在程序中,您可以添加记录,更改要在Jtable中显示的内容的条件,并编辑已存在的记录(例如,更改客户端的名称)。

Screen shot of my program

当我点击“升序”复选框时,它会按照预期的方式反转行。

It now orders by ASC not DESC as previously.

所以这里JTable会更新,因为我按下复选框或显示的任何其他按钮。

按行时,显示包含该行的更多信息的另一帧。您应该能够将名称/集编辑为完成等等。这是有效的,因为当我检查数据库时,我看到了那一点 我所做的改变已被应用。同样,如果我点击刷新按钮。

The external frame that is summoned so you can edit the row

然而,当我按下“完成/编辑”时,JTable根本不会更新,直到我手动执行某些操作(例如按下刷新按钮)。

以下是外部JFrame中使用的代码。

    private void AlterTransactionMousePressed(java.awt.event.MouseEvent evt) {                                              
    EditTransaction();

}


private void EditTransaction(){
     GUImannager.RefreshServTable();
}

//In the GUImannager class

    public static void RefreshServTable(){
    System.out.println("RefreshServTable Method has been summoned.\n");
    MainGUI.TableRefresher();
    //The MainGUI is a static variable which contains the JFrame object of the main frame that is summoned that contains the core of the programs such as the pictures as i used.
}

TableRefresher方法与单击刷新按钮时使用的方法完全相同。它的作用是启动一个召唤此代码的线程。

//Gets the data from the database based on conditions.
                TableModel model = new DefaultTableModel(TransData, Colnombs);
            ServiceTable.setModel(model);
            ServiceTable.revalidate();
            ServiceTable.repaint();
            TableContainer.setViewportView(ServiceTable);

这段代码通常可行。但是无论何时从外部来源召唤它都根本不起作用。它打印出文本,说明它已被召唤,但在外部召唤时它不刷新表,只有当被同一个JFrame中的某些内容召唤时,例如“刷新”按钮才会起作用。

我已经尝试过将“listnens”代码更改然后更新但是这显然是根据系统调用召唤它并没有按照我想要的方式影响程序。

第二个JFrame在另一个类中,但即使我把它作为子类或在同一个文件中它仍然无法工作,所以我怀疑问题与处理多个JFrame有关。

我知道这是一个非常复杂的问题,虽然问了几乎相同的问题,但它们并没有包含任何对我有用的答案。

手动检索数据,因此表不会“绑定”到任何数据库(这是因为我在SQLite源和MySQL源之间切换)。

如果需要更多信息/代码,我将很乐意提供,任何解决此问题的尝试都将非常感激。如果这是一个简单的问题,我很抱歉,因为我还没有那么多的软件编程经验。

...诚恳

//OrvilleNordström。

1 个答案:

答案 0 :(得分:1)

教程说(http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#fire)如果更改了DataModel,你必须触发事件。据我所知,你每次都创建一个全新的DefaultModel,这不是解决方案。如果发生变化,表正在等待事件。像这样:

  • fireTableCellUpdated
  • fireTableRowsUpdated
  • fireTableDataChanged
  • fireTableRowsInserted
  • fireTableRowsDeleted
  • fireTableStructureChanged

如果您将其中一个事件发送给已注册的侦听器,则表格将显示正确的值。

我认为这不是两帧的问题,而是在更改数据后不告诉gui(JTable)更新它的问题。也许看看这里:create TableModel and populate jTable dynamically