首頁 >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