Rumah >Java >javaTutorial >Bagaimana untuk Melaksanakan Kotak Semak Terpaut dalam JTable untuk Pemilihan Berbilang Baris?

Bagaimana untuk Melaksanakan Kotak Semak Terpaut dalam JTable untuk Pemilihan Berbilang Baris?

DDD
DDDasal
2024-12-05 19:43:11308semak imbas

How to Implement Linked Checkboxes in a JTable for Multiple Row Selection?

Memilih Berbilang Baris dan Menyemak Semua Kotak Pilihan

Dalam JTable, di mana satu lajur terdiri daripada teks tidak boleh diedit manakala kotak pilihan ciri lain mengawal nilai boolean, keperluan biasa adalah untuk memautkan kotak pilihan. Ini memerlukan bahawa apabila berbilang baris dipilih dan mana-mana kotak pilihan dinyahtanda, semua kotak pilihan lain juga tidak ditandakan. Begitu juga, jika kotak pilihan ditandakan, semua kotak pilihan yang dipilih harus mengikut kesesuaian.

Melaksanakan Kotak Semak Terpaut

Melaksanakan Kelas DataModel:

  • Melanjutkan kelas DefaultTableModel untuk mencipta DataModel tersuai dengan ganti kaedah:

    • getColumnClass(int columnIndex): Kembalikan jenis kelas untuk lajur kotak semak (Boolean.class).
    • isCellEditable(baris int, lajur int): Benarkan pengeditan sel sahaja dalam kotak semak lajur.

Mencipta Panel Kawalan dengan Butang:

  • Tambah panel kawalan dengan butang untuk mengosongkan atau menyemak semua kotak pilihan yang dipilih.

Membuat SelectionAction Kelas:

  • Laksanakan kelas tindakan untuk mengendalikan peristiwa butang.
  • Pembina menerima nilai boolean yang mewakili tindakan yang diingini (kosongkan atau semak).
  • Kaedah actionPerformed berulang pada baris yang dipilih dan mengemas kini nilai kotak semak sewajarnya.

Kod Contoh:**

Coretan kod berikut menunjukkan pelaksanaan:

import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.DefaultListSelectionModel;
import javax.swing.table.DefaultTableModel;

public class MultipleRowSelection extends JPanel {

    private static final int CHECK_COL = 1;
    private static final Object[][] DATA = {
        {"One", Boolean.TRUE}, {"Two", Boolean.FALSE},
        {"Three", Boolean.TRUE}, {"Four", Boolean.FALSE},
        {"Five", Boolean.TRUE}, {"Six", Boolean.FALSE},
        {"Seven", Boolean.TRUE}, {"Eight", Boolean.FALSE},
        {"Nine", Boolean.TRUE}, {"Ten", Boolean.FALSE}};
    private static final String[] COLUMNS = {"Number", "CheckBox"};
    private DataModel dataModel = new DataModel(DATA, COLUMNS);
    private JTable table = new JTable(dataModel);
    private DefaultListSelectionModel selectionModel;

    public MultipleRowSelection() {
        super(new BorderLayout());
        this.add(new JScrollPane(table));
        this.add(new ControlPanel(), BorderLayout.SOUTH);
        table.setPreferredScrollableViewportSize(new Dimension(250, 175));
        selectionModel = (DefaultListSelectionModel) table.getSelectionModel();
    }

    private class DataModel extends DefaultTableModel {

        public DataModel(Object[][] data, Object[] columnNames) {
            super(data, columnNames);
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            if (columnIndex == CHECK_COL) {
                return getValueAt(0, CHECK_COL).getClass();
            }
            return super.getColumnClass(columnIndex);
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return column == CHECK_COL;
        }
    }

    private class ControlPanel extends JPanel {

        public ControlPanel() {
            this.add(new JLabel("Selection:"));
            this.add(new JButton(new SelectionAction("Clear", false)));
            this.add(new JButton(new SelectionAction("Check", true)));
        }
    }

    private class SelectionAction extends AbstractAction {

        boolean value;

        public SelectionAction(String name, boolean value) {
            super(name);
            this.value = value;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < dataModel.getRowCount(); i++) {
                if (selectionModel.isSelectedIndex(i)) {
                    dataModel.setValueAt(value, i, CHECK_COL);
                }
            }
        }
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("MultipleRowSelection");
        frame.add(new MultipleRowSelection());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowUI();
            }
        });
    }
}

Kesimpulan

Dengan melaksanakan kelas ini dan pendengar tindakan, anda boleh memilih berbilang baris dalam JTable dan menogol kotak semak yang sepadan secara kolektif, mempertingkatkan pengalaman pengguna dan memperkemas manipulasi data.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kotak Semak Terpaut dalam JTable untuk Pemilihan Berbilang Baris?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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