最近看了些JavaFX,感觉写法上比较灵活。
1. JavaFX遵循MVC-pattern,
在Intelli J里面创建的Project 是一个Main.java, 一个Controller.java 还有一个sample.fxml文件。
.fxml文件对应 "view",Controller.java就是"controller",最后一个main.java则对应"model".
我的示例代码简单的用一个java文件和一个FXML文件来做所有事情,等于我把controller和model写在了一个
文件里。最后main() 函数可以有,也可以没有. main()函数只是为了向前兼容。
如例子:
-
public class UseFxml extends Application {
-
-
@Override
-
public void start(Stage primaryStage) throws Exception{
-
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
-
primaryStage.setTitle("Hello World");
-
primaryStage.setScene(new Scene(root, 300, 275));
-
primaryStage.show();
-
}
-
-
public static void main(String[] args) {
-
launch(UseFxml.class , args);
-
}
-
}
下面是sample.fxml的内容。
-
<?import javafx.scene.layout.GridPane?>
-
<?import javafx.scene.control.Label?>
-
<?import javafx.scene.text.Font?>
-
<GridPane fx:controller="sample.Controller"
-
xmlns:fx="" alignment="center" hgap="10" vgap="10">
-
<Label text="Welcome to JavaFX!" textFill="green">
-
<font>
-
<Font name="Times New Roman bold" size="20"/>
-
</font>
-
</Label>
-
</GridPane>
2. 你可以使用FXML文件来当作"view",甚至也可以直接用代码来写。
main()的调用方式,我看到下面的两种调用方式,都能用。
launch(UseFxml.class, args);
launch(args);
下面的代码跟上面的使用FXML文件效果是一样的。
-
public class Main extends Application {
-
-
@Override
-
public void start(Stage primaryStage) throws Exception{
-
//Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
-
GridPane root = new GridPane();
-
root.setAlignment(Pos.CENTER);
-
root.setVgap(10);
-
root.setHgap(10);
-
-
primaryStage.setTitle("Hello World");
-
primaryStage.setScene(new Scene(root, 300, 275));
-
-
Label greeting = new Label("Welcome to JavaFX!");
-
greeting.setTextFill(Color.GREEN);
-
greeting.setFont(Font.font("Times New Romen", FontWeight.BOLD, 20));
-
root.getChildren().add(greeting);
-
primaryStage.show();
-
}
-
-
-
public static void main(String[] args) {
-
launch(args);
-
}
-
}
3. 安装JavaFX scene builder,然后在Intelli J里面选中.fxml文件,就可以选择open in scenebuilder了.
自从8u40以后就不再有scenebuilder这个软件了。
4. all the layout including HBox, inherit from Node, keyboard and mouse events can be consumed
by layout.
5. 最简单的处理Mouse Event的例子。
-
public class event2 extends Application implements Initializable {
-
-
@FXML
-
private Label label;
-
-
@Override
-
public void initialize(URL url, ResourceBundle rb){
-
//TODO
-
}
-
-
@FXML
-
private void handleButtonAction(ActionEvent event){
-
System.out.println("You clicked me !");
-
label.setText("Hello World!");
-
}
-
-
@Override
-
public void start(Stage primaryStage) throws Exception{
-
Parent root = FXMLLoader.load(getClass().getResource("event2.fxml"));
-
primaryStage.setTitle("Hello World");
-
primaryStage.setScene(new Scene(root, 300, 275));
-
primaryStage.show();
-
}
-
-
public static void main(String[] args) {
-
launch(args);
-
}
-
}
下面是event2.fxml的内容
-
<?xml version="1.0" encoding="UTF-8"?>
-
<?import javafx.scene.control.*?>
-
<?import javafx.scene.layout.*?>
-
-
<AnchorPane xmlns=""
-
xmlns:fx=""
-
fx:controller="events.event2"
-
prefHeight="400.0" prefWidth="600.0">
-
-
<children>
-
<Button id="button" layoutX="126" layoutY="90" text="Click me"
-
onAction="#handleButtonAction" fx:id="button" />
-
<Label id="label" layoutX="126" layoutY="120" minHeight="16"
-
minWidth="69" prefHeight="16" prefWidth="169" fx:id="label" />
-
</children>
-
</AnchorPane>
阅读(936) | 评论(0) | 转发(0) |