我是一名初级Java程序员,完成了#101; Java 101"在我当地的大学上课。我也在努力学习一些额外的主题,包括Java FX。我已经在Oracle网站上完成了Java FX教程,还有一些YouTube视频,还有阅读" Java FX for Dummies" (这是我能为初学者找到的最好的书。)所有这些材料都教会了我很多基础知识,但是(应该)相对简单的一些东西让我感到厌烦。
例如:假设我有一个在一个舞台上使用多个场景的Java FX程序。当用户点击" Switch!"按钮,第二个场景换出第一个。简单。我可以在一个.java文件中完成所有这些,没问题。 (见下面的代码)
但是我的.java类文件变得非常冗长而且很麻烦。如果我可以将一个场景定义/声明/初始化为一个.java文件中的一个类而将另一个场定义为另一个.java文件中的另一个类,那将会很棒。这将使得更加容易地跟踪每个场景的组件。问题是,我无法弄清楚如何做到这一点。
我想你会编写一个Scene1.java类,然后编写一个Scene2.java类,当你想要切换场景时,只需在两者之间传递舞台对象。但我无法找到一个如何完成此操作的示例,我的所有尝试都会导致编译器错误或实际上可怕的运行时错误。
有谁知道如何做到这一点?如果是这样,我需要做些什么才能修改下面的SwitchScenes2()
方法来创建新的Scene2
对象并将其传递给舞台?
谢谢! RAO
/*
JavaFXExample.java
*/
import javafx.application.*;
import javafx.stage.*;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.control.*;
import javafx.event.*;
import javafx.geometry.*;
public class JavaFXExample extends Application{
public static void main(String[] args){
launch(args);
}
Button btnSw1;
Button btnSw2;
Button btnClose;
HBox hbox1;
VBox vbox1;
Scene scene1;
Scene scene2;
Stage stage;
@Override public void start(Stage primaryStage){
btnSw1 = new Button("Switch Scenes!");
btnSw1.setOnAction(
e -> SwitchScenes2() );
btnSw2 = new Button("Switch back!");
btnSw2.setOnAction(
e -> SwitchScenes1() );
btnClose = new Button();
btnClose.setText("Close me!");
btnClose.setOnAction(e -> CloseWindowClick());
hbox1 = new HBox(10);
hbox1.getChildren().addAll(btnSw1);
vbox1 = new VBox(10);
vbox1.getChildren().addAll(btnSw2, btnClose);
scene1 = new Scene(hbox1, 300, 300);
scene2 = new Scene(vbox1, 200, 400);
stage = primaryStage;
stage.setScene(scene1);
stage.setTitle("Example App");
stage.show();
}
public void SwitchScenes1(){
stage.setScene(scene1);
}
public void SwitchScenes2(){
stage.setScene(scene2);
}
public void CloseWindowClick(){
stage.close();
}
}
答案 0 :(得分:1)
您要做的是创建单独的类,这两个类都具有返回场景的功能。从那里你需要初始化这些类,并使用按钮调用一个函数,该函数将向这些场景添加数据或创建一个新的空白场景(作为“删除”场景的快速方法)。但是如果你想要一种更专业的方式在这样的场景之间切换,你会想要查看TabPane()。
Scene1 scene1 = new Scene1();
Scene2 scene2 = new Scene2();
TabPane tabPane = new TabPane();
Tab tab1 = new Tab();
tab1.setContent(scene1);
tabPane.getTabs().add(tab1);
Tab tab2 = new Tab();
tab2.setContent(scene2);
tabPane.getTabs().add(tab2);
答案 1 :(得分:1)
公共类VMCSManager扩展了Application {
private Parent content;
private static VMCSManager instance;
public VMCSManager() {
instance=this;
}
public static void main(String[] args) {
launch(args);
}
public static VMCSManager getInstance() {
return instance;
}
@Override
public void start(Stage primaryStage) throws Exception {
initializePanel();
Scene scene = new Scene(content);
stageStyle(primaryStage);
primaryStage.setScene(scene);
primaryStage.show();
}
private void initializePanel() throws IOException{
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("fxml/SimulatorDisplay.fxml"));
content = loader.load();
}
public void openCustomerPanel() throws IOException{
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("fxml/CustomerDisplay.fxml"));
content = loader.load();
Scene scene = new Scene(content);
primaryStage.setScene(scene);
primaryStage.show();
}
}
公共类SimulatorController实现Initializable {
@FXML
public void clickCustomer (ActionEvent event) throws IOException{
log.info("Starting Customer Panel");
VMCSManager.getInstance().openCustomerPanel();
}
@FXML
public void clickMaintainer(ActionEvent event) throws IOException{
log.info("Starting Maintainer Panel");
VMCSManager.getInstance().openMaintainerPanel();
}
}
公共类CustomerController扩展了SimulatorController {
@FXML
private Label brand1Lbl;
@FXML
private Label brand2Lbl;
@FXML
private Label brand3Lbl;
@FXML
private Label brand4Lbl;
@FXML
private Label brand5Lbl;
@FXML
private Label statusLbl1;
@FXML
private Label statusLbl2;
private static final Logger log=LoggerFactory.getLogger(CustomerController.class);
public CustomerController() {
context= new BuyingStateContext();
}
public void initialize(URL location, ResourceBundle resources) {
this.location = location;
this.rb = resources;
coinsValidityFlash.setVisible(false);
insertCoinTxt.setDisable(true);
brand1Btn.setStyle("-fx-background-color: #CACACA;");
brand2Btn.setStyle("-fx-background-color: #CACACA;");
brand3Btn.setStyle("-fx-background-color: #CACACA;");
brand4Btn.setStyle("-fx-background-color: #CACACA;");
brand5Btn.setStyle("-fx-background-color: #CACACA;");
populateVending();
}
.
.
.
}
`
答案 2 :(得分:1)
Pete我理解你希望将一个大的java文件分成小文件,在每个类中创建Java类创建方法(函数)将返回布局(HBox,VBox,Flowpane或....)然后在你的主创建该Java类的对象,并使用这些方法构建大型应用程序。
在我的示例中,我用一个函数创建了一个main和一个单独的类,只是为了向您展示它的工作原理。在我的主要有2个标签,2个按钮一个布局和一个分离类的对象,通过单击按钮场景将改变 我的主要:
public class SwitchSceneSample extends Application {
public static void main(String[] args) {
launch(args);
}
Stage window;
Scene scene1, scene2;
@Override
public void start(Stage primaryStage) throws Exception {
// I am using window as primaryStage
window = primaryStage;
// Label 1
Label label1 = new Label("Welcome to the first scene!");
// Label 2
Label label2 = new Label("This is second scene!");
// Button 1, by pressing this button primaryStage will be set as scene 2
Button button1 = new Button("Go to scene 2");
button1.setOnAction(e -> window.setScene(scene2));
// Button 2, by pressing this button primaryStage will be set as scene 1
Button button2 = new Button("Click to go scene 1");
button2.setOnAction(e -> window.setScene(scene1));
// Creating an object of the class'LayoutOne.java'
LayoutOne l1 = new LayoutOne();
// set my scene 1(by calling method called 'sceneView1()' from class 'LayoutOne.java')
scene1 = new Scene(l1.sceneView1(label1, button1), 200, 200);
// Set my scene 2 inside my main class
StackPane layout2 = new StackPane();
layout2.getChildren().addAll(label2, button2);
scene2 = new Scene(layout2, 600, 300);
// Making my
window.setScene(scene1);
window.setTitle("Scene Switch Sample");
window.show();
}
}
我的第二课:
public class LayoutOne {
public VBox sceneView1(Label label, Button button) {
// Layout 1 - children are laid out in vertical column
VBox layout1 = new VBox(20);
layout1.getChildren().addAll(label, button);
return layout1;
}
}