JAVAFX开发(二)

本文是JavaFX开发系列的第二篇,详细介绍了JavaFX的目录结构,特别是以Maven项目为例。文章分析了Java源码,解释了Application类、Scene、Stage的角色,并讨论了FXML文件的使用,包括绑定控制器、事件处理和ID引用。同时,作者分享了在开发过程中遇到的单选按钮和下拉框问题的解决方案,以及JavaFX应用的打包挑战,提到了使用exe4j进行打包的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前由一篇是关于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好大,我是删除了一些内容然后放一起的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值