我想知道您是否可以这样做:
主要内容 以及该内容阶段中的菜单阶段
像这样: enter image description here
我尝试制作,但是我明白了:
我的fxml:
<StackPane fx:id="root" prefWidth="311.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.semeq.controllers.Test">
<!-- Header -->
<BorderPane>
<top>
<VBox spacing="20">
<JFXToolbar>
<leftItems>
<JFXRippler maskType="CIRCLE" style="-fx-ripple-color:WHITE;">
<StackPane fx:id="titleBurgerContainer">
<JFXHamburger fx:id="titleBurger">
<HamburgerBackArrowBasicTransition />
</JFXHamburger>
</StackPane>
</JFXRippler>
<Label>Material Design</Label>
</leftItems>
</JFXToolbar>
</VBox>
</top>
<!-- Content Area -->
<center>
<JFXDrawer fx:id="drawer" defaultDrawerSize="250" direction="LEFT">
<styleClass>
<String fx:value="body" />
</styleClass>
</JFXDrawer>
</center>
</BorderPane>
</StackPane>
控制器:
package com.semeq.controllers;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import com.jfoenix.controls.JFXDrawer;
import com.jfoenix.controls.JFXHamburger;
import com.jfoenix.controls.JFXRippler;
import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
@Controller
public class Test {
@FXML
private Pane root;
@FXML
private StackPane titleBurgerContainer;
@FXML
private JFXHamburger titleBurger;
@FXML
private JFXRippler optionsRippler;
@FXML
private StackPane optionsBurger;
@FXML
private VBox box;
@FXML
private JFXDrawer drawer;
public void initialize() {
try {
box = FXMLLoader.load(getClass().getResource("/Home.fxml"));
drawer.setSidePane(box);
for (Node node : box.getChildren()) {
if(node.getAccessibleText() != null) {
System.out.println("xdasdd");
node.addEventHandler(MouseEvent.MOUSE_CLICKED, (ex) -> {
switch(node.getAccessibleText()) {
case "Gerenciar" :
try {
StackPane gerenciar = FXMLLoader.load(getClass().getResource("/Gerenciar.fxml"));
root.getChildren().addAll(gerenciar);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
break;
}
});
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
HamburgerBackArrowBasicTransition transition = new HamburgerBackArrowBasicTransition(titleBurger);
drawer.setOnDrawerOpening(e -> {
transition.setRate(1);
transition.play();
});
drawer.setOnDrawerClosing(e -> {
transition.setRate(-1);
transition.play();
});
titleBurgerContainer.setOnMouseClicked(e -> {
if (drawer.isClosed() || drawer.isClosing()) {
drawer.open();
} else {
drawer.close();
}
});
}
}
我不知道这是否可能 所有内容的舞台 以及该内容中菜单的阶段
换句话说,我想要一个主舞台 另一个阶段是该主要阶段的一部分,当您单击该主要阶段时,它将出现
答案 0 :(得分:1)
很抱歉,您所做的一切都错了。您使一切变得非常复杂。每当您使用JFXDrawer
时。尝试为抽屉本身创建一个单独的fxml
文件,并为要放置抽屉的fxml
容器创建另一个root
文件。这样,您将拥有两个fxml
文件。它将使事情变得更加简单。
这是我解决您问题的方法。希望对您有帮助!
Main.java (主启动文件)-
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Parent;
import javafx.scene.Scene;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
//this is the directory - package_name/fxml_file.fxml
Parent root =
FXMLLoader.load(getClass().getResource("/application/container.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.setTitle("Material Design JFX Navigation Drawer");
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
NavigationController.java (控制器类)-
public class NavigationController implements Initializable {
@FXML private AnchorPane anchorPane;
@FXML private StackPane stackPane1, stackPane2, stackPane3, stackPane4;
@FXML private JFXHamburger hamburger;
@FXML private JFXDrawer drawer;
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
StackPane[] stackPaneArray = {stackPane1, stackPane2, stackPane3, stackPane4};
for(int i = 0;i<stackPaneArray.length;i++){
stackPaneArray[i].setVisible(false);;
}
try {
VBox box = FXMLLoader.load(getClass().getResource("/application/drawer.fxml")); //this is the directory - package_name/fxml_file.fxml
drawer.setSidePane(box);
for(Node node : box.getChildren()){
if(node.getAccessibleText()!=null){
node.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) ->{
switch(node.getAccessibleText()){
case "Gerenciar_1":
stackPane1.setVisible(true);
stackPane2.setVisible(false);
stackPane3.setVisible(false);
stackPane4.setVisible(false);
break;
case "Gerenciar_2":
stackPane1.setVisible(false);
stackPane2.setVisible(true);
stackPane3.setVisible(false);
stackPane4.setVisible(false);
break;
case "Gerenciar_3":
stackPane1.setVisible(false);
stackPane2.setVisible(false);
stackPane3.setVisible(true);
stackPane4.setVisible(false);
break;
case "Gerenciar_4":
stackPane1.setVisible(false);
stackPane2.setVisible(false);
stackPane3.setVisible(false);
stackPane4.setVisible(true);
break;
}
});
}
}
HamburgerBackArrowBasicTransition transition = new HamburgerBackArrowBasicTransition(hamburger);
transition.setRate(-1);
hamburger.addEventHandler(MouseEvent.MOUSE_PRESSED,(e) -> {
transition.setRate(transition.getRate()*-1);
transition.play();
if(drawer.isShown()){
drawer.close();
}else{
drawer.open();
}
});
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
container.fxml (容器的fxml文件)-
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXDrawer?>
<?import com.jfoenix.controls.JFXHamburger?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity"
minHeight="-Infinity" minWidth="-Infinity" prefHeight="390.0"
prefWidth="460.0" xmlns="http://javafx.com/javafx/8.0.102"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="application.NavigationController">
<children>
<JFXDrawer fx:id="drawer" defaultDrawerSize="173.0" layoutY="24.0"
prefHeight="367.0" prefWidth="100.0" />
<MenuBar prefHeight="25.0" prefWidth="460.0">
<menus>
<Menu mnemonicParsing="false">
<graphic>
<JFXHamburger fx:id="hamburger" />
</graphic>
</Menu>
</menus>
</MenuBar>
<StackPane fx:id="stackPane1" layoutX="140.0" layoutY="25.0" prefHeight="367.0" prefWidth="320.0">
<children>
<Label text="StackPane 1">
<font>
<Font name="System Bold" size="17.0" />
</font>
</Label>
</children></StackPane>
<StackPane fx:id="stackPane2" layoutX="140.0" layoutY="25.0" prefHeight="367.0" prefWidth="320.0">
<children>
<Label text="StackPane 2">
<font>
<Font name="System Bold" size="17.0" />
</font>
</Label>
</children></StackPane>
<StackPane fx:id="stackPane3" layoutX="140.0" layoutY="25.0" prefHeight="367.0" prefWidth="320.0">
<children>
<Label text="StackPane 3">
<font>
<Font name="System Bold" size="17.0" />
</font>
</Label>
</children></StackPane>
<StackPane fx:id="stackPane4" layoutX="140.0" layoutY="25.0" prefHeight="367.0" prefWidth="320.0">
<children>
<Label text="StackPane 4">
<font>
<Font name="System Bold" size="17.0" />
</font>
</Label>
</children></StackPane>
</children>
</AnchorPane>
drawer.fxml (抽屉的fxml文件)-
<?xml version="1.0" encoding="UTF-8"?>
<?import com.jfoenix.controls.JFXButton?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<VBox alignment="TOP_RIGHT" maxHeight="-Infinity" maxWidth="-Infinity"
minHeight="-Infinity" minWidth="-Infinity" prefHeight="390.0"
prefWidth="173.0" xmlns="http://javafx.com/javafx/8.0.102"
xmlns:fx="http://javafx.com/fxml/1">
<children>
<JFXButton accessibleText="Gerenciar_1" buttonType="RAISED"
focusTraversable="false" prefHeight="57.0" prefWidth="176.0"
text="Gerenciar">
<font>
<Font size="15.0" />
</font>
<graphic>
<FontAwesomeIconView glyphName="USER" size="30" wrappingWidth="43.0" />
</graphic>
</JFXButton>
<JFXButton accessibleText="Gerenciar_2" buttonType="RAISED"
focusTraversable="false" prefHeight="57.0" prefWidth="178.0"
text="Gerenciar">
<font>
<Font size="15.0" />
</font>
<graphic>
<FontAwesomeIconView glyphName="USER" size="30" wrappingWidth="43.0" />
</graphic>
</JFXButton>
<JFXButton accessibleText="Gerenciar_3" buttonType="RAISED"
focusTraversable="false" prefHeight="57.0" prefWidth="178.0"
text="Gerenciar">
<font>
<Font size="15.0" />
</font>
<graphic>
<FontAwesomeIconView glyphName="USER" size="30" wrappingWidth="43.0" />
</graphic>
</JFXButton>
<JFXButton accessibleText="Gerenciar_4" buttonType="RAISED"
focusTraversable="false" prefHeight="57.0" prefWidth="178.0"
text="Gerenciar">
<font>
<Font size="15.0" />
</font>
<graphic>
<FontAwesomeIconView glyphName="USER" size="30" wrappingWidth="43.0" />
</graphic>
</JFXButton>
</children>
</VBox>
这是我所做的屏幕截图-
看看。我希望它能解决您的问题。