Rumah >Java >javaTutorial >Bagaimana untuk Melaksanakan Kotak Semak Terpaut dalam JTable untuk Pemilihan Berbilang Baris?
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 Kelas DataModel:
Melanjutkan kelas DefaultTableModel untuk mencipta DataModel tersuai dengan ganti kaedah:
Mencipta Panel Kawalan dengan Butang:
Membuat SelectionAction Kelas:
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(); } }); } }
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!