- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在下面的解释是,归结起来,有没有一种方法可以在不触发事件的情况下添加行,这样我就可以添加多行并触发事件来一次更新所有行?无需添加代码来包含自定义模型中的表数据?
我有一个从 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/
我正在寻找类似于Java Swing TableModel的JavaScript MVC表格小部件 我还想要两种模型,一种完全本地的,一种远程的(XMLHttpRequest) 我还希望 View 接
我正在尝试创建一个类似于下面的模型的 JTable: 绿色角基本上是红色列标题和行标题的缓冲区空间。单元格不需要渲染成图中的颜色;但是,它们需要与表中其他“白色”单元格区分开来。 该表也不可编辑或选择
更新: 我找到了 @MadProgrammer 的答案,它成功了! Updating JTable on button click 基本上,您将一个refresh()方法添加到您的TableModel
在我的程序中,我希望在 JTable 中显示一些数据。我有一个包含数据的类,因此在 JTable 中呈现它的最简单方法似乎是扩展我的类,以便它实现 TableModel 接口(interface)并将
我有一个单独的类,它实现用于 JTable 的 TableModel 接口(interface)。我有一个 boolean 列,以一列复选框的形式呈现,我想知道如何通知外部对象某些值需要更新?如果我将
新手寻求帮助:-) 我正在开发一个小项目,以熟悉 Java 桌面开发和数据库连接。 所附代码在实例化后为我提供了一个空的 TableModel,因此 JFrame 中没有显示任何数据。测试类是使用 T
您可以创建表格模型并将其添加到表格中 TableModel tm = new TableModel(); JTable table = new JTable(tm); 但是,如果我初始化一个表 JTa
我正在将数据从 DAO 获取到 GUI 级别。 当我想加载表时,我得到一个空表,仅包含单击的数据库符号的正确行数: 加载我使用的元素: playlistTable.addMouseListener(n
在java swing表模型中,我们能够触发表更改、添加、删除等。我想知道如果组件不可见,这些方法调用是否会很昂贵? 例如,另一个窗口覆盖了它。或者它位于非 Activity 选项卡中。 最佳答案 为
我有一个用于存储数字的 JTable。我实际上只使用表格来查看/排序。即使某些列可能全部都是整数或长整型,为这些列提供 Double 类是否会导致失败(除了可能需要分配更多空间之外)。我可以解析这些数
我正在尝试获取 JTable 的已排序 TableModel,这是通过以下简单的 regex 标准完成的: try { TableRowSorter sortRow = new TableRo
在下面的示例中,一个窗口显示一个表格,其中包含窗口本身的宽度。调整窗口大小时,其宽度值反射(reflect)了当前的真实情况。 这怎么可能? Swing 如何通知表,它应该重新请求模型?或者模型正在接
我有一个使用 setAutoCreateRowSorter(true) 的 JTable 和一个附加的 RowSorterListener,如下所示,因为我需要在我的应用程序的其他地方对某种 JTab
我有课; public class A extends AbstractTableModel { ... } 我使用 ResultSetMetaData 构建 TableModel 以匹配数据库中的
我需要将繁重的数据集加载到 QTableView 中。数据集在内存中不小于 700Mb,我不想将其全部加载到内存中。 QSqlQueryModel 对我来说并不理想,原因有两个 - 它不可编辑,也不是
我的 TableModel实现通常位于 ArrayList以实现高效的随机访问性能。然而,ArrayList的 remove(int)实现看起来相当低效,因为它涉及制作 System.arrayCop
我有一个简单的 Java 桌面应用程序,它显示带有自定义 TableModel 的 JTable。 在 boolean 变量的基础上,我想显示一个具有不同列的表。但我无法做到这一点。 This is
我面临 JTable 和与其关联的 TableModel 的问题。这里的问题是,假设如果我在 JTable 上进行行选择,我想从 TableModel 获取特定的行对象并将其传递到某个地方。有谁知道如
我创建了一个包含人员列表的 JTable。一个 Person 总是可以包含另一个 Person(或者可能是它自己)。因此,用户可以单击该列,然后会出现一个 JComboBox。此 JComboBox
我有一个jTable,它根据一些jComboBox加载搜索结果。我使用 DefaultTableModel 来实现此目的,对于其他 jTable,我使用 TableModel。 搜索后,jTable
我是一名优秀的程序员,十分优秀!