折腾了一小会,基本上实现了JavaFx的核心逻辑。
Javafx的界面包含:Scene(场景)、Stage(舞台)、Pane(面板)、其他的例如一些控件。
按照从大到小顺序是
Stage->Scene->Pane->Control(组件)
组件依赖Controller实现事件的触发。
其实在Eclipse会自动帮我们新建JavaFx的项目,包括GUI设计我们也是直接使用JavaFx Scene Builder来进行设计导出fxml,实现所见即所得。
创建好的JavaFX空模板应该如下:
package application;
import java.net.URL;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Parent;
import javafx.fxml.FXMLLoader;
import javafx.fxml.JavaFXBuilderFactory;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {
URL location = getClass().getResource("test.fxml");
FXMLLoader fxml = new FXMLLoader();
fxml.setLocation(location);
fxml.setBuilderFactory(new JavaFXBuilderFactory());
Parent root = fxml.load();
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
Controller controller=fxml.getController();
controller.init();
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
JavaFx Scene Builder产生的格式为fxml格式,因此需要引入FXMLLoader来进行资源的加载。这里我们不直接调用类,而是创建一个新对象,来加载fxml界面布局。
注意,Eclipse默认编译到bin位置后获取的location其实是bin目录,所以fxml需要新建到bin目录,否则会报错。如果不清楚的话,可以自己打印一条空路径(getClass().getResource(""))确认当前项目的目录。
下面是Controller的代码。
package application;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
public class Controller extends Main {
@FXML
private Button testBtn;
@FXML
private void onButton1Open (MouseEvent event) {
Alert alert=new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("这是一个信息框");
alert.setContentText("这是显示的文本");
alert.show();
}
}
onButton1Open是我在JSB中为testBtn定义的一个MouseEvent,点击后会弹出一个信息框。
踩的坑:
1.location位置不对
2.使用了fx:root来填充controller class,导致编译报错
总体而言JavaFx还是很容易上手的,而且组件非常多,即使是对于像我这样不太用Java的人来说(相当容易),基本上二十分钟左右就可以比较熟悉它的工作模式了。
网上应该也有一整套的例程,可以根据代码来进行学习。
JDK11以上版本需要再次安装一下JavaFx.