我试图更改JTable的选择行为,以便能够在不使用CTRL修饰符的情况下向选择中添加和删除行。方法:
public void changeSelection(int rowIndex, int columnIndex, boolean toggle, boolean extend)
似乎正是我要找的东西,尤其是这种情况:
toggle: true, extend: false. If the specified cell is selected, deselect it. If it is not selected, select it.
这就是我的意思。问题是我无法使其正常工作。也许我缺少一些有关内部JTable工作方式的信息,但这是我的代码:
initComponents(); mainTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); mainTable.setRowSelectionAllowed(true); mainTable.setSelectionModel(new DefaultListSelectionModel() { @Override public void addSelectionInterval(int index0, int index1) { if (index0 == index1) { for (int i = 0; i < mainTable.getColumnModel().getColumnCount(); i++) { mainTable.changeSelection(index0, i, true, false); } } } });
这似乎无能为力。有人可以告诉我问题是什么吗?
谢谢。
您可以创建一个自定义ListSelectionModel。
ListSelectionModel
简单的例子:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ToggleListSelectionModel extends DefaultListSelectionModel { @Override public void setSelectionInterval(int index0, int index1) { // Select multiple lines if (index0 != index1) { super.addSelectionInterval(index0, index1); return; } // Toggle selection of a single line if (super.isSelectedIndex(index0)) { super.removeSelectionInterval(index0, index0); } else { super.addSelectionInterval(index0, index0); } } private static void createAndShowGUI() { String[] numbers = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" }; final JList<String> list = new JList<String>( numbers ); list.setVisibleRowCount( numbers.length ); list.setSelectionModel(new ToggleListSelectionModel()); // list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); JButton clear = new JButton("Clear"); clear.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { list.clearSelection(); } }); JFrame frame = new JFrame("SSCCE"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(list), BorderLayout.CENTER); frame.add(clear, BorderLayout.PAGE_END); frame.setLocationByPlatform( true ); frame.pack(); frame.setVisible( true ); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }
该示例适用于JList,但是JTable也使用ListSelectionModel。