Heim >Java >javaLernprogramm >Wie behalte ich das benutzerdefinierte JTable-Zellen-Rendering nach der Bearbeitung bei?

Wie behalte ich das benutzerdefinierte JTable-Zellen-Rendering nach der Bearbeitung bei?

DDD
DDDOriginal
2024-12-06 07:17:11558Durchsuche

How to Maintain Custom JTable Cell Rendering After Editing?

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:

  • Erweitern Sie den Standardrenderer, um die gewünschte Formatierung zu verarbeiten ( z. B. CurrencyRenderer).
  • Erweitern Sie den Standardeditor (z. B. CurrencyEditor) und implementieren Sie den Methoden getCellEditorValue() und getTableCellEditorComponent() zum Bearbeiten und Rendern des Werts.
  • Überschreiben Sie die Methode getTableCellEditorComponent() in der Tabelle (z. B. editStopped()), um die Textauswahl im Editor sicherzustellen.
  • Im bereitgestellten Beispiel verarbeiten die Klassen „CurrencyRenderer“ und „CurrencyEditor“ die Währungsformatierung in einer JTable. Bei der Zellenbearbeitung wird der Wert korrekt analysiert, formatiert und gerendert.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn