本文介紹了JavaFX:右擊TableColumn禁用調(diào)整大小的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
在OpenJFX 11.0.2&;12.0.1 SDK(Windows 10,x64)中復(fù)制,不能在JavaFX 8中復(fù)制
右鍵單擊表列,然后嘗試調(diào)整該列的大小。未顯示調(diào)整大小光標(biāo),并且在再次手動單擊列之前無法調(diào)整該列的大小。
有什么解決辦法嗎?我需要對TableColumns使用contextMenu
,因此無法使用使標(biāo)題忽略鼠標(biāo)右鍵單擊的潛在解決方法。
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);
}
}
推薦答案
好了,我發(fā)現(xiàn)了以下(非常非常臟)的解決方法。我以前從未嘗試過這樣做,因為我假設(shè)它會阻止顯示上下文菜單(正如我在最初的問題中所指出的),但顯然只需使用每個TableColumnHeader
作品的鼠標(biāo)事件,上下文菜單仍然可以正確顯示(也適用于沒有上下文菜單的TableColumns)。
不確定內(nèi)部是否會出現(xiàn)任何問題,但由于默認(rèn)情況下右擊似乎不起任何作用,我希望不會。
當(dāng)然,lookupAll
需要在呈現(xiàn)之后調(diào)用。
注意1:如果將TableMenuButtonVisible
設(shè)置為True,則需要在每次將列設(shè)置為可見時執(zhí)行此操作。
注2:越來越臟。簡單地在將列設(shè)置為可見之后再次調(diào)用它(請參見注釋1)并不總是足夠(也不是通過Platform.runLater
調(diào)用)。我認(rèn)為這是因為列標(biāo)題在那時還沒有被呈現(xiàn)。您要么
需要等待Set<Node>
填滿,即
必須是amountOfVisibleColumns + 1
。如果它等于
對于可見列,它將不適用于新顯示的列。
或在lookupAll
之前在TableView上調(diào)用layout()
或者,如果您有擴展TableView
的類,則重寫layoutChildren
并在可見列數(shù)發(fā)生變化時執(zhí)行查找
注意3:您需要跟蹤舊的onMousePressed
,如果按鈕不是SECONDARY
,則執(zhí)行它,否則列的重新排序?qū)o法工作。
請讓我知道你是否能想到更干凈的方法。
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);
}
}
這篇關(guān)于JavaFX:右擊TableColumn禁用調(diào)整大小的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,