Java 在选项卡窗格中的选项卡之间切换

Java 在选项卡窗格中的选项卡之间切换,java,javafx,javafx-2,javafx-8,scenebuilder,Java,Javafx,Javafx 2,Javafx 8,Scenebuilder,在JavaFX中是否可以延迟在选项卡窗格中的选项卡之间切换? 例如,当我将“选择”选项卡更改为“选项卡2”时,我希望看到所选选项卡上的一个过渡,然后将显示“选项卡2”。我认为您可以使用现有的选项卡窗格,但您需要自己管理选项卡内容;只需使用更改侦听器切换所选选项卡的选项卡内容 import java.util.HashMap; import java.util.Map; import javafx.animation.ScaleTransition; import javafx.animatio

在JavaFX中是否可以延迟在选项卡窗格中的选项卡之间切换?
例如,当我将“选择”选项卡更改为“选项卡2”时,我希望看到所选选项卡上的一个过渡,然后将显示“选项卡2”。

我认为您可以使用现有的
选项卡窗格
,但您需要自己管理选项卡内容;只需使用更改侦听器切换所选选项卡的选项卡内容

import java.util.HashMap;
import java.util.Map;

import javafx.animation.ScaleTransition;
import javafx.animation.SequentialTransition;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TransitioningTabPane extends Application {

    @Override
    public void start(Stage primaryStage) {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Tab 1");
        Tab tab2 = new Tab("Tab 2");
        tabPane.getTabs().addAll(tab1, tab2);

        Map<Tab, Node> tabContent = new HashMap<>();
        tabContent.put(tab1, createTab1Content());
        tabContent.put(tab2, createTab2Content());

        // Initial state:

        tab1.setContent(tabContent.get(tab1));
        tabPane.getSelectionModel().select(tab1);

        // State change manager:

        tabPane.getSelectionModel()
                .selectedItemProperty()
                .addListener(
                        (obs, oldTab, newTab) -> {
                            oldTab.setContent(null);
                            Node oldContent = tabContent.get(oldTab);
                            Node newContent = tabContent.get(newTab);

                            newTab.setContent(oldContent);
                            ScaleTransition fadeOut = new ScaleTransition(
                                    Duration.seconds(0.5), oldContent);
                            fadeOut.setFromX(1);
                            fadeOut.setFromY(1);
                            fadeOut.setToX(0);
                            fadeOut.setToY(0);

                            ScaleTransition fadeIn = new ScaleTransition(
                                    Duration.seconds(0.5), newContent);
                            fadeIn.setFromX(0);
                            fadeIn.setFromY(0);
                            fadeIn.setToX(1);
                            fadeIn.setToY(1);

                            fadeOut.setOnFinished(event -> {
                                newTab.setContent(newContent);
                            });

                            SequentialTransition crossFade = new SequentialTransition(
                                    fadeOut, fadeIn);
                            crossFade.play();
                        });

        BorderPane root = new BorderPane(tabPane);
        Scene scene = new Scene(root, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private Node createTab1Content() {
        Pane pane = new Pane();
        Rectangle rect1 = new Rectangle(50, 50, 250, 250);
        rect1.setFill(Color.SALMON);
        Rectangle rect2 = new Rectangle(150, 150, 250, 250);
        rect2.setFill(Color.CORNFLOWERBLUE.deriveColor(0, 1, 1, 0.5));
        Text text = new Text(225, 225, "This is tab 1");
        pane.getChildren().addAll(rect1, rect2, text);
        pane.setMinSize(500, 500);
        return pane;
    }

    private Node createTab2Content() {
        Pane pane = new Pane();
        Rectangle rect1 = new Rectangle(250, 50, 250, 250);
        rect1.setFill(Color.CORNFLOWERBLUE);
        Rectangle rect2 = new Rectangle(50, 150, 250, 250);
        rect2.setFill(Color.SALMON.deriveColor(0, 1, 1, 0.5));
        Text text = new Text(225, 225, "This is tab 2");
        pane.getChildren().addAll(rect1, rect2, text);
        pane.setMinSize(500, 500);
        return pane;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
import java.util.HashMap;
导入java.util.Map;
导入javafx.animation.ScaleTransition;
导入javafx.animation.SequentialTransition;
导入javafx.application.application;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TabPane;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.scene.text.text;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类转换TabPane扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
TabPane TabPane=新建TabPane();
Tab tab1=新选项卡(“Tab 1”);
Tab tab2=新选项卡(“Tab 2”);
tabPane.getTabs().addAll(tab1,tab2);
Map tabContent=newhashmap();
tabContent.put(tab1,createTab1Content());
tabContent.put(tab2,createTab2Content());
//初始状态:
tab1.setContent(tabContent.get(tab1));
tabPane.getSelectionModel().select(tab1);
//状态更改管理器:
tabPane.getSelectionModel()
.selectedItemProperty()
.addListener(
(obs、旧选项卡、新选项卡)->{
oldTab.setContent(空);
节点oldContent=tabContent.get(oldTab);
节点newContent=tabContent.get(newTab);
newTab.setContent(oldContent);
ScaleTransition淡出=新的ScaleTransition(
持续时间。秒(0.5),旧内容);
衰减设置Fromx(1);
淡出设置(1);
衰减。setToX(0);
淡出设置玩具(0);
ScaleTransition fadeIn=新的ScaleTransition(
持续时间。秒(0.5),新内容);
fadeIn.setFromX(0);
fadeIn.setFromY(0);
fadeIn.setToX(1);
fadeIn.setToY(1);
淡出。设置完成(事件->{
newTab.setContent(newContent);
});
顺序转换crossFade=新的顺序转换(
淡出,淡出);
crossFade.play();
});
BorderPane根=新的BorderPane(选项卡窗格);
场景=新场景(root,600600);
初级阶段。场景(场景);
primaryStage.show();
}
私有节点createTab1Content(){
窗格=新窗格();
矩形rect1=新矩形(50,50,250,250);
rect1.刚毛(颜色:鲑鱼);
矩形rect2=新矩形(150、150、250、250);
rect2.setFill(颜色:矢车菊蓝,deriveColor(0,1,1,0.5));
文本文本=新文本(225225,“这是表1”);
pane.getChildren().addAll(rect1、rect2、text);
窗格。设置大小(500500);
返回窗格;
}
私有节点createTab2Content(){
窗格=新窗格();
矩形rect1=新矩形(250,50,250,250);
rect1.刚毛填充(颜色:矢车菊蓝);
矩形rect2=新矩形(50150250250);
rect2.setFill(Color.SALMON.deriveColor(0,1,1,0.5));
文本文本=新文本(225225,“这是表2”);
pane.getChildren().addAll(rect1、rect2、text);
窗格。设置大小(500500);
返回窗格;
}
公共静态void main(字符串[]args){
发射(args);
}
}

我认为您可以使用现有的
选项卡窗格
,但您需要自己管理选项卡内容;只需使用更改侦听器切换所选选项卡的选项卡内容

import java.util.HashMap;
import java.util.Map;

import javafx.animation.ScaleTransition;
import javafx.animation.SequentialTransition;
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TransitioningTabPane extends Application {

    @Override
    public void start(Stage primaryStage) {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("Tab 1");
        Tab tab2 = new Tab("Tab 2");
        tabPane.getTabs().addAll(tab1, tab2);

        Map<Tab, Node> tabContent = new HashMap<>();
        tabContent.put(tab1, createTab1Content());
        tabContent.put(tab2, createTab2Content());

        // Initial state:

        tab1.setContent(tabContent.get(tab1));
        tabPane.getSelectionModel().select(tab1);

        // State change manager:

        tabPane.getSelectionModel()
                .selectedItemProperty()
                .addListener(
                        (obs, oldTab, newTab) -> {
                            oldTab.setContent(null);
                            Node oldContent = tabContent.get(oldTab);
                            Node newContent = tabContent.get(newTab);

                            newTab.setContent(oldContent);
                            ScaleTransition fadeOut = new ScaleTransition(
                                    Duration.seconds(0.5), oldContent);
                            fadeOut.setFromX(1);
                            fadeOut.setFromY(1);
                            fadeOut.setToX(0);
                            fadeOut.setToY(0);

                            ScaleTransition fadeIn = new ScaleTransition(
                                    Duration.seconds(0.5), newContent);
                            fadeIn.setFromX(0);
                            fadeIn.setFromY(0);
                            fadeIn.setToX(1);
                            fadeIn.setToY(1);

                            fadeOut.setOnFinished(event -> {
                                newTab.setContent(newContent);
                            });

                            SequentialTransition crossFade = new SequentialTransition(
                                    fadeOut, fadeIn);
                            crossFade.play();
                        });

        BorderPane root = new BorderPane(tabPane);
        Scene scene = new Scene(root, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private Node createTab1Content() {
        Pane pane = new Pane();
        Rectangle rect1 = new Rectangle(50, 50, 250, 250);
        rect1.setFill(Color.SALMON);
        Rectangle rect2 = new Rectangle(150, 150, 250, 250);
        rect2.setFill(Color.CORNFLOWERBLUE.deriveColor(0, 1, 1, 0.5));
        Text text = new Text(225, 225, "This is tab 1");
        pane.getChildren().addAll(rect1, rect2, text);
        pane.setMinSize(500, 500);
        return pane;
    }

    private Node createTab2Content() {
        Pane pane = new Pane();
        Rectangle rect1 = new Rectangle(250, 50, 250, 250);
        rect1.setFill(Color.CORNFLOWERBLUE);
        Rectangle rect2 = new Rectangle(50, 150, 250, 250);
        rect2.setFill(Color.SALMON.deriveColor(0, 1, 1, 0.5));
        Text text = new Text(225, 225, "This is tab 2");
        pane.getChildren().addAll(rect1, rect2, text);
        pane.setMinSize(500, 500);
        return pane;
    }

    public static void main(String[] args) {
        launch(args);
    }
}
import java.util.HashMap;
导入java.util.Map;
导入javafx.animation.ScaleTransition;
导入javafx.animation.SequentialTransition;
导入javafx.application.application;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TabPane;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.scene.text.text;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类转换TabPane扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
TabPane TabPane=新建TabPane();
Tab tab1=新选项卡(“Tab 1”);
Tab tab2=新选项卡(“Tab 2”);
tabPane.getTabs().addAll(tab1,tab2);
Map tabContent=newhashmap();
tabContent.put(tab1,createTab1Content());
tabContent.put(tab2,createTab2Content());
//初始状态:
tab1.setContent(tabContent.get(tab1));
tabPane.getSelectionModel().select(tab1);
//状态更改管理器:
tabPane.getSelectionModel()
.selectedItemProperty()
.addListener(
(obs、旧选项卡、新选项卡)->{
oldTab.setContent(空);
节点oldContent=tabContent.get(oldTab);
节点newContent=tabContent.get(newTab);
newTab.setContent(oldContent);
ScaleTransition淡出=新的ScaleTransition(