javafx做桌面应用程序

idea可以直接开发javafx项目,但是需要一个SceneBuilder ,用来开发ui,或者按照  https://blog.csdn.net/hst_gogogo/article/details/82530929  ,进行集成

开发过程

说明:给fxml文件内标签设置control配置我这边没有生效,通过id注解控件,拿到的控件为空;通过 #方法名 注解控件方法是可以成功调用到方法

 补充:设置controller方法找到原因了,因为给控件设置id应该是fx:id 而不是 id,完美解决

这边我用的是仿照安卓的控件查找和事件设置

java代码:、

Main.java

package sample;

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

import java.util.Random;

public class Main extends Application {
    MainController mainController;
    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Random random  = new Random();
        int i = random.nextInt(3);
        primaryStage.setTitle("Random 0-3 ,nextInt = " + i);
        mainController = new MainController();
        mainController.button_left = (Button) root.lookup("#button_left");
        mainController.button_right = (Button) root.lookup("#button_right");
        mainController.textArea_left = (TextArea) root.lookup("#textArea_left");
        mainController.textArea_right = (TextArea) root.lookup("#textArea_right");
        mainController.initAction();
        primaryStage.setScene(new Scene(root, 1280, 720));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

  

MainControl.java

package sample;

import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.input.MouseEvent;


public class MainController {

//    @FXML
    TextArea textArea_left;
//    @FXML
    TextArea textArea_right;
//    @FXML
    Button button_left;
//    @FXML
    Button button_right;

    int clickLeftCount = 0;
    int clickRightCount = 0;

//    @FXML
    void click_left() {
        if (button_left!=null){
            button_left.setText("我是button_left");
        }else {
            System.out.println("click_left is null");
        }
        if (textArea_left != null) {
            textArea_left.setText(clickLeftCount++ + "");
        }else {
            System.out.println("textArea_left is null");
        }
    }

//    @FXML
    void click_right() {
        if (button_right!=null){
            button_right.setText("我是button_right");
        }else {
            System.out.println("click_right is null");
        }
        if (textArea_right != null) {
            textArea_right.setText(clickRightCount++ + "");
        }else {
            System.out.println("textArea_right is null");
        }
    }

    public void initAction() {
        if (button_left!=null){
            button_left.setOnMouseClicked(new EventHandler<MouseEvent>() {
                public void handle(MouseEvent event) {
                    if (button_left!=null){
                        button_left.setText("我是button_left");
                    }else {
                        System.out.println("click_left is null");
                    }
                    if (textArea_left != null) {
                        textArea_left.setText(clickLeftCount++ + "");
                    }else {
                        System.out.println("textArea_left is null");
                    }
                }
            });
        }
        if (button_right!=null){
            button_right.setOnMouseClicked(new EventHandler<MouseEvent>() {
                public void handle(MouseEvent event) {
                    if (button_right!=null){
                        button_right.setText("我是button_right");
                    }else {
                        System.out.println("click_right is null");
                    }
                    if (textArea_right != null) {
                        textArea_right.setText(clickRightCount++ + "");
                    }else {
                        System.out.println("textArea_right is null");
                    }
                }
            });
        }

    }
}

  

fxml布局,是通过SceneBuilder绘制UI后,保存的fxml文件

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.Line?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"
      prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"

        >
    <children>
        <TextArea id="textArea_left" layoutX="55.0" layoutY="50.0" prefHeight="83.0" prefWidth="197.0"
                   style="-fx-background-color: #ff0;"/>
        <TextArea id="textArea_right" layoutX="351.0" layoutY="50.0" prefHeight="83.0" prefWidth="197.0"
                   style="-fx-background-color: #ff0;"/>
        <Button id="button_left" layoutX="107.0" layoutY="296.0"   mnemonicParsing="false" text="Random(0-3)"/>
        <Button id="button_right" layoutX="403.0" layoutY="296.0" mnemonicParsing="false" text="Random(0-3)"/>
        <Line endX="27.0" endY="74.0" layoutX="126.0" layoutY="222.0" startX="27.0" startY="-89.0"/>
        <Line endX="27.0" endY="74.0" layoutX="422.0" layoutY="222.0" startX="27.0" startY="-89.0"/>
    </children>
</Pane>

 

打包过程

选择module setting

 新建一个执行命令

选择build刚刚新建的命令

这就能看到jar包了,右键在jvm环境执行

能正常看到我们的页面,这就是一个可执行jar包了,放在有jre环境的机器上,就可以正常运行了

jar转换为exe执行文件

首先下载一个exe4j的jar包转换为exe的工具

然后按照百度教程

https://jingyan.baidu.com/article/c275f6ba28e15ae33d756711.html

就可以生成exe文件,在没有jre环境的机器上也可以正常运行我们的软件了

原文地址:https://www.cnblogs.com/fengchuxiaodai/p/13353882.html