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:
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)
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:
Seleccione sample.fxml, haga clic derecho en abrir en sceneBuilder, luego seleccione
y luego seleccione el JavaFX Scene Builder instalado
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.
Establezca el nombre del componente, que se usará en Java más adelante:
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:
Por supuesto, también puede escribir el programa escrito en un paquete jar o un programa exe y empaquetarlo de la siguiente manera:
Se generará un archivo exe en javaFxText.
Después de abrir la carpeta, haga doble clic para ejecutarlo.
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.
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