首页 >Java >java教程 >如何在单元格编辑后维护自定义 JTable 单元格渲染?

如何在单元格编辑后维护自定义 JTable 单元格渲染?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-07 13:27:131024浏览

How Can I Maintain Custom JTable Cell Rendering After Cell Editing?

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

在 JTable 中,实现自定义单元格渲染和编辑功能可以增强用户体验。然而,确保即使在编辑操作后仍保留所需的格式至关重要。

问题

设置自定义单元格渲染器以格式化“价格”后列中,用户遇到了一个差异,即单元格编辑时数字格式丢失。在这种情况下,提交编辑后可能不会应用单元格渲染器的默认值。

解决方案

要在单元格编辑后保持自定义渲染,使用正确的事件触发器和类非常重要。当编辑结束时,JTable 的 EditingStopped() 方法通过 getCellEditorValue() 收集新值。然后使用 setValueAt() 通知模型,并随后调用 fireTableCellUpdated()。这个综合过程调用渲染器,可以扩展它来处理特殊的格式需求。

其他注意事项

对于更复杂的格式要求,建议考虑使用实例自定义渲染器作为编辑器组件本身。这样可以更好地控制单元格的外观和行为,即使在单元格修改后也能确保格式一致。

示例

以下代码片段提供了一个示例实现,演示了如何将 JTable 单元格中的货币值格式化为数字。自定义渲染器 (CurrencyRenderer) 处理货币格式,而自定义编辑器 (CurrencyEditor) 允许用户在保持格式的同时编辑值。

import java.awt.Component;
import java.awt.event.MouseEvent;
import java.text.NumberFormat;
import javax.swing.DefaultCellEditor;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;

// Custom cell renderer for currency formatting
public class CurrencyRenderer extends DefaultTableCellRenderer {

    private NumberFormat formatter;

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

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

// Custom cell editor for currency input, maintaining the formatting
public class CurrencyEditor extends DefaultCellEditor {

    private NumberFormat formatter;
    private JTextField textField;

    public CurrencyEditor(NumberFormat formatter) {
        super(new JTextField());
        this.formatter = formatter;
        textField = (JTextField) 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;
    }
}

通过合并这些技术,开发人员可以确保自定义单元格渲染和编辑功能在 JTable 中无缝协作,提供一致且用户友好的数据操作体验。

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

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