JavaFX TitledPane требует нескольких кликов для расширения, сцена не обновляется - PullRequest
0 голосов
/ 09 февраля 2020

Я сталкиваюсь со странной проблемой / ошибкой, когда TitledPane не раскрывается с первого клика, для его развертывания требуется несколько кликов. В дополнение к этому, вложенные TitledPanes не раскрываются вообще, если вы не нажимаете на них несколько раз и переключаетесь между вкладками.

Таким образом, код работает, но не правильно.

Если эксперт мог бы сказать, если это ошибка или я делаю что-то не так, это было бы очень полезно. Спасибо!

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);
    }

}

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

setConent() метод вызывается onMouseClicked. Первый щелчок по заголовку TitledPane раскрывает его и после этого обрабатывается щелчком мыши. Основная функция, которую щелкают мышью, заключается в установке содержимого. Это еще не оказано. Второй щелчок складывает TitledPane. Третий щелчок расширяет TitledPane с содержимым, которое теперь видно. Переместите создание вкладок VBox из метода setOnMouseClicked().

Правильный код:

import javafx.application.Application;
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.TitledPane;
import javafx.stage.Stage;

public class TitledPaneApp extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        TabPane subTabPane = new TabPane(new Tab("Sub tab1", new Label("Sub content1")), new Tab("Sub tab2", new Label("Sub content2")));
        TitledPane subTitledPane = new TitledPane("Sub titled pane", subTabPane);
        Accordion subAccordion = new Accordion(subTitledPane);

        Tab tab1 = new Tab("Tab1", subAccordion);
        Tab tab2 = new Tab("Tab2", new Label("Content2"));
        TabPane tabPane = new TabPane(tab1, tab2);
        TitledPane titledPane = new TitledPane("Titled pane", tabPane);
        Accordion accordion = new Accordion(titledPane);

        Scene scene = new Scene(accordion, 400, 400);
        stage.setScene(scene);
        stage.show();
    }
}
0 голосов
/ 09 февраля 2020

Найден обходной путь!

  1. Измените setOnMouseClicked() на setOnMousePressed(), чтобы исправить несколько щелчков, необходимых для его расширения.
  2. Добавьте VBox.setVgrow(tabPane, Priority.ALWAYS); & VBox.setVgrow(accordion, Priority.ALWAYS);, чтобы TitledPane обновляется без переключения между вкладками.
...