之前由一篇是关于javafx开发环境准备的一篇文章,这一篇是实际的开发了。
开发前先看一下javafx的目录结构。这里以maven为例。其中由一个java和一个resource文件,java就是我们平常开发的各种内容,App是我们的入口程序。resource中有fxml文件,这就是我们桌面程序主要的文件 了,就像web应用的html一样。
下面主要对javafx中的一些代码进行分析,以及fxml编写的一些我遇到的问题。
先分析下java中的文件内容。
首先这个App继承了javafx的Application类。里面有个launch方法。还有个start需要我们重写来展示场景。
然后定义了个Scene,这个可以看作为我们画的页面的纸。看下面重写的start中的new Scene(loadFXML("primary")),这句可以理解为将primary中的fxml布局贴在我们的sence上。然后stage就是windows的顶级容器,代表一个窗口,可以用来容纳sence。stage.setSence(sence);就是将我们的页面设置在这个窗口上,stage.show();就是将窗口显现出来。
下面的setRoot可以看作是一个更换我们所画的内容的方法。可以用来切换场景
loadFXML就是加载fxml文件,main就是启动入口
public class App extends Application {
private static Scene scene;
@Override
public void start(Stage stage) throws IOException {
scene = new Scene(loadFXML("primary"));
scene.getStylesheets().add(getClass().getResource("styles.css").toExternalForm());
stage.setScene(scene);
stage.show();
}
static void setRoot(String fxml) throws IOException {
scene.setRoot(loadFXML(fxml));
}
private static Parent loadFXML(String fxml) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
return fxmlLoader.load();
}
public static void main(String[] args) {
launch();
}
}
下面是controller中的内容。@FXML注解是为了绑定fxml文件中的内容。
public class PrimaryController {
@FXML
private void switchToSecondary() throws IOException {
App.setRoot("secondary");
}
}
下面直接开始看fxml文件,这里只说几个重要的地方,fx:controller这个里面的controller与上面java中的controller绑定,
onAction是点击事件,加个#号,然后在controller中加上@FXML注解就将这个方法事件绑定了,点击这个是就会触发controller中的方法。fx:id是标签的id,也可以用@FXML进行绑定,然后获取其中的值。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>
<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="org.openjfx.PrimaryController">
<children>
<Label text="Primary View" />
<Button fx:id="primaryButton" text="Switch to Secondary View" onAction="#switchToSecondary"/>
</children>
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
</VBox>
这个就是javafx的大致情况,下面说一些其中遇到的问题。
单选按钮的问题。在fxml中画单选按钮需要加上<toggleGroup>,然后在RadioButton 中加上toggleGroup="$selectType"
<toggleGroup> <ToggleGroup fx:id="selectType" /> </toggleGroup>
<RadioButton fx:id="radioButton2" disable="true" layoutX="319.0" layoutY="358.0" mnemonicParsing="false" text="按钮2" toggleGroup="$selectType" />
<RadioButton fx:id="radioButton3" disable="true" layoutX="53.0" layoutY="358.0" mnemonicParsing="false" text="按钮3" toggleGroup="$selectType" />
下拉框问题。javafx中下拉框我遇到的是赋值的问题,因为下拉选项不确定,所以写死是不可能的。然后我就找有没有可以通过绑定的方式将内容绑定到下拉框中,找了半天没找到通过fxml的,都是用java new一个下拉框,然后赋值啥的。
最后没办法只能通过初始赋值去做了,javafx的controller中可以加个initialize方法,可以通过这个进行初始赋值。
@FXML
private ChoiceBox choiceBox;
private ObservableList<String> checkList= FXCollections.observableArrayList();
public void initialize(){
for(RadioEnum radioEnum:RadioEnum.values()){
checkList.add(radioEnum.getName());
}
this.choiceBox.setItems(checkList);
}
其他的就是一些正常的开发流程了。
最后说一下javafx应用的打包,由于运行java程序需要jvm,所以移植性并不是很好,我是通过exe4j进行打包(具体方法可以百度谷歌),然后exe和jdk(jre)放一起,然后一起给别人就可以在其他人的机器上运行,这里吐槽下java12已经取消了jre,导致jdk好大,我是删除了一些内容然后放一起的。。。