Ejemplo de JavaFX: la realización de un calendario simple

La biblioteca de interfaz de usuario de Java se divide en tres generaciones, la primera generación es awt, la segunda generación es swing y la tercera generación es javafx, que es una relación de sustitución entre sí. El desarrollo de escritorio ahora generalmente usa swing y javafx, hoy usamos javafx para desarrollar una aplicación de consulta de calendario simple.

El efecto final es el siguiente:
Inserte la descripción de la imagen aquí
dirección git: implementación del calendario JavaFX


desarrollo javafx

Hay dos formas de desarrollar la interfaz de desarrollo javafx:
1. Escribir código Java.
Toda la interfaz y la lógica se implementan mediante código Java, y hay muchas cosas escritas.

2. Escriba y realice a través de JavaFX Scene Builder + código Java.
JavaFX Scene Builder es una herramienta de diseño visual que permite la creación rápida de la interfaz de la aplicación mediante la función de arrastrar y soltar. Y el código se crea como un archivo de formato XML. La interfaz se desarrolla arrastrando y soltando con JavaFX Scene Builder, y la lógica es relativamente simple y rápida de implementar en Java.

El siguiente ejemplo está implementado por JavaFX Scene Builder + Java.


下载 Generador de escenas JavaFX

Descarga del sitio web oficial: sitio web oficial de JavaFX Scene Builder


Crear proyecto

Elija Java Fx para la nueva idea del proyecto.
(Nota: intente usar jdk8 y superior. A continuación, jdk8 no tiene su propio javafx, debe importar el paquete jar usted mismo, Baidu usted mismo)
Inserte la descripción de la imagen aquí
La estructura después de la finalización es la siguiente, la entrada del programa principal, sample.fxml es utilizado para arrastrar y soltar JavaFX Scene Builder Generar interfaz, Controller se utiliza para vincular la interfaz y los eventos de monitoreo de procesos:
Inserte la descripción de la imagen aquí

Seleccione sample.fxml, haga clic derecho en abrir en sceneBuilder, luego seleccione
Inserte la descripción de la imagen aquí
y luego seleccione el JavaFX Scene Builder instaladoInserte la descripción de la imagen aquí

diseño de interfaz

Seleccione los componentes correspondientes desde la esquina superior izquierda hasta el medio para el diseño.Como se muestra en la figura, seleccioné 7 componentes, y a la izquierda está la información de todos los componentes seleccionados. Seleccione cualquier componente en el medio y hay configuraciones específicas para el componente de la derecha, como la longitud, el ancho, el mensaje predeterminado del cuadro de entrada y el nombre del componente.
Inserte la descripción de la imagen aquí
Establezca el nombre del componente, que se usará en Java más adelante:
Inserte la descripción de la imagen aquí
Después de guardar, el contenido de sample.fxml se convierte en el siguiente:
agregue manualmente fx: controller = "sample.Controller" para asociar el archivo sample.fxml con el archivo Controller , así que escriba a continuación Solo el código Java puede usar las cosas en fxml.

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

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="399.0" prefWidth="627.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <Button fx:id="id_1" layoutX="103.0" layoutY="120.0" mnemonicParsing="false" onAction="#buttonAction1" prefHeight="30.0" prefWidth="119.0" text="获取日历" textFill="#3a6f2e" />
      <TextField fx:id="text_1" layoutX="102.0" layoutY="61.0" promptText="请输入年份,如:2021" />
      <TextField fx:id="text_2" layoutX="380.0" layoutY="61.0" promptText="请输入月份,如:2" />
      <Text layoutX="48.0" layoutY="82.0" strokeType="OUTSIDE" strokeWidth="0.0" text=" 年:" wrappingWidth="35.0" />
      <Text layoutX="332.0" layoutY="82.0" strokeType="OUTSIDE" strokeWidth="0.0" text=" 月:" wrappingWidth="35.0" />
      <TextArea fx:id="text_3" layoutX="167.0" layoutY="197.0" prefHeight="146.0" prefWidth="274.0" />
   </children>
</AnchorPane>

Código:

Controlador:

package sample;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable {
    
    
    @FXML
    private Button id_1;
    @FXML
    private TextField text_1;//从fxml获取组件text_1,用于读取年
    @FXML
    private TextField text_2;//从fxml获取组件text_2,用于读取月
    @FXML
    private TextArea text_3;//从fxml获取组件text_3,用于输出

    @Override
    public void initialize(URL location, ResourceBundle resources)
    {
    
    }

    //点击按钮时触发的事件
    public void buttonAction1(ActionEvent actionEvent)
    {
    
    
        String year = text_1.getText();//获取文本框输入的内容
        String month = text_2.getText();//获取文本框输入的内容
        String result=Service.calculationDate(year,month);
        text_3.setText(result);
    }
}

Servicio:

package sample;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class Service {
    
    
    public static String calculationDate(String y, String m) {
    
    
        char[] yearChar = y.toCharArray();
        char[] monthChar = m.toCharArray();
        if(null==y||y.length()==0||null==m||m.length()==0){
    
    
            return "年份或月份不能输入为空。";
        }

        for (int i = 0; i < yearChar.length; i++) {
    
    
            boolean isOrNo = Character.isDigit(yearChar[i]);
            if (yearChar[0] == '0' || !isOrNo) {
    
    
                return "年份输入错误,请输入正确的年份。";
            }
        }

        for (int i = 0; i < monthChar.length; i++) {
    
    
            boolean isOrNo = Character.isDigit(monthChar[i]);
            if (yearChar[0] == '0' || !isOrNo) {
    
    
                return "月份输入错误,请输入正确的月份。";
            }
        }

        int year = Integer.parseInt(y);
        int month = Integer.parseInt(m);

        if (year < 1900||(year==1900&&month==1)) {
    
    
            return "年份需要大于等于1900。当年份是1900时,月份需要大于1。";
        }

        if (month > 12) {
    
    
            return "月份输入错误,请输入正确的月份。";
        }

        LocalDate endDate = LocalDate.of(year, month, 1);//设置输入的日期
        LocalDate startDate = LocalDate.of(1900, 1, 1);
        long sumDay = startDate.until(endDate, ChronoUnit.DAYS);//总相差的天数:3657
        /*以上代码计算1900年1月1号到输入的年月的总天数,如输入2018和8,则计算1900.1.1-2018.7.31的天数*/

        long xingQi = (sumDay + 1) % 7; //xingQi用来计算输入的月份1号星期几
        long everydayXingQi = sumDay + 1;
        int monthDay = endDate.lengthOfMonth();//用来接收输入的月份有几天

        String result = "日\t一\t二\t三\t四\t五\t六\n";
        for (int i = 0; i < xingQi; i++) {
    
        //输出每月1号前的空格
            result += "\t";
        }
        for (int i = 1; i <= monthDay; i++) {
    
      //输出每个月的天数和控制换行
            if (everydayXingQi % 7 == 6) {
    
    
                result += i + "\n";
            } else {
    
    
                result += i + "\t";
            }
            everydayXingQi++;
        }
        return result;
    }
}

Principal:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Main extends Application {
    
    

    @Override
    public void start(Stage primaryStage) throws Exception{
    
    
        //引用sample.fxml页面布局
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        //设置窗口名称
        primaryStage.setTitle("日历");
        //设置窗口大小
        primaryStage.setScene(new Scene(root, 627, 399));
        //固定窗口大小使其无法最大化
        primaryStage.setResizable(false);
        //设置窗口的图标.
        primaryStage.getIcons().add(new Image("/sample/image/rili.jpg"));
        primaryStage.show();
    }

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

Inicie el proyecto y está bien.


Etiquetado en un paquete de frasco:
Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

Por supuesto, también puede escribir el programa escrito en un paquete jar o un programa exe y empaquetarlo de la siguiente manera:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Se generará un archivo exe en javaFxText.
Inserte la descripción de la imagen aquí
Después de abrir la carpeta, haga doble clic para ejecutarlo.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Pero este archivo exe es demasiado difícil de encontrar. Lo busqué durante mucho tiempo. Quería crear un acceso directo, pero el acceso directo solo admite rutas absolutas. Podemos volver al directorio superior y crear una nueva entrada de archivo txt:

iniciar JavaFxTest \ JavaFxTest.exe
salir

Inicio es seguido por su propio nombre de carpeta y nombre de exe.
Después de guardar el archivo, cambie el sufijo a bat

Puede usarlo después de hacer doble clic.
Inserte la descripción de la imagen aquí

En cuanto a otros métodos de empaquetado, todavía no lo he probado. Por ejemplo, primero escríbalo en un paquete jar y luego escríbalo en un archivo exe a través de otras herramientas.
Referencia: empaquetar java en exe- ejecutar el proyecto Java en una máquina sin jdk o jre
java tool (1): ejecutar el proyecto java en una computadora sin el entorno jdk para crear un archivo exe


Tutorial de Javafx: Tutorial de
Javafx Tutorial de
w3cschool-javafx Descripción
general y tutorial
de
JavaFX javafxchina Introducción a JavaFX (1): Mi primer programa
JavaFX usando JavaFX Scene Builder
Cómo crear un área de texto en el
paquete de proyecto JavaFX javafx y
usar exe4j para escribir archivos java en un archivo exe ejecutando tutorial detallado

Supongo que te gusta

Origin blog.csdn.net/qq_33697094/article/details/112237463
Recomendado
Clasificación