当前位置: 首页 > 面试题库 >

在JTable中控制行选择的编辑

芮琛
2023-03-14
问题内容

我有一个JTable,显示来自SQL数据库的行。该表相对较小(仅4列,最多1000行)。

我想让用户有机会编辑表中的任何单元格,但要避免过多地限制它,以便他们必须使用编辑对话框(这使错误检查和验证更加容易,但不太直观)

我尝试了几种使用JTable的valueChanged方法控制编辑选择的方法,但是运气不佳。

我希望在编辑结束时对每一行进行编辑并将其写入数据库。我希望一旦单击一个单元格以开始对该行的编辑,就无法选择其他行,直到用户完成对该行的编辑为止(其他行均显示为灰色)。编辑每个单元格并按Enter后,编辑选择应跳到同一行的下一列。

谁能指出我如何实现这一目标?

//  Create table with database data
   table = new JTable(new DefaultTableModel(data, columnNames)) {
        public Class getColumnClass(int column) {
            for (int row = 0; row < getRowCount(); row++) {
                Object o = getValueAt(row, column);
                if (o != null){
                    return o.getClass();
                }
            }
            return Object.class;
        }

        @Override
        public boolean isCellEditable(int row, int col){
            return true; 
        }

        @Override
        public boolean editCellAt(int row, int column) {
            boolean ans = super.editCellAt(row, column);
            if (ans) { 
                Component editor = table.getEditorComponent();
                editor.requestFocusInWindow();
            }
            return ans;
        }

        @Override
        public void valueChanged(ListSelectionEvent source) {
            super.valueChanged(source);
            if (table!=null)
                table.changeSelection(getSelectedRow(), getSelectedColumn()+1, false, false);
        }

    };

编辑-具有表指针的自定义单元格编辑器似乎是一个开始

public class ExchangeTableCellEditor  extends AbstractCellEditor implements TableCellEditor {

private JTable table;

JComponent component = new JTextField();

public ExchangeTableCellEditor(JTable table) {
    this.table = table;
}

public boolean stopCellEditing() {
    boolean ans = super.stopCellEditing();
    //now we want to increment the cell count
    table.editCellAt(table.getSelectedRow(), table.getSelectedColumn()+1);
    return ans;
}

@Override
public void cancelCellEditing() {
    //do nothing... must accept cell changes 
}

@Override
public Object getCellEditorValue() {
    return ((JTextField)component).getText();
}

@Override
public Component getTableCellEditorComponent(JTable arg0, Object value,
        boolean arg2, int arg3, int arg4) {
    ((JTextField)component).setText((String)value);
    return component;
}

}


问题答案:

该默认渲染器和编辑器通常对于大多数的数据类型足够的,但你可以自定义渲染和编辑的需要。

附录:我不熟悉您的片段中显示的方法。而是TableModelListener模型注册,如下所示,并使用保证的粒度更新数据库。另请参见
如何使用表:侦听数据更改


附录:@kleopatra关于您是正确的TableCellEditor。一个方便的方式来通知听众是调用超级实现。请注意,delegateinvokes
fireEditingStopped()

/** @see https://stackoverflow.com/questions/9155596 */
public class NewJavaGUI extends JPanel {

    private final JTable table;

    public NewJavaGUI() {
        String[] colNames = {"C1", "C2", "C3"};
        DefaultTableModel model = new DefaultTableModel(colNames, 0) {

            @Override
            public boolean isCellEditable(int row, int col) {
                // return your actual criteria
                return true;
            }

            @Override
            public Class getColumnClass(int col) {
                // return your actual type tokens
                return getValueAt(0, col).getClass();
            }
        };
        // Add data; note auto-boxing
        model.addRow(new Object[]{"A1", "A2", 42});
        model.addRow(new Object[]{"B1", "B2", 42d});
        model.addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                // DML as indicated
            }
        });
        table = new JTable(model);
        this.add(table);
    }

    private void display() {
        JFrame f = new JFrame("NewJavaGUI");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewJavaGUI().display();
            }
        });
    }
}


 类似资料:
  • 问题内容: 启动应用程序时,未选择任何行。但我想表明第一行已被选中。 这该怎么做?我是否需要设置行的颜色? 更新:我尝试了table.setRowSelectionInterval(0,0)。我知道它应该可以工作,但是有一条错误消息: 问题答案: 您可以调用setRowSelectionInterval来做到这一点: 选择第一行。

  • 问题内容: 我目前正在使用JTable来显示数据库中的内容。我想为用户提供便利,以便他可以使用Shift +箭头键选择想要的行数,然后稍后使用提供的删除选项删除那些记录。请提供一个小例子。 问题答案: 您需要允许多项选择: 然后,您需要编写适当的选择侦听器。这有点困难,请尝试在Google相关解决方案中查找。您可以看一个选择侦听器的示例。

  • 问题内容: 我有一个JTable,它的一列是不可编辑的文本,第二列是一个显示布尔值的复选框…。现在我要的是,当用户选择多行并取消选中其中的任何一个时选中的复选框,则选中的所有复选框都应取消选中,反之亦然。 问题答案: 使用@Hovercraft的示例和@camickr的建议,以下示例显示了合适的用户界面。尽管它使用按钮,但它也适用于菜单或弹出窗口。

  • 我想将JTable中的行选择限制为仅2行。如果用户尝试选择第三行(Ctrl单击),则应通过编程方式取消选择表中最早的选择。为了实现这一点,我在表中添加了一个ListSelectionListener。在下面的示例中,似乎不起作用。 如果有更简单或更优雅的方法来达到同样的效果,请给出建议。

  • 我必须实现一个JTable,其中必须恰好选择一行(总是)。不允许空选择。我正在初始化期间选择第一行: 另外,我在用 但用户仍然可以使用CLick+Ctrl取消选择一行。 最简单的方法是什么,确保在表中总是选择一行?

  • 选择控制器允许用户选择选项。有三种类型:复选框、单选框以及开/关切换。选择控制器使用主题同样的颜色。 复选框 单选按钮 切换开关 复选框 复选框允许用户从一个数据集中选择多个选项。 如果在一个列表中有多个选项,你可以通过使用复选框而不是开/关切换来节省空间。 如果你有一个单选项,不要用复选框,使用开/关切换。 白色主题 黑色主题 白色 开: Swatch 500, 透明度 100% 关: #000