Heim >Java >javaLernprogramm >Wie behalte ich das benutzerdefinierte JTable-Zellen-Rendering nach der Bearbeitung bei?
Render-Bearbeitungsnummer: JTable-Format nach der Zellenbearbeitung beibehalten
Beim Erweitern einer JTable mit benutzerdefiniertem Zellen-Rendering ist es wichtig, dass das Rendering gleichmäßig bleibt nach der Zellbearbeitung. Dazu gehört auch die Beibehaltung der Formatierung innerhalb des Zellenrenderers.
Problem:
Nach der Implementierung eines JTextField-Editors für eine JTable-Spalte, die mit einem benutzerdefinierten Zellenrenderer formatiert wurde, verliert die Zelle ihre benutzerdefinierten Eigenschaften Rendern beim Bearbeiten Abschluss.
Lösung:
Der Formatierungsverlust tritt auf, weil das Modell den Renderer bei einer Zellenwertänderung nicht aktualisiert. Um dies zu beheben, stellen Sie sicher, dass der Zellenrenderer nach allen Tabellenmodelländerungen aufgerufen wird.
Implementierung:
Beispielcode:
Der bereitgestellte Beispielcode demonstriert diesen Ansatz durch die Erstellung einer JTable mit einer währungsformatierten Spalte, die die Formatierung nach der Zellenbearbeitung beibehält:
import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.text.NumberFormat; import java.util.EventObject; public class RenderEditNumber extends JPanel { private NumberFormat nf = NumberFormat.getCurrencyInstance(); public RenderEditNumber() { 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) { @Override // Always selectAll() public boolean editCellAt(int row, int column, EventObject e) { boolean result = super.editCellAt(row, column, e); final Component editor = getEditorComponent(); if (editor == null || !(editor instanceof JTextComponent)) { return result; } EventQueue.invokeLater(new Runnable() { @Override public void run() { ((JTextComponent) editor).selectAll(); } }); return result; } }; table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf)); table.setDefaultEditor(Double.class, new CurrencyEditor(nf)); add(new JScrollPane(table)); } public static void main(String[] args) { EventQueue.invokeLater(() -> new RenderEditNumber().display()); } } 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)); } } 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; } }
Durch die Verwendung dieses Ansatzes bleiben JTable-Zellen erhalten ihre individuelle Darstellung auch nach der Bearbeitung, was eine konsistente Datenpräsentation und ein verbessertes Benutzererlebnis ermöglicht.
Das obige ist der detaillierte Inhalt vonWie behalte ich das benutzerdefinierte JTable-Zellen-Rendering nach der Bearbeitung bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!