gpt4 book ai didi

java - 为自定义 JTable TableModel 创建 addRows() 方法

转载 作者:行者123 更新时间:2023-11-30 04:47:53 28 4
gpt4 key购买 nike

我在下面的解释是,归结起来,有没有一种方法可以在不触发事件的情况下添加行,这样我就可以添加多行并触发事件来一次更新所有行?无需添加代码来包含自定义模型中的表数据?

我有一个从 DefaultTableModel 扩展而来的自定义 TableModel,这样我就可以使用 DefaultTableModel 来跟踪数据,同时仍然拥有一些我自己的自定义方法。

问题是,当我希望添加多行时,我认为使用“addRows(String[][] val)”方法可能会更快。然后我可以触发一个事件,可能是 fireTableDataChanged() 来一次更新所有行。比如我现在的方法:

JTable table1 = new JTable(new dgvTableModel(new String[] {<values>},0, new String[] {<values>}));
table1.addRow(new String[] {<values here>});
table1.addRow(new String[] {<values here>});
table1.addRow(new String[] {<values here>});

然后我会根据需要多次重复上述内容。问题是,每个事件都会触发一个单独的事件。如果我可以使用自定义表格模型来完成此操作,那么速度会快得多(我认为):

JTable table1 = new JTable(new dgvTableModel(new String[] {<values>},0, new String[] {<values>}));
table1.addRows(new String[][] {{<values1 here}, {values2 here}, . . .}});

然后在表模型中:

public void addRows(String[][] values) {
for (String[] vals : values)
super.addRow(vals);
}
fireTableDataChanged();
}

我可以轻松地对此进行编码。问题又是“super.addRow(vals);”线路每次通过都会触发一个事件。有没有一种方法,无需添加代码即可让我的模型包含表数据本身,以防止每次添加行时触发该事件?这样它就会等待 addRows 方法中的 fireTableDataChanged() 调用?

作为引用,我的自定义表格模型的代码:

import java.awt.Color;
import java.util.ArrayList;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableModel;

public class dgvTableModel extends DefaultTableModel {
//private DataTable tableVals = new DataTable();
private ArrayList<Color> rowColors;

//private ArrayList<Object[]> data = new ArrayList<>();
//default constructor has no data to begin with.
private int[] editableColumnNames;

public dgvTableModel(String[] colNames, int rowCount)
{
super(colNames, rowCount);
}

public dgvTableModel(String[] colNames, int rowCount, String[] editableColNames)
{
super(colNames, rowCount);
//this.tableVals.setColNames(colNames);
if (editableColNames!=null && editableColNames.length >0)
{
editableColumnNames = new int[editableColNames.length];
int count = 0;
for (int i =0; i< editableColNames.length;i++)
{
for (String val : colNames)
{
if (val.equalsIgnoreCase(editableColNames[i]))
{
editableColumnNames[count] = i;
count+=1;
break;
}
}
}
}
}

public dgvTableModel(String[] colNames, int rowCount, String[] editableColNames, boolean colorChanges)
{
super(colNames, rowCount);
Color defColor = UIManager.getDefaults().getColor("Table.background");
if (editableColNames!=null && editableColNames.length >0)
{
editableColumnNames = new int[editableColNames.length];
int count = 0;
if (colorChanges)
{
rowColors = new ArrayList<>();
}
for (int i =0; i< colNames.length;i++)
{
if (colorChanges)
{
rowColors.add(defColor);
}

for (String val : editableColNames)
{
if (val.equalsIgnoreCase(colNames[i]))
{
editableColumnNames[count] = i;
count+=1;
break;
}
}
}
}
else if (colorChanges)
{
rowColors = new ArrayList<>();
for (String val : colNames)
{
rowColors.add(defColor);
}
}
}

@Override
public boolean isCellEditable(int row, int column)
{
if(editableColumnNames!=null && editableColumnNames.length >0)
{
for (int colID : editableColumnNames)
{
if (column==colID)
return true;
}
}
return false;
}

public void setRowColor(int row, Color c)
{
rowColors.set(row, c);
fireTableRowsUpdated(row,row);
}

public Color getRowColor(int row)
{
return rowColors.get(row);
}

@Override
public Class getColumnClass(int column)
{
return String.class;
}

@Override
public String getValueAt(int row, int column)
{
return super.getValueAt(row, column).toString();
}
}

触发一个事件来显示每一行肯定比为每一行触发一个事件更快吗?

最佳答案

'AbstractTableModel.fireTableDataChanged()' 用于向模型(以及模型通知的 JTable UI)指示表中所有可能的数据可能已更改并需要检查。这可能(重点是可以)是一项昂贵的操作。如果您知道添加了哪些行,只需使用“AbstractTableModel.fireTableRowsInserted(int firstRow, int lastRow)”方法即可。这将确保只有效果行被视为更改。看看 AbstractTableModel 中的所有 fire* 方法。您确实可以对哪些行、单元格等被视为脏的进行细粒度控制。

话又说回来,你所做的可能是过早优化。除非您的 JTable 中有五万条记录,否则这可能不会引起注意。但如果您的 JTable 中有大量记录,您最好还是延迟加载它们。

关于java - 为自定义 JTable TableModel 创建 addRows() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10570531/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com