gpt4 book ai didi

JavaFX:右键单击 TableColumn 禁用调整大小

转载 作者:行者123 更新时间:2023-12-03 16:51:07 26 4
gpt4 key购买 nike

在 OpenJFX 11.0.2 & 12.0.1 SDK (Windows 10, x64) 中复制,不能在 JavaFX 8 中复制

右键单击表列,然后尝试调整列的大小。不会显示调整大小光标,并且在您再次手动单击列之前无法调整列大小。

任何解决方法的想法?我需要使用 contextMenu对于 TableColumns,因此使标题忽略鼠标右键单击的潜在解决方法是不可能的。

enter image description here

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);
}
}

最佳答案

好的,我发现了以下(非常非常脏)的解决方法。我以前从未尝试过,因为我认为它会阻止上下文菜单显示(正如我在原始问题中指出的那样),但显然只是消耗了每个 TableColumnHeader 的鼠标事件。工作并且上下文菜单仍然正确显示(也适用于没有上下文菜单的 TableColumns)。

不确定内部是否会出现任何问题,但由于默认情况下右键单击似乎没有做任何有用的事情,我希望不会。

当然lookupAll需要在渲染后调用。

注 1:如果您有 TableMenuButtonVisible设置为 true,则每次将列设置为可见时都需要执行此操作。

注 2:它变得越来越脏。在将列设置为可见(参见注释 1)后再次调用它不会 总是 就足够了(也不用 Platform.runLater 调用)。我认为这是因为此时尚未呈现列标题。你要么

  • 需要等到Set<Node>已完全填充,即大小
    必须是 amountOfVisibleColumns + 1 .如果它等于金额
    的可见列,它不适用于新显示的列。
  • 或调用 layout()lookupAll 之前的 TableView
  • 或者如果你有一个扩展 TableView 的类, 覆盖 layoutChildren如果可见列的数量发生变化,则执行查找

  • 注释 3 : 你需要跟踪旧的 onMousePressed如果按钮不是 SECONDARY 则执行它,否则列的重新排序将不起作用。

    如果您能想到任何更清洁的方法,请告诉我。

    enter image description here
    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);
    }
    }

    关于JavaFX:右键单击 TableColumn 禁用调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56101914/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com