Java 有没有一种好方法可以检测(双击)JTable列之间的边界?
我想实现当用户双击列的右边框时调整列大小的通用功能。我遇到的麻烦是检测到他点击了那里 我们有确定鼠标位置的列和行的方法,但我找不到任何有助于确定光标是在列之间的边界上单击的。我想我可以得到光标相对于表原点的位置,然后使用行的宽度等来确定光标是否位于其中一个边框上,但这似乎需要很多代码。UI运行时中的某些东西知道光标位于该边框上,因为当光标移动到边框上时,它会更改光标形状 我试过这个:Java 有没有一种好方法可以检测(双击)JTable列之间的边界?,java,swing,Java,Swing,我想实现当用户双击列的右边框时调整列大小的通用功能。我遇到的麻烦是检测到他点击了那里 我们有确定鼠标位置的列和行的方法,但我找不到任何有助于确定光标是在列之间的边界上单击的。我想我可以得到光标相对于表原点的位置,然后使用行的宽度等来确定光标是否位于其中一个边框上,但这似乎需要很多代码。UI运行时中的某些东西知道光标位于该边框上,因为当光标移动到边框上时,它会更改光标形状 我试过这个: JTableHeader tableHeader = table.getTableHeader(); table
JTableHeader tableHeader = table.getTableHeader();
tableHeader.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent mouseEvent)
{
int modifiers = mouseEvent.getModifiers();
int modifiersX = mouseEvent.getModifiersEx();
int row = table.rowAtPoint(mouseEvent.getPoint());
int col = table.columnAtPoint(mouseEvent.getPoint());
System.out.printf("m1 %x, m2 %x, row/col %d,%d%n", modifiers, modifiersX, row, col);
}
}
);
但是,无论我是否单击边框,修改器和扩展修改器都是相同的,所以这些都没有帮助
那么,我如何才能询问系统鼠标单击是否在边框上,而不必每次计算边框的位置呢?如果我理解正确,您要检查的是鼠标是否在JTable列标题边框上 您已经提到的是,如果光标位于边框上,它将改变其形状。 实际上,我并不认为为您的目的使用该功能有任何缺点 那么,为什么不在表头mouselistener中的
mouseClicked()
事件上检查当前光标呢
快速演示:
public static void main(String args[]) {
Test t = new Test();
SwingUtilities.invokeLater(() -> {
t.buildGui();
});
}
void buildGui() {
JFrame frame = new JFrame();
String[] header = { "col1", "col2" };
Object[][] data = { { "data1", "data2" } };
JTable table = new JTable(data, header);
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (table.getTableHeader().getCursor().getType() == Cursor.E_RESIZE_CURSOR) {
if (e.getClickCount() == 2 && !e.isConsumed()) {
e.consume();
System.out.println("Double click on border!");
}
}
}
});
JScrollPane pane = new JScrollPane(table);
frame.add(pane);
frame.pack();
frame.setVisible(true);
}
- 在表头的
上,检查光标是否为“调整光标大小”mouseClicked()
- 此外,还将检查是否是双击
我测试了这个,它似乎没有任何缺点。可能不是最漂亮的解决方案,但我现在想不出更好的解决方案。如果我理解正确,您要检查的是鼠标是否位于JTable列标题边框上 您已经提到的是,如果光标位于边框上,它将改变其形状。 实际上,我并不认为为您的目的使用该功能有任何缺点 那么,为什么不在表头mouselistener中的
mouseClicked()
事件上检查当前光标呢
快速演示:
public static void main(String args[]) {
Test t = new Test();
SwingUtilities.invokeLater(() -> {
t.buildGui();
});
}
void buildGui() {
JFrame frame = new JFrame();
String[] header = { "col1", "col2" };
Object[][] data = { { "data1", "data2" } };
JTable table = new JTable(data, header);
table.getTableHeader().addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (table.getTableHeader().getCursor().getType() == Cursor.E_RESIZE_CURSOR) {
if (e.getClickCount() == 2 && !e.isConsumed()) {
e.consume();
System.out.println("Double click on border!");
}
}
}
});
JScrollPane pane = new JScrollPane(table);
frame.add(pane);
frame.pack();
frame.setVisible(true);
}
- 在表头的
上,检查光标是否为“调整光标大小”mouseClicked()
- 此外,还将检查是否是双击