java - JTable 在更改时加载值,加载时显示进度条

标签 java swing jtable tablemodel tablecellrenderer

所以我正在使用JTable,它有列A-K。其中 AB 是唯一可编辑的。如果有人编辑 A 中的空行,我会进行 API 调用以获取 B,然后进行数据库调用以获取 B 所在的所有行存在。如果有人编辑 B 中的空行,我会进行相同的调用,也会从数据库中检索该行。该调用返回 0-N 行。如果返回 0 行,我将除 B 之外的所有行的值更改为 N/A,否则我使用数据填充行。填充后,我使所有列不可编辑。数据库调用发生在它自己的线程中,因为一旦调用返回,我就会创建自己的记录对象,并将其添加到表模型中。

我有自己的 TableModel 和一个 TableModelListener 来保存数据并处理值的更改。

这是我的问题。我正在使用 TableCellRenderer 并使用 cellrenderer 来查看值是否已更改,如果是,则我进行调用并根据需要进行填充。当从数据库中提取大量行时,需要一段时间才能加载并生成所有记录,因此我尝试使用 ProgressBar 向用户显示屏幕不仅仅是卡住,它正在进步以及进步了多少。然而出现的框架是空白的并且没有任何显示。我感觉我做的事情要么不正确,要么遗漏了一些东西。非常感谢任何帮助。

一些代码来理解我在说什么

public class MyPanel extends JPanel {
    private JTable myTable;
    private MyTableModel tm;
    //OTHER FIELDS

    public static void createPanel() {
           tm = new MyTableModel(columnnames);
           myTable = new JTable(tm);

           TableColumn account = myTable.getColumnModel().getColumn(
            MyTableModel.ACCOUNT_INDEX);
    account.setCellRenderer(new MyTableRenderer(
            MyTableModel.ACCOUNT_INDEX));
    }
}

public class MyTableRenderer extends DefaultTableCellRenderer{

   protected int interactiveColumn;

   public MyTableRenderer(int interactiveColumn) {
        this.interactiveColumn = interactiveColumn;
    }

   public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value,
                isSelected, hasFocus, row, column);
        if (column == interactiveColumn && hasFocus) {
             //DO DB and API CALLS HERE
             //IF DB CALL DISPLAY A NEW FRAME WITH PROGRESSBAR
        }
        return c;
   }
}

抱歉,格式问题

最佳答案

使用SwingWorker ,它允许您在检查结果集时更新 TableModel

附录:不要尝试从渲染器更新TableModel。当 CellEditor 的实现结束时,您可以通过在 getCellEditorValue() 中启动合适的工作线程来更新模型。这样,当下次为任何修改的单元调用渲染器时,修改后的数据将可用。此相关example概述了该方法。

附录:getCellEditorValue() 在编辑结束后调用,但在 setValueAt() 中启动工作程序可以更可靠地访问目标行和列。

关于java - JTable 在更改时加载值,加载时显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115564/

相关文章:

java - JTable 中第一个不必要的空行。如何去除它?

Java Swing - JTable 未显示在滚动 Pane 中

java - 如何正确使用 Google Calendar API Events.Insert 命令?

java - repaint() 方法不重新绘制 JPanel

java - 在 Java 中预览和打印通用文本的独立于打印机的方式

java - 如何使光标可以输入 jtextfield 但给它一个文本的唯一方法是单击一个按钮?

java - 将JTable内容保存到文本文件并读取

java - Java 中的选项卡式浏览 session 问题

Java SAX 解析器,如何完全防止字符引用? (DoS 攻击)

java - 像 livejournal 一样显示消息树(java)