由於推出()不能被稱爲多次,我怎麼叫,說,一類是否可以在Java應用程序中多次調用JavaFX應用程序?
public class Graphs extends Application {
不止一次?我的程序從GUI運行並使用Graph.launch()調用JavaFX實用程序,並且我希望能夠多次調用該程序。我怎樣才能做到這一點?
由於推出()不能被稱爲多次,我怎麼叫,說,一類是否可以在Java應用程序中多次調用JavaFX應用程序?
public class Graphs extends Application {
不止一次?我的程序從GUI運行並使用Graph.launch()調用JavaFX實用程序,並且我希望能夠多次調用該程序。我怎樣才能做到這一點?
假設您在Java應用程序中使用Swing,爲了使用JavaFX,您不會使用應用程序類本身,而應該在應用程序start
方法中執行以構建JavaFX場景圖並將其嵌入場景圖內擺動JFXPanel。
我做了一個小例子:
import javafx.animation.FadeTransition;
import javafx.animation.RotateTransition;
import javafx.animation.Timeline;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.util.Duration;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Swing2Test extends JFrame {
public Swing2Test() {
setTitle("Simple example");
JPanel panel = new JPanel();
getContentPane().add(panel);
JButton button = new JButton("Show JavaFX Dialog");
button.setBounds(50, 60, 80, 30);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
final JDialog dialog = new JDialog(Swing2Test.this,
"JavaFX Dialog",
true);
final JFXPanel contentPane = new JFXPanel();
dialog.setContentPane(contentPane);
dialog.setDefaultCloseOperation(
JDialog.HIDE_ON_CLOSE);
// building the scene graph must be done on the javafx thread
Platform.runLater(new Runnable() {
@Override
public void run() {
contentPane.setScene(createScene());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
dialog.pack();
dialog.setVisible(true);
}
});
}
});
}
private Scene createScene() {
System.out.println("creating scene");
StackPane root = new StackPane();
Rectangle rect1 = new Rectangle(10, 10, 50, 50);
rect1.setFill(Color.BLUE);
Rectangle rect2 = new Rectangle(0, 0, 30, 30);
rect2.setFill(Color.ORANGE);
root.getChildren().addAll(rect1, rect2);
FadeTransition ft = new FadeTransition(Duration.millis(1800), rect1);
ft.setFromValue(1.0);
ft.setToValue(0.1);
ft.setCycleCount(Timeline.INDEFINITE);
ft.setAutoReverse(true);
ft.play();
RotateTransition rt = new RotateTransition(Duration.millis(1500), rect2);;
rt.setByAngle(180f);
rt.setCycleCount(Timeline.INDEFINITE);
rt.setAutoReverse(true);
rt.play();
return new Scene(root, 150, 150);
}
});
panel.add(button);
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Swing2Test ex = new Swing2Test();
ex.setVisible(true);
}
});
}
}
只能推出的Java虛擬機的單個應用程序。方法Application::launch()的Javadoc指定:
它不能被多次調用,否則將拋出異常。
如果您的應用程序是一個Swing應用程序,你可以改用在塞巴斯蒂安的答案中概述的技術,同樣一個SWT應用程序可以使用FXCanvas。
如果您的應用程序是您希望用作其他應用程序的「啓動程序」的JavaFX應用程序,則啓動程序可以在某些信號上創建一個新的Stage(例如按下啓動應用程序X按鈕),創建一個新的實例目標應用程序(使用new
),並在目標應用程序上調用start方法,傳入目標階段。