首页 >Java >java教程 >如何在单元格编辑后保持 JTable 单元格渲染?

如何在单元格编辑后保持 JTable 单元格渲染?

Patricia Arquette
Patricia Arquette原创
2024-12-07 05:05:14157浏览

How to Maintain JTable Cell Rendering After a Cell Edit?

单元格编辑后维护 JTable 单元格渲染

问题

将 JTable 列设置为 String 并将其排序为 Double 后,自定义单元格渲染器最初将列格式化为 $###,##0.00 在该值变为后停止渲染单元格

解决方案

理解事件流

编辑单元格时,会依次发生以下事件:

  1. 编辑器总结.
  2. 表中的editingStopped()方法收集新的value。
  3. 使用新值调用模型中的 setValueAt()。
  4. 模型调用 f​​ireTableCellUpdated()。

实现解决方案

为了在编辑后保持单元格渲染,以下步骤是必要:

  1. 扩展默认渲染器: 应扩展默认渲染器以处理数字格式。这确保渲染器负责显示值。
  2. 使用渲染器作为编辑器组件:在某些情况下,使用渲染器的实例作为编辑器可能会很方便成分。这允许将相同的格式应用于显示和编辑的值。

示例实现

以下是使用默认编辑器和渲染器实现的基本示例:

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultTableCellRenderer;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.text.NumberFormat;

public class RenderEditNumber {

    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        DefaultTableModel model = new DefaultTableModel(
            new String[]{"Amount"}, 0) {

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return Double.class;
            }
        };
        for (int i = 0; i < 16; i++) {
            model.addRow(new Object[]{Double.valueOf(i)});
        }
        JTable table = new JTable(model);
        table.setPreferredScrollableViewportSize(new Dimension(123, 123));
        table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf));
        table.setDefaultEditor(Double.class, new CurrencyEditor(nf));
    }

    private static class CurrencyRenderer extends DefaultTableCellRenderer {

        private NumberFormat formatter;

        public CurrencyRenderer(NumberFormat formatter) {
            this.formatter = formatter;
            this.setHorizontalAlignment(JLabel.RIGHT);
        }

        @Override
        public void setValue(Object value) {
            setText((value == null) ? "" : formatter.format(value));
        }
    }

    private static class CurrencyEditor extends DefaultCellEditor {

        private NumberFormat formatter;
        private JTextField textField;

        public CurrencyEditor(NumberFormat formatter) {
            super(new JTextField());
            this.formatter = formatter;
            this.textField = (JTextField) this.getComponent();
            textField.setHorizontalAlignment(JTextField.RIGHT);
            textField.setBorder(null);
        }

        @Override
        public Object getCellEditorValue() {
            try {
                return new Double(textField.getText());
            } catch (NumberFormatException e) {
                return Double.valueOf(0);
            }
        }

        @Override
        public Component getTableCellEditorComponent(JTable table,
            Object value, boolean isSelected, int row, int column) {
            textField.setText((value == null)
                ? "" : formatter.format((Double) value));
            return textField;
        }
    }
}

在此示例中,CurrencyRenderer 和CurrencyEditor 类分别扩展了默认渲染器和编辑器实现,以处理数字格式。请注意,此示例不包括 fireTableCellUpdated() 调用,因为它是由 JTable 内部处理的。

以上是如何在单元格编辑后保持 JTable 单元格渲染?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn