在OpenJFX 11.0.2和12.0.1 SDK(Windows 10,x64)中复制,在JavaFX 8中不可复制
右键单击一个表列,然后尝试调整该列的大小。没有显示调整大小光标,并且除非您再次手动单击列,否则无法调整列的大小。
有任何解决方法的想法吗?我需要为TableColumns使用contextMenu
,所以不可能使标题忽略鼠标右键的潜在解决方法。
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.stage.Stage;
public class Foo extends Application {
@Override
public void start(Stage stage) throws Exception {
TableView<Object> testView = new TableView<>();
testView.getColumns().addAll(new TableColumn<Object, Object>("C1"), new TableColumn<Object, Object>("C2"), new TableColumn<Object, Object>("C3"));
stage.setScene(new Scene(testView));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 0 :(得分:2)
好吧,我发现以下(非常非常脏)的解决方法。我之前从未尝试过此操作,因为我认为这样做会阻止显示上下文菜单(正如我在原始问题中所指出的那样),但是仅仅消耗了每个TableColumnHeader
作品的鼠标事件,上下文菜单仍然可以正确显示(也可以用于不带上下文菜单的TableColumns。
不确定内部是否有任何问题,但是默认情况下右键单击似乎并没有做任何有用的事情,所以我希望不会。
当然lookupAll
需要在呈现后调用。
注释1:如果将TableMenuButtonVisible
设置为true,则每次列设置为可见时都需要执行此操作。
注意2:。它变得越来越脏。在列设置为可见后再次简单地调用它(请参见注释1)并不能总是(也不能通过Platform.runLater
调用)。我认为那是因为此时尚未呈现列标题。你要么
Set<Node>
完全填满,即
它必须是amountOfVisibleColumns + 1
。如果等于数量
的可见列,它将不适用于新显示的列。layout()
之前在TableView上调用lookupAll
TableView
的类,请覆盖layoutChildren
并在可见列数已更改的情况下执行查找 注释3 :如果按钮不是onMousePressed
,则需要跟踪旧的SECONDARY
并执行它,否则列的重新排序将无法进行
请让我知道您是否可以想到任何更清洁的方法。
import java.util.Set;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.skin.TableColumnHeader;
import javafx.scene.input.MouseButton;
import javafx.stage.Stage;
public class Foo extends Application {
@Override
public void start(Stage stage) throws Exception {
TableView<Object> testView = new TableView<>();
testView.getColumns().addAll(createColumn("C1"), createColumn("C2"), createColumn("C3"));
stage.setOnShown(ev -> {
Set<Node> headers = testView.lookupAll("TableColumnHeader");
for (Node header : headers) {
if (header != null) {
((TableColumnHeader) header).setOnMousePressed(e -> {
if (e.getButton() == MouseButton.SECONDARY) {
e.consume();
}
});
}
}
});
stage.setScene(new Scene(testView));
stage.show();
}
private TableColumn<Object, Object> createColumn(String text) {
MenuItem item = new MenuItem("Context");
item.setOnAction(e -> {
System.out.println("Action");
});
ContextMenu contextMenu = new ContextMenu();
contextMenu.getItems().add(item);
TableColumn<Object, Object> column = new TableColumn<>(text);
column.setContextMenu(contextMenu);
return column;
}
public static void main(String[] args) {
launch(args);
}
}
答案 1 :(得分:2)
编辑:在 Java 错误跟踪器中找到了所描述的错误并提交了带有修复程序的 PR:
https://github.com/openjdk/jfx/pull/483
编辑 2:我的 PR 被接受并合并回来。现在bug已经修复,可以使用17-ea+11进行测试。 :-)
我也有同样的问题。此错误是由 mousePressedHandler
中添加的 TableColumnHeader
引起的。这个类有更多的问题,例如如果我通过点击列来关闭一个带有 PopupControl
的 setConsumeAutoHidingEvents(true)
,排序将被触发。这些方法需要改变,也许应该使用 addEventHandler
方法而不是方便的 setOn...
方法。
我通过在我即将展示我的 PopupControl
时使用该事件来修复它:
public class MyTableColumnHeader extends TableColumnHeader {
public MyTableColumnHeader(TableColumnBase tc) {
super(tc);
addEventHandler(MouseEvent.MOUSE_PRESSED, this::onMousePressed);
}
private void onMousePressed(MouseEvent mouseEvent) {
if (mouseEvent.getButton() == MouseButton.SECONDARY) {
showPopup();
// Consume here, so the column won't get 'stuck'.
mouseEvent.consume();
}
}
private void showPopup() {
...
}
}
最终,应该有人至少打开一个错误。在不久的将来,我可能也会去看看。