【发布时间】:2016-06-28 15:05:38
【问题描述】:
问题
我想单击 JTable 中未选择的单元格并将其拖动,即。 e.该表应处于拖动模式。问题是 JTable 有一种机制,当您单击未选择的单元格并拖动时,您实际上不是处于拖动模式,而是处于选择模式。选择模式应该只能通过单击实现,并且应该可以通过 shift + 单击而不是通过拖动来扩展。
据我发现,罪魁祸首在于 BasicTableUI,但不幸的是,所有相关的内容都是私有的。
问题
如何防止通过拖动进行选择并在单击未选中的单元格并拖动它时立即进入拖动模式?
我进行了搜索,但没有找到令人满意的解决方案。或者它们适用于较旧的 Java 版本。
代码
这里有一些复制代码:
- 单击未选中的单元格并拖动鼠标。单元格将被选中。
- 单击选定的单元格并拖动。表格处于拖动模式。
代码:
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.DropMode;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Main {
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
Object rowData[][] = {
{ "a", "a", "a" },
{ "a", "a", "a" },
{ "a", "a", "a" },
{ "a", "a", "a" },
{ "a", "a", "a" },
};
Object columnNames[] = { "Column 1", "Column 2", "Column 3" };
final JTable table = new JTable( rowData, columnNames);
table.setDragEnabled( true);
table.setDropMode( DropMode.INSERT_ROWS);
table.addMouseMotionListener( new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
boolean selectionIsAdjusting = table.getSelectionModel().getValueIsAdjusting();
if( selectionIsAdjusting) {
System.out.println("selecting");
} else {
System.out.println("dragging");
}
}
});
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.setColumnSelectionAllowed(true);
table.setRowSelectionAllowed(true);
JScrollPane scrollPane = new JScrollPane( table);
frame.add( scrollPane, BorderLayout.CENTER);
frame.setSize( 300, 150);
frame.setVisible( true);
}
}
截图:
非常感谢您的帮助!
【问题讨论】:
-
when you click on an empty cell and drag it?你的意思是空的,没有内容的单元格(例如区分空字符串和其他),或者只是拖动任何单元格?发布的代码不包含“空”单元格。 -
哦,你说得对,我修好了。这是一个未选中的单元格。我想点击一个未选中的单元格并拖动它。
-
如果您也更新了问题的第二句,那将会很有用。
-
@VGR:什么意思?
-
您的问题中至少有两个地方使用了“空单元格”一词。如果您的意思是未选中的单元格,那么如果您将措辞更改为“未选中的单元格”,读者的困惑就会大大减少。
标签: java swing drag-and-drop jtable