Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,使用javaFX作为主菜单,然后切换到游戏本身的JFrame_Java_Swing_Javafx_Jframe - Fatal编程技术网

Java,使用javaFX作为主菜单,然后切换到游戏本身的JFrame

Java,使用javaFX作为主菜单,然后切换到游戏本身的JFrame,java,swing,javafx,jframe,Java,Swing,Javafx,Jframe,我在这里询问是否可以使用JavaFX作为我游戏的主菜单,然后切换到游戏本身的JFrame 我之所以想这样做,是因为我知道如何用JavaFX而不是JFrame制作非常花哨的游戏菜单,而且JavaFX对我来说也比JFrame更花哨 我将非常感谢您给我的任何帮助。这是可以做到的:您只需要确保在所有事情上使用正确的线程。特别是,确保在AWT事件调度线程上启动Swing应用程序 下面是一个简单的例子 斯温加普: import java.awt.BorderLayout; import javax.swi

我在这里询问是否可以使用JavaFX作为我游戏的主菜单,然后切换到游戏本身的JFrame

我之所以想这样做,是因为我知道如何用JavaFX而不是JFrame制作非常花哨的游戏菜单,而且JavaFX对我来说也比JFrame更花哨


我将非常感谢您给我的任何帮助。

这是可以做到的:您只需要确保在所有事情上使用正确的线程。特别是,确保在AWT事件调度线程上启动Swing应用程序

下面是一个简单的例子

斯温加普:

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class SwingApp extends JFrame {

    public SwingApp() {
        setLayout(new BorderLayout());
        add(new JLabel("This is the Swing App", JLabel.CENTER), BorderLayout.CENTER);
        JButton quitButton = new JButton("Exit");
        quitButton.addActionListener(e -> System.exit(0));
        add(quitButton, BorderLayout.SOUTH);
        setSize(600, 600);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
然后

import javax.swing.SwingUtilities;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class LaunchSwingFromFX extends Application {

    @Override
    public void start(Stage primaryStage) {

        Platform.setImplicitExit(false);

        Button launch = new Button("Launch");
        launch.setOnAction(e -> {
            SwingUtilities.invokeLater(SwingApp::new);
            primaryStage.hide();
        });
        StackPane root = new StackPane(launch);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

这是可以做到的:你只需要确保你使用了正确的线程。特别是,确保在AWT事件调度线程上启动Swing应用程序

下面是一个简单的例子

斯温加普:

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class SwingApp extends JFrame {

    public SwingApp() {
        setLayout(new BorderLayout());
        add(new JLabel("This is the Swing App", JLabel.CENTER), BorderLayout.CENTER);
        JButton quitButton = new JButton("Exit");
        quitButton.addActionListener(e -> System.exit(0));
        add(quitButton, BorderLayout.SOUTH);
        setSize(600, 600);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
然后

import javax.swing.SwingUtilities;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class LaunchSwingFromFX extends Application {

    @Override
    public void start(Stage primaryStage) {

        Platform.setImplicitExit(false);

        Button launch = new Button("Launch");
        launch.setOnAction(e -> {
            SwingUtilities.invokeLater(SwingApp::new);
            primaryStage.hide();
        });
        StackPane root = new StackPane(launch);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

是的,只需在
SwingUtilities.invokeLater(…)
中创建并显示
JFrame
,那么为什么不使用JavaFX处理所有事情呢?Swing已过时。@James_D我是否在同一个类中创建javaFX和Jframe?完全由您决定,只需确保您在FX应用程序线程上创建任何javaFX
Stage
s,并在AWT事件调度线程上创建
Jframe
。好的,但我认为您在找麻烦。您真的希望FX应用程序线程和AWT事件线程同时运行吗?理论上,应用程序的每个部分都应该接收适当的事件。在实践中,您可能会遇到各种各样的错误,您希望事件出现在应用程序的一个部分,而它出现在另一个部分。您的应用程序将很难维护,并且可能容易出现错误。我强烈建议您只使用一个平台或另一个平台。是的,只需在
SwingUtilities.invokeLater(…)
中创建并显示
JFrame
,那么您为什么不使用JavaFX来处理所有问题呢?Swing已过时。@James_D我是否在同一个类中创建javaFX和Jframe?完全由您决定,只需确保您在FX应用程序线程上创建任何javaFX
Stage
s,并在AWT事件调度线程上创建
Jframe
。好的,但我认为您在找麻烦。您真的希望FX应用程序线程和AWT事件线程同时运行吗?理论上,应用程序的每个部分都应该接收适当的事件。在实践中,您可能会遇到各种各样的错误,您希望事件出现在应用程序的一个部分,而它出现在另一个部分。您的应用程序将很难维护,并且可能容易出现错误。我强烈建议您只使用一个或另一个平台。非常感谢James_D和所有commented@NightX:点击左边的,你可以接受这个答案。接受你的回答谢谢你的詹姆斯和所有commented@NightX:单击左侧的可接受此答案。已接受您的答案