我尝试更改JTable的Selection行为,以便能够在不使用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);
}
}
}
});
这似乎无所作为。有人能告诉我这是什么问题吗?
感谢。
答案 0 :(得分:1)
您可以创建自定义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。