本文介紹了JavaFX:右擊TableColumn禁用調整大小的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在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);
}
}
推薦答案
好了,我發現了以下(非常非常臟)的解決方法。我以前從未嘗試過這樣做,因為我假設它會阻止顯示上下文菜單(正如我在最初的問題中所指出的),但顯然只需使用每個TableColumnHeader
作品的鼠標事件,上下文菜單仍然可以正確顯示(也適用于沒有上下文菜單的TableColumns)。
不確定內部是否會出現任何問題,但由于默認情況下右擊似乎不起任何作用,我希望不會。
當然,lookupAll
需要在呈現之后調用。
注意1:如果將TableMenuButtonVisible
設置為True,則需要在每次將列設置為可見時執行此操作。
注2:越來越臟。簡單地在將列設置為可見之后再次調用它(請參見注釋1)并不總是足夠(也不是通過Platform.runLater
調用)。我認為這是因為列標題在那時還沒有被呈現。您要么
需要等待Set<Node>
填滿,即
必須是amountOfVisibleColumns + 1
。如果它等于
對于可見列,它將不適用于新顯示的列。
或在lookupAll
之前在TableView上調用layout()
或者,如果您有擴展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);
}
}
這篇關于JavaFX:右擊TableColumn禁用調整大小的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,