是否有任何干净的方法允许用户选择JTable的多个非连续单元格?或者我被迫实现自己的ListSelectionModel?
我在JTable上使用setCellSelectionEnabled()和setSelectionModel()方法,但我只能选择连续单元组.
编辑:
我试过@mKorbel不错的SSCCE.它适用于列表,但似乎没有完全在表上工作.这是一个SSCCE:
import java.awt.Component;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class TableSelection extends JFrame{
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)}
};
public TableSelection(){
JPanel main= …Run Code Online (Sandbox Code Playgroud) 继trashgod的很好的例子在这里,我把一个小演示其完成一个简单的任务在大概诚然令人费解的方式.下面显示的GUI显示一列代表真/假值的图标.如果单击图标,则会将值更改为与其相反的值.非常像一个复选框,但具有不同的外观,并且更具可扩展性(例如,我可以在将来更改它以循环使用十几个符号而不仅仅是两个布尔符号).

我是通过使用自定义编辑器来实现的,该编辑器是JComponent的虚拟扩展.你甚至从未看到过这个虚拟组件,因为一旦它接收到一个MousePressed事件,它就会导致编辑器fireEditingStopped().除了我发现的一个奇怪的错误外,它的效果很好.如果你点击一个符号进行更改,然后将鼠标移动到屏幕上的其他位置并按下键盘键,它会在最后一个单击的单元格中显示虚拟编辑器(这有效地使单元格空白),它会一直保持在那里直到你将鼠标移动到单元格中或单击其他单元格.
作为一个hacky修复此问题,我在渲染器中添加了一行,它在渲染后总是取消选择整个表.这很好用,我已经确认整个表确实已被取消选择.但是,尽管如此,如果按键盘键,它仍会执行最后编辑的单元格的编辑器.我该如何防止这种行为?我的应用程序中有其他键盘监听器,如果没有选择单元格,我认为不应该执行任何编辑器.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.imageio.ImageIO;
import javax.swing.AbstractCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class JTableBooleanIcons {
private JFrame frame;
private DefaultTableModel tableModel;
private JTable table;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
JTableBooleanIcons …Run Code Online (Sandbox Code Playgroud)