任务是使用户能够选择多个不连续的单元格JTable,允许在连续单元格组之外进行更灵活的单元格选择。
1.利用 ListSelectionModel
JTable 的 setSelectionModel() 方法允许您自定义选择模型。通过设置为ListSelectionModel.SINGLE_SELECTION并添加监听器来处理InputEvent.CTRL_MASK,可以实现非连续单元格选择。
2.自定义 MouseEvent 处理
通过重写 JTable 中的 processMouseEvent() 方法,您可以修改事件的修饰符以指示按下了控制键。这样,表格的行为就像用户按住 Control 键一样,启用多个单元格选择。
3.实现自定义列表选择模型
如果内置选择模型不能满足您的要求,您可以创建自己的 ListSelectionModel 实现,以所需的方式管理单元格选择。
4.示例实现
以下代码片段提供了一个 SSCCE,它演示了允许在 JTable 中进行非连续单元格选择的自定义 processMouseEvent() 方法:
import java.awt.Component; import java.awt.event.InputEvent; import java.awt.event.MouseEvent; import javax.swing.*; public class TableSelection extends JFrame { public TableSelection() { JPanel main = new JPanel(); // Initialize table data String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; Object[][] data = { {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)}, {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)}, {"Sue", "Black", "Knitting", new Integer(2), new Boolean(false)}, {"Jane", "White", "Speed reading", new Integer(20), new Boolean(true)}, {"Joe", "Brown", "Pool", new Integer(10), new Boolean(false)} }; // Override processMouseEvent to add control modifier JTable table = new JTable(data, columnNames) { @Override protected void processMouseEvent(MouseEvent e) { int modifiers = e.getModifiers() | InputEvent.CTRL_MASK; MouseEvent myME = new MouseEvent((Component) e.getSource(), e.getID(), e.getWhen(), modifiers, e.getX(), e.getY(), e.getXOnScreen(), e.getYOnScreen(), e.getClickCount(), e.isPopupTrigger(), e.getButton()); super.processMouseEvent(myME); } }; JScrollPane pane = new JScrollPane(table); main.add(pane); this.add(main); } public static void main(String[] args) { new TableSelection(); } }
此实现允许您通过按住 Ctrl 键的同时单击所需的单元格来选择不连续的单元格。
以上是如何在 JTable 中允许非连续单元格选择?的详细内容。更多信息请关注PHP中文网其他相关文章!