Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有一种好方法可以检测(双击)JTable列之间的边界?_Java_Swing - Fatal编程技术网

Java 有没有一种好方法可以检测(双击)JTable列之间的边界?

Java 有没有一种好方法可以检测(双击)JTable列之间的边界?,java,swing,Java,Swing,我想实现当用户双击列的右边框时调整列大小的通用功能。我遇到的麻烦是检测到他点击了那里 我们有确定鼠标位置的列和行的方法,但我找不到任何有助于确定光标是在列之间的边界上单击的。我想我可以得到光标相对于表原点的位置,然后使用行的宽度等来确定光标是否位于其中一个边框上,但这似乎需要很多代码。UI运行时中的某些东西知道光标位于该边框上,因为当光标移动到边框上时,它会更改光标形状 我试过这个: JTableHeader tableHeader = table.getTableHeader(); table

我想实现当用户双击列的右边框时调整列大小的通用功能。我遇到的麻烦是检测到他点击了那里

我们有确定鼠标位置的列和行的方法,但我找不到任何有助于确定光标是在列之间的边界上单击的。我想我可以得到光标相对于表原点的位置,然后使用行的宽度等来确定光标是否位于其中一个边框上,但这似乎需要很多代码。UI运行时中的某些东西知道光标位于该边框上,因为当光标移动到边框上时,它会更改光标形状

我试过这个:

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()
    上,检查光标是否为“调整光标大小”
  • 此外,还将检查是否是双击
我测试了这个,它似乎没有任何缺点。也许不是最漂亮的解决办法,但我现在想不出更好的办法