Раскройте еще 2 Titledpanes одновременно - PullRequest
0 голосов
/ 19 апреля 2019

В эти дни я делаю рефакторинг кода свинга Java в javafx.А что касается некоторых jpanels, я просто рефакторинг как JFXPanel, и что корень JFXPanels является VBOX.структура JFXPanel - VBOX -> BorderPane -> TitledPane -> AnchorPane.

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="93.0" prefWidth="295.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <BorderPane prefHeight="259.0" prefWidth="309.0">
         <top>
            <TitledPane animated="false" prefHeight="93.0" prefWidth="297.0" style="-fx-background-color: #eeeeee;" text="Compensation Options" textFill="#1b75bc">
               <content>
                  <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="295.0" prefWidth="267.0">
                     <children>
                        <Button fx:id="mResetCountButton" layoutX="25.0" layoutY="5.0" mnemonicParsing="false" text="Reset Counts" textAlignment="CENTER" />
                        <Button fx:id="plotStatsButton" layoutX="123.0" layoutY="5.0" mnemonicParsing="false" text="Stats Panel" textAlignment="CENTER" />
                        <Button fx:id="gateStatsButton" layoutX="208.0" layoutY="5.0" mnemonicParsing="false" text="Gate State" textAlignment="CENTER" />
                        <Button fx:id="mLoadMatrixButton" layoutX="28.0" layoutY="37.0" mnemonicParsing="false" text="Load Matrix" textAlignment="CENTER" />
                        <Button fx:id="viewCompMatrix" layoutX="119.0" layoutY="37.0" mnemonicParsing="false" text="View Matrix" textAlignment="CENTER" />
                        <Label fx:id="mJCompMatrixCombo" layoutX="208.0" layoutY="41.0" text="Matrix Name" />
                     </children>
                  </AnchorPane>
               </content>
            </TitledPane>
         </top>
      </BorderPane>
   </children>
</VBox>

А теперь я хочу сделать JFXPanels аккордеоном.Когда я искал в Google, я только что увидел код, который использует, и когда я делаю тег Accordion, я просто могу использовать тег TitledPane ниже.Есть ли другой способ сделать JFXPanels в качестве Accordion многократно использующим мой код? ...

А на самом деле, используя Tag, я могу просто развернуть одну титровальную панель за раз.Как я могу сделать приложение JavaFX с Accordion, которое может расширять много титулованных панелей одновременно?

Я только что попробовал, как сделать размер титрованных панелей clicklistener and resizing VBox which is wrapping titledPane and titledpane s и некоторые панели, которые внутри титульного окна.

, такие как

boolean titledPaneClicked = false;

TiteldPane.setOnAction((e)->{
    if(titledPaneClicked){
        TitledPane.setHeight(0);
        Vbox.setHeight(0);
        soemotherPanes.setHeight(0);
        titledPaneClicked = !titledPaneClicked;
    }else{
        TitledPane.setHeight(previousSize);
        Vbox.setHeight(previousSize);
        soemotherPanes.setHeight(previousSize);
        titledPaneClicked = !titledPaneClicked;
    }
});

И это не сработало.Пожалуйста, помогите мне:)

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я решил эту проблему, просто используя VBox.

Я сделал VBox, titlePane и VBox, которые содержат несколько Btns, Labels и т. Д.

VBox mainBox = new VBox();
TitledPane T1 = new TitledPane();
VBox content1 = new VBox();
T1.setContent(content1);
TitledPane T2 = new TitledPane();
VBox content2 = new VBox();
T2.setContent(content2);

mainBox.getChildren().addAll(T1, T2);

и затем в MainVBox титульные панели отображаются как аккордеон.

0 голосов
/ 20 апреля 2019

Если ваш вопрос касается того, как вы можете одновременно открыть 2 TitledPane с, вы можете сделать это программно, например, с помощью кнопки:

Main.fxml (чтобы ваш код mcve всегда публиковал имя fxml и импортировал)

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TitledPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<VBox minWidth="-Infinity" prefHeight="200.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="tests.xml.Controller">
   <children>
      <BorderPane>
         <top>
            <TitledPane fx:id="aTitledPane" animated="false" style="-fx-background-color: #eeeeee;" text="Compensation Options" textFill="#1b75bc">
               <content>
                  <AnchorPane>
                     <children>
                        <Label text="Top pane expanded" />
                     </children>
                  </AnchorPane>
               </content>
            </TitledPane>
         </top>
          <center>
            <TitledPane fx:id="bTitledPane" animated="false" style="-fx-background-color: #eeeeee;" text="Other Options" textFill="#1b75bc">
               <content>
                  <AnchorPane>
                     <children>
                        <Label text="Bottom pane expanded" />
                     </children>
                  </AnchorPane>
               </content>
            </TitledPane>
         </center>
         <bottom>   
            <Button fx:id="openCloseButton" onAction="#openClose" text="Close" textAlignment="CENTER" />
         </bottom>
      </BorderPane>
   </children>
</VBox>

И это контроллер:

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TitledPane;

public class Controller {

    @FXML
    private TitledPane aTitledPane, bTitledPane;
    @FXML
    private Button openCloseButton;

    private final static String OPEN = "Open", CLOSE = "Close";

    @FXML
    void initialize(){
        openCloseButton.setText(OPEN);
        aTitledPane.setExpanded(false);
        bTitledPane.setExpanded(false);
    }

    @FXML
    private void openClose(){
        System.out.println(openCloseButton.getText());
        if(openCloseButton.getText().equals(OPEN)){
            openCloseButton.setText(CLOSE);
            aTitledPane.setExpanded(true);
            bTitledPane.setExpanded(true);
        }else{
            openCloseButton.setText(OPEN);
            aTitledPane.setExpanded(false);
            bTitledPane.setExpanded(false);
        }
    }
}

Протестируйте его, используя:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class FXMLTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{

        Parent root = FXMLLoader.load(getClass().getResource("xml/Main.fxml"));
        primaryStage.setTitle("Hello World");
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

Если выхотите, чтобы открытие / закрытие одного TitledPane открывало / закрывало другое без использования кнопки, удаляло кнопку из fxml и связывало TitledPane.expandedProperty() из двух TitledPane s в контроллере:

import javafx.fxml.FXML;
import javafx.scene.control.TitledPane;

public class Controller {

    @FXML
    private TitledPane aTitledPane, bTitledPane;

    @FXML
    void initialize(){
        aTitledPane.expandedProperty().bindBidirectional(bTitledPane.expandedProperty());
    }
}
...