Rumah > Java > javaTutorial > Bagaimana untuk Mengekalkan Rendering Sel JTable Selepas Suntingan Sel?

Bagaimana untuk Mengekalkan Rendering Sel JTable Selepas Suntingan Sel?

Patricia Arquette
Lepaskan: 2024-12-07 05:05:14
asal
146 orang telah melayarinya

How to Maintain JTable Cell Rendering After a Cell Edit?

Mengekalkan Rendering Sel JTable Selepas Edit Sel

Masalah

Selepas menyediakan lajur JTable sebagai String dan mengisihnya sebagai Double, adat pemapar sel pada mulanya memformat lajur sebagai $###,##0.00 berhenti memaparkan sel selepas nilai disunting.

Penyelesaian

Memahami Aliran Peristiwa

Apabila sel diedit, peristiwa berikut berlaku dalam urutan:

  1. Editor membuat kesimpulan .
  2. Kaedah editingStopped() dalam jadual mengumpulkan yang baharu value.
  3. setValueAt() dalam model dipanggil dengan nilai baharu.
  4. Model memanggil fireTableCellUpdated().

Melaksanakan Penyelesaian

Untuk mengekalkan pemaparan sel selepas pengeditan, langkah berikut ialah perlu:

  1. Lanjutkan pemapar lalai: Penyampai lalai harus dilanjutkan untuk mengendalikan pemformatan Nombor. Ini memastikan pemapar bertanggungjawab untuk memaparkan nilai.
  2. Gunakan pemapar sebagai komponen editor: Dalam sesetengah kes, mungkin mudah untuk menggunakan contoh pemapar sebagai editor komponen. Ini membenarkan pemformatan yang sama digunakan pada kedua-dua nilai yang dipaparkan dan diedit.

Contoh Pelaksanaan

Berikut ialah contoh asas menggunakan editor lalai dan pelaksanaan pemapar:

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;
        }
    }
}
Salin selepas log masuk

Dalam contoh ini, kelas CurrencyRenderer dan CurrencyEditor melanjutkan pelaksanaan pemapar lalai dan editor, masing-masing, untuk mengendalikan pemformatan Nombor. Ambil perhatian bahawa contoh ini tidak termasuk panggilan fireTableCellUpdated() kerana ia dikendalikan secara dalaman oleh JTable.

Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Rendering Sel JTable Selepas Suntingan Sel?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan