Java:在子jDialog

时间:2017-05-29 12:16:29

标签: java mysql swing netbeans-8

我已经围绕这个调查了很多不同的问题和答案,但是找不到一个似乎有用的问题。

我是Java的新手,但是有各种不同语言的经验,到目前为止(在我试验的内容中),它感觉有点像VBA,除了必须建立你认为应该已经存在的动作/功能。我希望这可以归结为我自己的缺乏经验。

我使用 Netbeans IDE 8.2 和Java Runtime 1.80。

我创建了包含jTable的jFrame。 jTable使用如下数据构建:

public void showTasks(Boolean removeID) {
    ArrayList<Tasks> list = tasksList("SELECT * FROM tasks");
    JTable table = jTable1;
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    Object[] row = new Object[4];
    for(int i=0;i<list.size();i++) {
        row[0]=list.get(i).getId();
        row[1]=list.get(i).getName();
        row[2]=list.get(i).getDesc();
        row[3]=list.get(i).getDate();
        model.addRow(row);
    }
    // Remove the 'id' column from the table view 
    if(removeID) {    table.removeColumn(table.getColumnModel().getColumn(0)); }
}

背后的背景不太相关,但本质上tasksList是一个将查询应用于SQL语句并返回ArrayList的函数。我用4列构建我的行,然后删除第一列,以便ID&#39; ID&#39;可用但不可见(此最终操作已通过测试/实验分离)。

我有另一个代码区域,当单击一行时会打开一个jDialog,可以更新MySQL DB。

问题

我试图投入一个函数调用,以便表数据刷新&#39;当jDialog关闭时。我暂时在一个按钮中添加了jFrame(jTable所在的位置)来测试/调试这个函数。

但是,我似乎无法让它发挥作用。我最接近的是重新调用showTasks(false),但这显然只是添加了包含更新数据的行,而不是替换数据集。我不是100%确定是否删除了所有行,然后重新构建它们是最佳做法&#39;。

由于我是Java的新手,并且可能仍然从一种有缺陷的思维方式来看待它,我发现很难将任何其他示例应用于我自己的示例。我似乎无法找到实施fireTableDataChanged()的方法。

当然,这是一个我过度思考的简单概念?

编辑 - 基于以下答案

有没有理由认为这样的事情被认为是不正确的,如果删除所有行并将它们重新添加就可以了?

public void refreshTasks() {
    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    int row_total = model.getRowCount();
    for(int i= row_total -1;i>=0;i--) {
        model.removeRow(i);
    }
 showTasks(false);
}

编辑:调用数据更新的按钮

现在使用以下内容正确(如果不正确):

private DefaultTableModel parentTable;      // To store the parent 'Task' table model

public void setStart(int user,DefaultTableModel table) {

  this.txt_taskID.setText(Integer.toString(user)); // Converts the ID to a string
  addData(user);          // Populates the fields
  parentTable = table;    // Sets parent TableModel to a variable

}

打开Dialog时,从Parent jFrame调用上面的代码,并传递Table模型和&#39; ID&#39;我希望编辑的那一行。表模型存储在parentTable

还有一个&#39; Save&#39;按钮和取消&#39;按钮。我还没有将这些内容分开,目前正在保存&#39;就是这样(SQL更新等)。我的取消&#39;按钮关闭对话框并刷新jTable,如下面的函数:

private void btn_CancelActionPerformed(java.awt.event.ActionEvent evt) { 

    this.setVisible(false);            // Hide the dialog
    Menu menu = new Menu();            // for accessing the tasksList function

    parentTable.setRowCount(0);        // Clears the jTable data

    // jTable data is then 'rebuilt' using the new data

    ArrayList<Tasks> list = menu.tasksList("SELECT * FROM tasks");
    Object[] row = new Object[4];
    for(int i=0;i<list.size();i++) {
        row[0]=list.get(i).getId();
        row[1]=list.get(i).getName();
        row[2]=list.get(i).getDesc();
        row[3]=list.get(i).getDate();
        parentTable.addRow(row);
    }
} 

2 个答案:

答案 0 :(得分:2)

  

我不是百分百肯定如果删除所有行,然后重新构建它们是'最佳实践'。

是的,这可能是最好的做法。

唯一的另一种方法是创建一个全新的TableModel并使用setModel()方法将其添加到表中。这种方法的问题在于它会重置您在桌面上设置的任何自定义渲染器/编辑器。

从DefaultTableModel中删除所有行的最简单方法是使用:

model.setRowCount(0);

答案 1 :(得分:-1)

我不确定你想怎么做但是我会给你一个简单的例子来删除和刷新JTable也许它对你有帮助。

以下btnDelete Jbutton添加到JFrame以删除表中的行:

btnDelete.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int rowIndex = table.getSelectedRow();
            if(rowIndex > -1) {
                int x = (Integer) table.getModel().getValueAt(rowIndex, 0);
                if (conn.removeContact(x) == true) { //here add your own code like removeID

                    model.removeRow(rowIndex);
                    lblInfo.setText("Contact deleted successfully.");
                    model.fireTableDataChanged();
                } else {
                    lblInfo.setText("Cannot remove at this time!");
                }
            }else {
                lblInfo.setText("At first you need select a row with single click!");
                return;
            }
        }
    });

以及以下代码以原始方式刷新表:

btnRefresh.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int rowCount = model.getRowCount();
            for (int i = rowCount - 1; i >= 0; i--) {//remove all rows

                model.removeRow(i);
            }
            lblInfo.setText("Table datas updated successfully.");

            for (Person p : conn.readAllContacts()) {//add all row from scratch
                model.addRow(new Object[] { p.getId(), p.getName(), p.getLastName(), p.getPhone(), p.getEmail() });
            }

        }
    });