当前位置: 首页 > 知识库问答 >
问题:

jtable-cell内容在双击时消失

司空炯
2023-03-14

我在JTable上遇到了问题。当我以固定长度的文本字段作为编辑器在单元格中键入时,当达到长度时,我会自动跳到下一行。那样的话,我就可以继续写下去了。之后,当我想更改第一行中的一些文本并双击单元格时,文本将消失。

奇怪的是,当我按“Enter”转到下一行,双击第一行时,文本并没有消失。

private void initialize() {

    vCommentaarHeaders.add(resourceBundle.getString("col_Aan"));
    vCommentaarHeaders.add(resourceBundle.getString("Commentaar"));

    tmCommentaar.addTableModelListener(new CommentaarTableModelListener());

    jtable = new JTable(tmCommentaar);

    //...

    jtable.addMouseListener(new CommentaarTableMouseListener());
    jtable.addKeyListener(new CommentaarTableKeyListener());

    //fill combobox
    //Get saved data
    //Add empty line

    jtable.getColumnModel().getColumn(0).setCellEditor(
            new DefaultCellEditor(cbxAan));
    jtable.getColumnModel().getColumn(1).setCellEditor(
            new DefaultCellEditor(ftfCommentaar));

    //Add table to content pane

}

// MouseListener ....

private class CommentaarTableKeyListener implements KeyListener {

    public void keyTyped(KeyEvent e) {
        if (selectedColumn != jtable.getSelectedColumn()
                || selectedRow != jtable.getSelectedRow()) {
            sCommentaar = (String) ((Vector) vCommentaarData.get(jtable
                    .getSelectedRow())).get(1);
        }

        if (e.getKeyChar() != '\t' || e.getKeyChar() != '\n') {
            if (e.getKeyChar() == '') {
                sCommentaar = sCommentaar.substring(0,
                        sCommentaar.length() - 1);
                selectedColumn = jtable.getSelectedColumn();
                selectedRow = jtable.getSelectedRow();
            } else {
                if (sCommentaar.length() <= 65){
                    sCommentaar = sCommentaar + e.getKeyChar();
                    selectedColumn = jtable.getSelectedColumn();
                    selectedRow = jtable.getSelectedRow();
                }
                else{
                    //addEmptyLine();
                    tmCommentaar.setValueAt(sCommentaar, selectedRow, selectedColumn);
                    selectedColumn = jtable.getSelectedColumn();
                    selectedRow = jtable.getSelectedRow() + 1;
                    String sBestemmeling = (String) ((Vector) vCommentaarData.get(selectedRow-1)).get(0);
                    Vector vHulp = new Vector();
                    vHulp.add(sBestemmeling);
                    vHulp.add("" + e.getKeyChar());
                    sCommentaar = "" + e.getKeyChar();
                    if( vCommentaarData.size() >= selectedRow )
                        vCommentaarData.setSize(selectedRow + 1);
                    vCommentaarData.setElementAt(vHulp, selectedRow);

                    tmCommentaar.fireTableDataChanged();

                    jtable.setCellSelectionEnabled(true);

                    jtable.getCellEditor(selectedRow - 1, selectedColumn).cancelCellEditing();
                    jtable.changeSelection(selectedRow, selectedColumn, false, false);
                    jtable.grabFocus();

                }

            }

        }
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_ENTER){
            if(selectedRow > 0){
                String sBestemmeling = (String) ((Vector) vCommentaarData.get(selectedRow-1)).get(0);
                Vector vHulp = new Vector();
                vHulp.add(sBestemmeling);
                vHulp.add("");
                if( vCommentaarData.size() >= selectedRow )
                    vCommentaarData.setSize(selectedRow + 1);
                vCommentaarData.setElementAt(vHulp, selectedRow);

                tmCommentaar.fireTableDataChanged();
                jtable.setCellSelectionEnabled(true);

                jtable.getCellEditor(selectedRow - 1, selectedColumn).cancelCellEditing();
                jtable.changeSelection(selectedRow, selectedColumn, false, false);
                jtable.grabFocus();

            }
        }
    }
}

共有1个答案

酆晔
2023-03-14

我自己找到的。它与将长度为66个字符的字符串放入65个字符的固定长度textfield有关。问题解决了!

 类似资料:
  • 问题内容: 我有一个使用自定义RowSorter可排序列的JTable。我假设RowSorter类自动将自身作为MouseListener添加到表的ColumnHeader中,因为它无需执行任何自定义鼠标侦听代码即可自动执行排序。这很完美。 我还添加了一些代码(基于此示例),该代码允许用户通过双击列标题中的表之间的空间来调整表列的大小(模仿Excel的行为)。问题是,当用户双击标题以调整列的大小时

  • 我使用的是JTable。每当单元格选择发生变化时,我都需要收到通知。我试图使用ListSelectionListener,但我只在行选择更改时收到通知。如果我在同一行上选择了一个新列,我不会收到通知。我需要知道单元格何时被选中,而不是单元格何时被更改。有没有我可以用的倾听者?

  • 日安! 我有一个jTable,我正在用JButton监听器填充它。在通过鼠标双击填充jTable之后,我调用JoptionPane.ShowMessageDialog。在那个问题解决之后。再次单击JButton后,jTable将再次填充。如果我再次双击Row\Cell,它将显示JOptionPane的2条消息,而不是一条。据我所知,我需要刷新模型,但我没有成功。 我的代码: form.java 我

  • 需要一些帮助来帮助我了解jtable cell侦听器。 我的问题是,我需要捕捉单元格中的变化,当它捕捉到时,我需要得到旧值和新值。 我问的原因是,我使用JTable与DefaultTableModel。 我看到了其他关于这个的帖子,但是当我试图实现时,我没有得到任何“字符串”结果,只有序列化的结果。 以下是我正在使用的: 这就是我得到的:

  • 嗨,我希望我的JTable实现TableModelListener,这样如果TableModel的数据发生变化,它就可以做出反应。但是,一旦我在JTable子类中实现了TableModelListener,该表就不再显示在框架中了。 但是如果我让我的JTable子类像这样实现一个TableModelListener: 该表不再显示在框架中。为什么?我能做些什么来解决这个问题?

  • 问题内容: 我有一个jTable,它的表模型定义如下: 有谁知道我如何清除其内容?就这样它返回到一个空表吗? 问题答案: 最简单的方法: 也就是说,您的reset方法告诉模型具有0行数据。模型将向表中触发适当的数据更改事件,表将自行重建。