在單元格編輯後維護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中文網其他相關文章!