Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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 TableModel创建addRows()方法_Java_Swing_Tablemodel - Fatal编程技术网

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

Java 为自定义JTable TableModel创建addRows()方法,java,swing,tablemodel,Java,Swing,Tablemodel,下面我的解释是漫无边际的,直截了当的,有没有一种方法可以在不触发事件的情况下添加一行,这样我就可以添加多行并触发一个事件来同时更新所有行?不必添加代码来包含自定义模型中的表数据 我有一个自定义TableModel,它是从DefaultTableModel扩展而来的,这样我就可以使用DefaultTableModel来跟踪数据,同时还有一些我自己的自定义方法 问题是,当我希望添加多行时,我认为使用“addRows(String[][]val)”方法可能会更快。然后,我可以触发一个事件,可能是fir

下面我的解释是漫无边际的,直截了当的,有没有一种方法可以在不触发事件的情况下添加一行,这样我就可以添加多行并触发一个事件来同时更新所有行?不必添加代码来包含自定义模型中的表数据

我有一个自定义TableModel,它是从DefaultTableModel扩展而来的,这样我就可以使用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>});
我可以很容易地将其编码。问题是,“super.addRow(vals);”行每次都会触发一个事件。有没有一种方法,在不添加代码的情况下,让我的模型包含表数据本身,以防止每次添加行时触发该事件?这样它就可以等待addRows方法中的fireTableDataChanged()调用了吗

作为参考,我的自定义表格模型的代码如下:

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();
}
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();
}
}
导入java.awt.Color;
导入java.util.ArrayList;
导入javax.swing.UIManager;
导入javax.swing.table.DefaultTableModel;
公共类dgvTableModel扩展了DefaultTableModel{
//私有DataTableVals=新DataTable();
私有数组列表行颜色;
//private ArrayList data=new ArrayList();
//默认构造函数没有要开始的数据。
私有int[]可编辑列名称;
公共dgvTableModel(字符串[]colNames,int rowCount)
{
super(colNames、rowCount);
}
公共dgvTableModel(字符串[]colNames,int rowCount,字符串[]editableColNames)
{
super(colNames、rowCount);
//this.tableVals.setColNames(colNames);
if(editableColNames!=null&&editableColNames.length>0)
{
editableColumnNames=newint[editableColNames.length];
整数计数=0;
for(int i=0;i0)
{
editableColumnNames=newint[editableColNames.length];
整数计数=0;
如果(颜色变化)
{
rowColors=newarraylist();
}
for(int i=0;i0)
{
for(int-colID:editableColumnNames)
{
if(列==colID)
返回true;
}
}
返回false;
}
公共void setRowColor(int行,c色)
{
rowColors.set(row,c);
防火表ROWSUPDATED(世界其他地区,世界其他地区);
}
公共颜色getRowColor(int行)
{
返回rowColors.get(row);
}
@凌驾
公共类getColumnClass(int列)
{
返回字符串.class;
}
@凌驾
公共字符串getValueAt(int行,int列)
{
返回super.getValueAt(行、列).toString();
}
}

当然,为显示每一行触发一个事件要比为每一行触发一个事件快?

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


然后,你所做的可能是过早的优化。除非您的JTable中有5000条记录,否则这可能不会引起注意。但是,如果您的JTable中有大量记录,那么您可能更愿意延迟加载它们。

是的,这些JTable将(或至少应该)永远不会有超过10条记录,除了少数记录,它们永远不会有超过30-50条记录。我对fireTableRowsInserted的理解是,如果我使用DefaultTableModel的addRow函数,它将在addRow函数启动自己的函数后启动。我无法直接从自定义模型访问DefaultTableModel中的数据。据我所知,至少.JTables仍然可以快速处理成千上万条记录。它们写得很快,也很好。当上面有几千条记录时,你应该只关注上面的内容。在您的情况下,这是一种过早的优化,您只需为每一行调用fireTableDataChanged并使用它即可:-)即使它将包含500行,也不会产生明显的影响。作为测试,在本例中更改
N_行