标签: tablemodel

在对JTable进行排序后,JTable和DefaultTableModel的行索引失去了同步

JAVA NETBEANS

// resultsTable, myModel
JTable resultsTable;
DefaultTableModel myModel; //javax.swing.table.DefaultTableModel
myModel = (DefaultTableModel) resultsTable.getModel();

// event of clicking on item of table
String value = (String) myModel.getValueAt(resultsTable.getSelectedRow(), columnIndex)
Run Code Online (Sandbox Code Playgroud)

我使用JTable和DefaultTableModel来查看各种信息的表,我想获得表的所选索引的某个列的值.

我上面编写的代码工作正常,除非:我使用GUI的类型(单击我要在表上排序的字段名称)表格已正确排序但在此之后,当我选择一行时,它获取的值排序前的那一行.这意味着在排序(使用JTable的GUI)之后,'myModel'和'resultsTable'对象具有不同的行索引.

我如何同步这两个?

java sorting synchronization jtable tablemodel

3
推荐指数
1
解决办法
6548
查看次数

JTable,TableModel和TableColumnModel - 发生了奇怪的事情

我正在为我的客户开发一个服务器JTable.

当我开始使用表模型时,我刚刚完成了列模型.与表模型中的列相关的大多数函数实际上是列模型中函数的别名.

无论如何,发生了一些奇怪的事情.我希望有人可以帮助我:

  1. JTable正确显示列.这意味着getColumnCount和getColumnName正常工作.

  2. 行数正确显示.这意味着getRowCount正常工作.

  3. 正确显示每行的单元格数,因为表模型中的"getColumnCount"会返回列模型中getColumnCount的值.

现在,出现了奇怪的事情:

每行的第一个单元格的值是正确的.但对同一行中的所有其他单元格保持不变.

我假设,就像你们大多数人已经做过的那样,getValueAt中有一些错误.因此,我决定在呈现表格后对其进行硬编码.并猜测:价值回归正确.

经过一些调试后,我发现它的JTable调用'getValueAt(rowIndex,0)',而不是'getValueAt(rowIndex,columnIndex)'.

谁能帮我这个?最好的祝福...

表模型

/**
 * Returns the value to be displayed for this column at this row index.
 * @param rowIndex
 * @param columnIndex
 * @return
 */
public Object getValueAt(int rowIndex, int columnIndex) {
    System.out.println(String.format("LOS_TableModel: getValueAt(%d, %d)", rowIndex, columnIndex));
    LOS_TableCell cell = this.getCell(columnIndex, rowIndex);
    if(cell == null) return null;
    else return cell.value;
}

/**
 * Returns the LOS_TableCell at the specified JTable indexes
 * @param index
 * @return
 */
public LOS_TableCell …
Run Code Online (Sandbox Code Playgroud)

java swing jtable tablemodel

3
推荐指数
1
解决办法
4359
查看次数

使JTable单元不可编辑

当用户双击时,我试图使JTable的所有单元格都不可编辑.我已经阅读了很多论坛帖子,一般的共识是创建一个新的表模型类,扩展DefaultTableModel然后重写方法isCellEditable(int row,int column).我做了所有这些,现在当我运行我的程序(小程序)时,没有任何东西出现在单元格中.注意我这个学期有一个教授不认为applet已经过时了...

表模型的代码:

public class MyTableModel extends DefaultTableModel
{
    public boolean isCellEditable(int row, int column)      //override isCellEditable
    //PRE:  row > 0, column > 0
    //POST: FCTVAL == false always
    {
        return false;
    }
}

    Code in my class:  **NOTE** this class extends JPanel 

    private JScrollPane storesPane;                
    private JTable storesTable; 

    Code in the Constructor:             

    storesTable = new JTable(tableData, COL_NAMES);    //tableData and COL_NAMES are passed in
    storesTable.setModel(new MyTableModel());

    storesPane = new JScrollPane(storesTable);
    storesTable.setFillsViewportHeight(true);
    add(storesPane, BorderLayout.CENTER);     
Run Code Online (Sandbox Code Playgroud)

希望你们中的一些Java大师可以找到我的错误:)

java swing jtable tablemodel

3
推荐指数
1
解决办法
9086
查看次数

JTable不保存编辑更改

我想设计这个JTable.

在此输入图像描述

目标是用户能够通过双击来编辑单元格.任何更改都应该能够保存并稍后存储在数据库中.

我的代码如下:

public class BirthGUI extends JFrame implements TableModelListener {

//..//

//-------------------- BIRTH TABLE --------------------

                table = new JTable();
                table.setModel(myModel);
                myModel.reloadBirthJTable();

                table.getColumnModel().getColumn(0).setPreferredWidth(100);
                table.getColumnModel().getColumn(1).setPreferredWidth(80);
                table.getColumnModel().getColumn(2).setPreferredWidth(115);
                table.setRowHeight(20);

                JScrollPane scroller = new JScrollPane(table );
                table.setBounds(49, 85, 295, 374);

                            table.getModel().addTableModelListener(this);


                panel.add(scroller,BorderLayout.CENTER); 

        @Override
        public void tableChanged(TableModelEvent e) {
            System.out.println("TableModelEvent triggered!");
            int row = e.getFirstRow();
            int column = e.getColumn();
            Object test = myModel.getValueAt(row, column);      
            System.out.println("row: " + row + " column: " + column);   
            System.out.println(test.toString());
        }
Run Code Online (Sandbox Code Playgroud)

和我的TableModel:

public class BirthTableModel extends DefaultTableModel {

        private String[] …
Run Code Online (Sandbox Code Playgroud)

java swing edit jtable tablemodel

3
推荐指数
1
解决办法
3361
查看次数

JTable过滤问题

这是我的场景:我对一个应用程序有3个视图,其中2个是相同的,除了1个东西 - 一个有额外的过滤.所有视图都使用相同的模型,因为它们以(有些)不同的方式显示相同的数据.两个相似的视图都是JTable,如下所示:

  • 查看1过滤基本级别的结果
  • 视图2(应该)首先在同一基本级别上进行过滤,也可以在更细粒度的级别上进行过滤

我可以为第二个视图创建过滤器,但由于两个视图都使用相同的模型(实现了TableModel),因此它们在数据模型中调用相同的函数getValueAt(int rowIndex, int columnIndex)- 目前只在基本级别上进行过滤.

在不影响第一个视图的情况下,另外过滤第二个视图的最简单方法是什么?我将如何实现这一目标?

提前致谢.

java swing filtering jtable tablemodel

2
推荐指数
1
解决办法
307
查看次数

找不到ArrayIndexOutOfBoundsException:6> 1意味着什么?在排序jtable时

我在jtable排序机制中找不到问题,当我在搜索代码中实现排序时,它给出了数组索引超出范围,填充表代码在初始阶段工作正常,但在搜索发生后它也被卡住了.

我的应用程序有一个文本字段区域,它接受从数据库搜索的关键字.现在搜索后,它会在jtable上显示它,我想为它提供表格分类器.任何帮助表示赞赏.thks.我还提供了下面的堆栈跟踪.

//问题代码

// for searching data from data base and display it in table
// according to the keyword typed.

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       

    System.out.println(evt.getKeyCode());

    if(evt.getKeyCode() == KeyEvent.VK_ENTER){
    jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null}
            },
            new String [] {
                "cust_ID", "Title 2", "Title 3"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
    jTable1.removeColumn(jTable1.getColumnModel().getColumn(0));
    String query = "SELECT …
Run Code Online (Sandbox Code Playgroud)

java swing jtable tablerowsorter tablemodel

2
推荐指数
1
解决办法
2369
查看次数

JTable单元格渲染器跳过布尔列

下面是我的照片JTable.我的问题是第4列中没有每隔一行的蓝色背景.我的表格模型和单元格渲染器也在下面.

在此输入图像描述

表型号:

public class MyTableModel extends DefaultTableModel {
    public int getColumnCount() {
        return columnNames.length;
    }

    public String getColumnName(int column) {
        return columnNames[column];
    }

    public int getRowCount() {
        return data.length;
    }

    public Object getValueAt(int row, int column) {
        return data[row][column];
    }

    public Class getColumnClass(int column) {
        return (getValueAt(0, column).getClass());
    }

    public void setValueAt(Object value, int row, int column) {
        data[row][column] = value;
    }

    public boolean isCellEditable(int row, int column) {
        return (column == 3);
    }
    }
Run Code Online (Sandbox Code Playgroud)

细胞渲染器:

    private class …
Run Code Online (Sandbox Code Playgroud)

java swing jtable tablecellrenderer tablemodel

2
推荐指数
1
解决办法
3979
查看次数

从Objects的ArrayList创建JTable - Java

如何在JTable中显示"Click"对象?

ArrayList<Click> myClicks = new ArrayList<Click>();

Click click = new Click(620, 1028);
Click click2 = new Click(480, 230);

myClicks.add(click);
myClicks.add(click2);
Run Code Online (Sandbox Code Playgroud)

它应该看起来像这样:

|---Mouse X---|---Mouse Y---|
|     620     |     1028    |
|     480     |      230    |
Run Code Online (Sandbox Code Playgroud)

哪个真的......

       |              |
       v              v
  click.getX()  click.getY()
  click2.getX() click2.getY()
Run Code Online (Sandbox Code Playgroud)

我不想使用2D Object [] [],因为尽可能将它们保持为Click对象更有意义.

我知道我可能需要扩展TableModel接口,但我不确定如何.

我想请一个快速而简单的例子(java文档有点令人困惑).

java swing jtable arraylist tablemodel

2
推荐指数
1
解决办法
2万
查看次数

用户对列进行排序后访问隐藏的 JTable 模型列

我有一个JTable被调用的transactionList,每一行代表一个Transaction,其中第一列保存实际Transaction对象,随后的每个列显示有关 的一些数据Transaction

我不希望该Transaction对象向用户显示,因此我将其从以下位置中删除ColumnModel

TableColumnModel cm = transactionList.getColumnModel();
cm.removeColumn(cm.getColumn(0));
transactionList.setColumnModel(cm);
Run Code Online (Sandbox Code Playgroud)

这非常有效,然后我可以Transaction使用以下方法检索所选内容:

(Transaction) transactionList.getModel().getValueAt(transactionList.getSelectedRow(), 0))
Run Code Online (Sandbox Code Playgroud)

当用户对表中的列进行排序时,问题就出现了,然后所选的行无法正确匹配。我通过更改上面的行来解决这个问题,以便我们直接从表中而不是从模型中获取所选行:

(Transaction) transactionList.getValueAt(transactionList.getSelectedRow(), 0));
Run Code Online (Sandbox Code Playgroud)

但现在 0 列不是我的隐藏Transaction对象,而只是它的第一个字段。


我也会尝试用另一种方式来解释。

在不允许对 JTable 列进行排序的情况下,这两个示例都有效:

1) 在第一列中显示 Transaction 对象(不要从 ColumnModel 中删除)

可以通过以下方式检索 Transaction 对象:

transactionList.getValueAt(transactionList.getSelectedRow(), 0));
Run Code Online (Sandbox Code Playgroud)

2) 在第一列中显示 Transaction 对象(从 ColumnModel 中删除)

可以通过以下方式检索 Transaction 对象:

transactionList.getModel().getValueAt(transactionList.getSelectedRow(), 0))
Run Code Online (Sandbox Code Playgroud)

如果我现在允许对列进行排序,#1 仍然有效。然而,方法 #2 现在将 JTable.getSelectedRow() 传递给 TableModel.getValueAt()。但这些索引不再相等,问题是 JTable 和 ColumnModel 不包含 Transaction 对象(只有 TableModel 包含)。

transactionList.getColumnCount(); …
Run Code Online (Sandbox Code Playgroud)

java swing model jtable tablemodel

2
推荐指数
1
解决办法
2652
查看次数

如果不可见,TableModel fire方法很昂贵

在java swing tablemodel中,我们可以触发表更改,添加,删除等.我想知道如果组件不可见,这些方法调用是否很昂贵?

例如,另一个窗口覆盖它.或者它处于非活动选项卡中.

java swing tablemodel

2
推荐指数
1
解决办法
57
查看次数