Javafx 2 如何在JavaFX中切换工作空间

Javafx 2 如何在JavaFX中切换工作空间,javafx-2,javafx,javafx-8,Javafx 2,Javafx,Javafx 8,我想创建几个可以用切换按钮切换的工作空间。我创建了这个例子 package menunavigation; import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; impo

我想创建几个可以用切换按钮切换的工作空间。我创建了这个例子

package menunavigation;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class MenuNavigation extends Application
{

    @Override
    public void start(Stage primaryStage)
    {

        final VBox vbox = new VBox();

        MenuBar menuBar = new MenuBar();

        // --- Menu File
        Menu menuFile = new Menu("File");

        // --- Menu Edit
        Menu menuEdit = new Menu("Edit");

        // --- Menu View
        Menu menuView = new Menu("View");

        menuBar.getMenus().addAll(menuFile, menuEdit, menuView);

        // buttons

        String pillButtonCss = MenuNavigation.class.getResource("PillButton.css").toExternalForm();

        // create 3 toggle buttons and a toogle group for them
        ToggleButton tb1 = new ToggleButton("Left Button");
        tb1.setId("pill-left");
        ToggleButton tb2 = new ToggleButton("Center Button");
        tb2.setId("pill-center");
        ToggleButton tb3 = new ToggleButton("Right Button");
        tb3.setId("pill-right");

        final ToggleGroup group = new ToggleGroup();
        tb1.setToggleGroup(group);
        tb2.setToggleGroup(group);
        tb3.setToggleGroup(group);
        // select the first button to start with
        group.selectToggle(tb1);

        final Rectangle rect1 = new Rectangle(300, 300);
        rect1.setFill(Color.ALICEBLUE);
        final Rectangle rect2 = new Rectangle(300, 300);
        rect2.setFill(Color.AQUA);
        final Rectangle rect3 = new Rectangle(300, 300);
        rect3.setFill(Color.AZURE);

        tb1.setUserData(rect1);
        tb2.setUserData(rect2);
        tb3.setUserData(rect3);

        group.selectedToggleProperty().addListener(new ChangeListener<Toggle>()
        {
            @Override
            public void changed(ObservableValue<? extends Toggle> ov, Toggle toggle, Toggle new_toggle)
            {
                if (new_toggle == null)
                {
                    //rect.setFill(Color.WHITE);
                }
                else
                {
                    //rect.setFill((Color) group.getSelectedToggle().getUserData());
                    vbox.getChildren().setAll((Node) group.getSelectedToggle().getUserData());
                }
            }
        });

        HBox hBox = new HBox();
        hBox.getChildren().addAll(tb1, tb2, tb3);
        hBox.setPadding(new Insets(10, 10, 10, 10));
        hBox.getStylesheets().add(pillButtonCss);

        // end buttons

        vbox.getChildren().addAll(menuBar, hBox, new Text("Test Space"));

        StackPane root = new StackPane();
        root.getChildren().add(vbox);

        Scene scene = new Scene(root, 800, 850);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}
这是视觉效果:

当我按下第二个按钮时,我得到:


我想使用切换按钮创建不同的工作空间,我想在其中放置一个主边框窗格或网格窗格,我想在其中插入许多其他组件。你能帮我得到这个结果吗。

有没有理由不使用a

编辑:

替换:

 vbox.getChildren().setAll((Node) group.getSelectedToggle().getUserData());
与:

显示矩形而不是文本


这会将节点替换为索引2,将vbox的文本替换为来自ToggleButtons UserData的节点,而不是替换当前代码中的所有元素。

还有一个问题。我注意到我换工作地点时的表现不太好。有没有更优化的解决方案?我不知道它是否更有效,但为您的工作区定义一个容器(如borderpane)并在单击时更改其内容肯定会更好。这将使它抵制vbox的子列表中的顺序更改。
  vbox.getChildren().set(2,(Node) group.getSelectedToggle().getUserData());