Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX标题窗格需要多次单击才能展开,场景不';t更新_Java_Javafx_Javafx 8 - Fatal编程技术网

JavaFX标题窗格需要多次单击才能展开,场景不';t更新

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

我遇到了一个奇怪的问题/错误,标题窗格不是在第一次单击时展开的,它需要多次单击才能展开。除此之外,嵌套标题窗格根本不会展开,除非您多次单击它们并在选项卡之间切换

因此,代码工作正常,但不正常

如果一位专家能够判断这是一个bug还是我做错了什么,那将是一个很大的帮助。谢谢大家!

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我交了。