首頁 >Java >java教程 >如何在單元格編輯後保持 JTable 單元格渲染?

如何在單元格編輯後保持 JTable 單元格渲染?

Patricia Arquette
Patricia Arquette原創
2024-12-07 05:05:14156瀏覽

How to Maintain JTable Cell Rendering After a Cell Edit?

在單元格編輯後維護JTable 單元格渲染

問題

將JTable 列設為String 並將其排序為Double 後,自訂單元格渲染器最初將列格式化為$###,##0.00在該值變為後停止渲染單元格

解決方案

理解事件流

編輯單元格時,會依次發生以下事件:

  1. 編輯器總結.
  2. 表格中的editingStopped()方法收集新的value。
  3. 使用新值來呼叫模型中的 setValueAt()。
  4. 模型呼叫 fireTableCellUpdated()。

實作解決方案

為了在編輯後保持單元格渲染,以下步驟是必要:

  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