Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用自定义渲染器初始化动态JTable的最佳方法是什么?_Java_Swing_Jtable_Initialization_Tablecellrenderer - Fatal编程技术网

Java 使用自定义渲染器初始化动态JTable的最佳方法是什么?

Java 使用自定义渲染器初始化动态JTable的最佳方法是什么?,java,swing,jtable,initialization,tablecellrenderer,Java,Swing,Jtable,Initialization,Tablecellrenderer,目前,我在我的JPanel中初始化了我的JTable,如下所示: private ArrayData data; private JTable table; private CustomTableModel model; public ExtendedJPanel() { data = ArrayData.getData(); model = new CustomTableModel(data); table = new JTable(model); Tab

目前,我在我的
JPanel
中初始化了我的
JTable
,如下所示:

private ArrayData data;
private JTable table;
private CustomTableModel model;

public ExtendedJPanel() {
    data = ArrayData.getData();

    model = new CustomTableModel(data);
    table = new JTable(model);

    TableColumn col = table.getColumnModel().getColumn(0);
    col.setCellRenderer(new Column0Renderer());
    col = table.getColumnModel().getColumn(1);
    col.setCellRenderer(new Column1Renderer());

    // do some other stuff
}
当我想修改
JTable

我通过创建一个新的
对象[][]
数组,并为我的所有单元格调用
fireTableCellUpdated(行、列)
直接与
TableModel
交互

我的问题是,在我的程序中的某个时刻,我的
JTable
丢失了它的自定义渲染器

我被告知这是因为它正在更新
TableColumnModel

初始化
JTable
以使
CellRenderers
保持不变的最佳方法是什么 在
JTable
的整个生命周期内保持不变

当我想修改表中的所有值时,我直接与TableModel交互,方法是创建一个新的对象[][]数组,并为我的所有单元格调用fireTableCellUpdated(行、列)

不,您不应该直接调用
fireTableCellUpdated(…)
。这就是TableModel的工作。对数据的更改应该通过TableModel完成,而不是像阵列这样的外部数据存储

如果要更改表中的数据,请使用TableModel的setValueAt(…)方法

您始终可以向自定义TableModel添加一个重置内部数据的
clear(…)
方法

初始化JTable以使CellRenderer在JTable的整个生命周期内保持不变的最佳方法是什么

取决于你所说的初始化。使用DefaultTableModel时,您可以只使用:

model.setRowCount(0);
所有的数据都被删除了

然后可以使用
addRows(…)
方法动态添加数据

我的问题是,在我的程序中的某个时刻,我的JTable丢失了它的自定义渲染器。我被告知这是因为它正在更新TableColumnModel

是的,每当你做以下事情时:

table.setModel(...);

将创建一个新的TableColumnModel,您将丢失自定义渲染。使用我上面的建议不会有问题,因为您没有更改表的“结构”(只是删除了数据),所以不需要重新创建TableColumnModel。

我从来没有调用过
table.setModel(…)我拥有的是
表格模型中的一个自定义方法
,它将旧的
对象[]【】
替换为新的
对象[]【】
。所以我的桌面模型保持不变。我主要关心的是模型更改和渲染器丢失。我不知道为什么会这样,因为我认为我在任何时候都不会重新验证表我说的是“类似”。如果不执行此操作,则在调用导致重新创建TableColumnModel的fireXXX()方法时交换代码。自定义TableModel中的代码导致了问题。因此,我可以安全地假设调用
fire…()
方法对于手动调用通常是不安全的吗?不,它们不是不安全的,它们是必要的,以便在进行更改时重新绘制表本身。但是它们应该只由TableModel调用,因为只有TableModel应该知道数据何时更改。问题是TableModel代码调用了错误的fireXXX()方法。因为你已经发布了你的自定义表格模型,我们无法猜测你在做什么。如果你想得到别人的帮助,那么在你发布问题的时候就发布一个合适的帖子。