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






