JavaFX标题窗格需要多次单击才能展开,场景不';t更新
我遇到了一个奇怪的问题/错误,标题窗格不是在第一次单击时展开的,它需要多次单击才能展开。除此之外,嵌套标题窗格根本不会展开,除非您多次单击它们并在选项卡之间切换 因此,代码工作正常,但不正常 如果一位专家能够判断这是一个bug还是我做错了什么,那将是一个很大的帮助。谢谢大家!JavaFX标题窗格需要多次单击才能展开,场景不';t更新,java,javafx,javafx-8,Java,Javafx,Javafx 8,我遇到了一个奇怪的问题/错误,标题窗格不是在第一次单击时展开的,它需要多次单击才能展开。除此之外,嵌套标题窗格根本不会展开,除非您多次单击它们并在选项卡之间切换 因此,代码工作正常,但不正常 如果一位专家能够判断这是一个bug还是我做错了什么,那将是一个很大的帮助。谢谢大家! package subtables; import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.S
package subtables;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Accordion;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Subtables extends Application
{
@Override
public void start(Stage primaryStage)
{
Accordion accordion = new Accordion();
TitledPane pane = new TitledPane();
VBox root = new VBox();
HBox titles = new HBox();
titles.setPadding(new Insets(5, 5, 5, 24));
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
FlowPane graphic = new FlowPane();
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
pane.setGraphic(graphic);
pane.setOnMouseClicked((e) ->
{
TabPane tabPane = new TabPane();
Tab tab1 = new Tab("Sub Table 1", getSubWindow());
Tab tab2 = new Tab("Sub Table 2", new Label("Text inside a tab."));
Tab tab3 = new Tab("Sub Table 3", new Label("Text inside a tab."));
Tab tab4 = new Tab("Sub Table 4", new Label("Text inside a tab."));
tabPane.getTabs().add(tab1);
tabPane.getTabs().add(tab2);
tabPane.getTabs().add(tab3);
tabPane.getTabs().add(tab4);
VBox vBox = new VBox(tabPane);
pane.setContent(vBox);
});
accordion.getPanes().add(pane);
root.getChildren().add(titles);
root.getChildren().add(accordion);
primaryStage.setTitle("Hello World!");
Scene scene = new Scene(root, 640, 480);
primaryStage.setScene(scene);
primaryStage.show();
}
public TextField getTextField()
{
TextField textField = new TextField();
textField.setPromptText("Value");
textField.setPrefWidth(50);
return textField;
}
public VBox getSubWindow()
{
Accordion accordion = new Accordion();
TitledPane pane = new TitledPane();
VBox root = new VBox();
HBox titles = new HBox();
titles.setPadding(new Insets(5, 5, 5, 24));
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
titles.getChildren().add(getTextField());
FlowPane graphic = new FlowPane();
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
graphic.getChildren().add(getTextField());
pane.setGraphic(graphic);
pane.setOnMouseClicked((e) ->
{
TabPane tabPane = new TabPane();
Tab tab1 = new Tab("Sub Table 1", getSubWindow());
Tab tab2 = new Tab("Sub Table 2", new Label("Text inside a tab."));
Tab tab3 = new Tab("Sub Table 3", new Label("Text inside a tab."));
Tab tab4 = new Tab("Sub Table 4", new Label("Text inside a tab."));
tabPane.getTabs().add(tab1);
tabPane.getTabs().add(tab2);
tabPane.getTabs().add(tab3);
tabPane.getTabs().add(tab4);
VBox vBox = new VBox(tabPane);
pane.setContent(vBox);
});
accordion.getPanes().add(pane);
root.getChildren().add(titles);
root.getChildren().add(accordion);
return root;
}
/**
* Main function to launch the application.
*/
public static void main(String[] args)
{
launch(args);
}
}
找到了一个解决办法
setOnMouseClicked()
更改为setOnMousePressed()
,以修复它展开所需的多次单击VBox.setVgrow(tabPane,Priority.ALWAYS)代码>&VBox.setVgrow(accordion,Priority.ALWAYS)代码>这样标题窗格将刷新,而无需在选项卡之间切换
setConent()
方法在鼠标单击时调用。首先单击标题窗格标题将其展开,然后处理鼠标单击。鼠标点击的核心功能是设置内容。它还没有渲染。第二次单击折叠标题窗格。第三次单击可展开标题窗格,其中包含现在可见的内容。
将创建VBox选项卡移出setOnMouseClicked()
方法
正确代码:
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.control.Accordion;
导入javafx.scene.control.Label;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TabPane;
导入javafx.scene.control.TitledPane;
导入javafx.stage.stage;
公共类TitledPaneApp扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage)引发异常{
TabPane subTabPane=新选项卡窗格(新选项卡(“子选项卡1”,新标签(“子内容1”)),新选项卡(“子选项卡2”,新标签(“子内容2”));
标题窗格SubtitlePane=新标题窗格(“子标题窗格”,子标题窗格);
手风琴子伴奏=新手风琴(副标题平面);
Tab tab1=新选项卡(“tab1”,子协调);
Tab tab2=新选项卡(“tab2”,新标签(“Content2”);
TabPane TabPane=新的TabPane(tab1,tab2);
标题窗格标题窗格=新标题窗格(“标题窗格”,选项卡窗格);
手风琴手风琴=新手风琴(标题窗格);
场景=新场景(手风琴,400400);
舞台场景;
stage.show();
}
}
这是一个天才的答案,我明白为什么现在需要点击3次。我忘了提到我后来将选项卡从setOnMouseClicked()中移出。在回答中,您还提到“内容还不可见”,您能解释一下为什么调用setContent()不能使内容可见,除非它被折叠和展开吗?通过添加setVgrow()代码,它在第一次扩展后立即可见,但不确定原因。基本上我所好奇的是,如果是你,你将如何修改我的代码,使它通过一次鼠标点击工作,嵌套的TwiteBANS也显示它们的内容,而不必多次在标签之间切换。我会考虑不把内容作为一个小的JavaFX bug。如果将内容节点设置为重绘,则应将其标记为脏并重绘setVgrow()
在重画进程时,可能会更频繁地强制设置脏。尽管如此,代码还是不正确的,因为每次点击标题窗格都会获得新内容,这是非常低效的,可能会导致后续错误。给我20分钟。我将尝试提供一些代码。那我就编辑我的答案。@iillli我交了。