Другие языки: English
Maven репозиторий
Git адрес
Конкретное применение
Функциональное описание фреймворка
Модульная разработка
Интеграция с Spring
Логирование
Жизненный цикл
Сигнальный механизм
Преобразование JavaBean и JavaFXBean
Функция «вытащить и вставить»
Привязка данных
Многооконный переключатель
Введение
Определение
Интернационализация и локализация
Использование фреймворка
Шаблоны кода
Встроенные аннотации
Два фабричных метода и один контекст
Создание первой программы
Список обновлений
Этот фреймворк не является фреймворком для улучшения пользовательского интерфейса (UI). Он был разработан для упрощения процесса разработки проектов JavaFX и уменьшения зависимости между компонентами проекта. На данный момент основные функции фреймворка включают:
<dependency>
<groupId>com.gitee.Biubiuyuyu</groupId>
<artifactId>javafx-plus</artifactId>
<version>1.3.0-SNAPSHOT</version>
</dependency>
Версия Snapshot не синхронизируется с центральным репозиторием Maven. Если вам нужно получить версию Snapshot, добавьте адрес репозитория в файл конфигурации settings.xml Maven:
<repository>
<id>central-release</id>
<url>https://s01.oss.sonatype.org/content/groups/public/</url>
</repository>
<repository>
<id>central-snapshot</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
Github https://github.com/BillKiller/JavaFX-Plus.git
Gitee https://gitee.com/Biubiuyuyu/JavaFX-Plus.git
См. загрузчик
В процессе разработки на Java многие интерфейсы похожи или повторяются. Если можно объединить эти интерфейсы в настраиваемые элементы управления, а затем создать элемент управления, просто перетащив его в SceneBuilder, это значительно повысит эффективность разработки. Поэтому мы предлагаем разделить различные области на отдельные модули, чтобы уменьшить зависимость и ускорить параллельную разработку. Обычно мы часто разделяем интерфейс на верхнюю панель инструментов, левую навигационную панель, правую область содержимого. Если все содержимое записано в одном контроллере, оно станет очень громоздким. Мы надеемся разделить разные области и лечить их отдельно.
Просто создайте класс, который наследуется от FXBaseController, и FXBaseController наследуется от Pane. Это основная идея дизайна JavaFX-Plus — всё является панелью. Пометьте класс аннотацией FXController и укажите адрес файла FXML. Если установлено значение FXWindow, контроллер будет отображаться как отдельное окно. Здесь всего несколько строк кода, которые реализуют простую программу окна.
Рисунок 2 Конфигурация контроллера
Рисунок 3 Отображение результатов
Рисунок 4 Операция модульности
...
(Здесь представлен перевод части текста. Перевод оставшейся части текста при необходимости можно запросить отдельно.) log4j.appender.stdout=org.apache.log4j.ConsoleAppender
**log4j.appender.stdout.Target=System.out**
**log4j.appender.stdout.layout=org.apache.log4j.PatternLayout**
**log4j.appender.stdout.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] - %m%n**
### 输出DEBUG 级别以上的日志到 E://logs/error.log ###
**log4j.appender.D=org.apache.log4j.DailyRollingFileAppender**
### Windowsy
# **log4j.appender.D.File = E://logs/debug/log.log**
# MacOS
**log4j.appender.D.File=${log.base}/logs/debug/javafxplus.log**
**log4j.appender.D.Append=true**
**log4j.appender.D.Threshold=DEBUG**
**log4j.appender.D.layout=org.apache.log4j.PatternLayout**
**log4j.appender.D.layout.ConversionPattern=[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l] - %m%n**
### 输出ERROR 级别以上的日志到 E://logs/error.log ###
**log4j.appender.E=org.apache.log4j.DailyRollingFileAppender**
### Windows
# **log4j.appender.E.File = E://logs/error/log.log**
# MacOS
**log4j.appender.E.File=${log.base}/logs/error/javafxplus.log**
**log4j.appender.E.Append=true**
**log4j.appender.E.Threshold=ERROR**
**log4j.appender.E.layout=org.apache.log4j.PatternLayout**
**log4j.appender.E.layout.ConversionPattern=[%p] %-d{yyyy-MM-dd HH:mm:ss} [%t] [%l] - %m%n**
打印日志的两种方式
— Через FXPlusLoggerFactory.getLogger() метод передаётся текущий класс Class, получается IFXPlusLogger, и через его методы info, debug, error и т. д. можно печатать журналы, как в testLogger().
— С помощью статических методов LogUtil info, debug, error печатаются журналы, как в testLogUtil().
public class LogDemo {
private static IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(LogDemo.class);
public void testLogger() {
logger.info("info");
logger.error("error");
logger.debug("debug");
logger.warn("warn");
}
public void testLogUtil() {
LogUtil.info("info");
LogUtil.error("error");
LogUtil.debug("debug");
LogUtil.warn("warn");
}
public static void main(String[] args) {
LogDemo demo = new LogDemo();
demo.testLogger();
demo.testLogUtil();
}
}
Вывод
Два способа печати журналов отличаются, два журнала останавливаются в разных классах, но оба могут точно определить строку, где был записан журнал.
[INFO ] 2020-05-03 01:22:40,165 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogger(LogDemo.java:18)] - info
[ERROR] 2020-05-03 01:22:40,169 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogger(LogDemo.java:19)] - error
[DEBUG] 2020-05-03 01:22:40,169 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogger(LogDemo.java:20)] - debug
[WARN ] 2020-05-03 01:22:40,169 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogger(LogDemo.java:21)] - warn
[INFO ] 2020-05-03 01:22:40,170 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogUtil(LogDemo.java:25)] - info
[ERROR] 2020-05-03 01:22:40,170 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogUtil(LogDemo.java:26)] - error
[DEBUG] 2020-05-03 01:22:40,173 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogUtil(LogDemo.java:27)] - debug
[WARN ] 2020-05-03 01:22:40,173 [main] [cn.edu.scau.biubiusuisui.example.logDemo.LogDemo.testLogUtil(LogDemo.java:28)] - warn
JavaFX-приложение имеет жизненный цикл, JavaFX-Plus ссылается на жизненный цикл WeChat Mini Program и Vue, на основе жизненного цикла Native JavaFX, он абстрагирует серию действий по инициализации от запуска JavaFXApplication до JavaFXController, чтобы предоставить разработчикам несколько функций с пустой реализацией, например, если во время процесса разработки необходимо выполнить соответствующие операции перед страницей, такие как загрузка данных, вы можете переписать функцию onShow для выполнения соответствующих операций в теле функции. Пример теста жизненного цикла: cn.edu.scau.biubiusuisui.example.lifeDemo
Объяснение
Ниже приводится объяснение жизненного цикла JavaFX-Plus:
launch(): запускает независимое JavaFX Application, это статическая функция, которая не может быть переписана.
init(): метод, который завершает инициализацию JavaFXApplication после загрузки и создания класса приложения (launch()), он немедленно вызывается. Приложение может переписать этот метод, чтобы выполнить инициализацию перед фактическим запуском приложения. Этот метод является потоком JavaFXLauncher, а не UI-потоком, поэтому вы не можете выполнять операции UI в этом методе.
start(): основной вход всех JavaFX Applications. После завершения выполнения метода init() будет вызван метод start(), который является потоком приложения JavaFX, и в нём можно выполнять операции пользовательского интерфейса.
stop(): Данный фрагмент написан на языке Java.
double money = Double.valueOf(value);
double percent = 0.1454;
return String.valueOf(money * percent);
}
public String toJp(String value) {
double money = Double.valueOf(value);
double percent = 15.797;
return String.valueOf(money * percent);
}
public String toUk(String value) {
double money = Double.valueOf(value);
double percent = 0.1174;
return String.valueOf(money * percent);
}
}
Динамическая демонстрация
Как показано на рисунке:
В JavaFX часто требуется переключаться между несколькими окнами, например, окно входа в систему, после нажатия кнопки входа вы переходите к окну успешного или неудачного входа. В некоторых онлайн-руководствах по переключению нескольких окон в JavaFX процесс реализации заключается в следующем: в Controller реализуется привязка FXML и вызывается внешний метод show для переключения окон. Поскольку эта структура уже инкапсулировала функцию привязки FXML, реализация метода непосредственной инициализации Stage и установки параметров в Controller не является реалистичной. Поэтому в этой структуре мы пишем класс StageController для управления Controller.
@FXController
: используется для маркировки класса, используется для привязки файла FXML. Обратите внимание, что класс, помеченный как FXController
, может быть только компонентом.
@FXWindow
: используется для маркировки класса и указывает, что этот Controller должен отображаться в окне. Он будет перенаправлен только тогда, когда он должен отображаться отдельно в окне.
@FXRedirect
: используется для маркировки функции и указывает, что эта функция используется для обработки перенаправления.
Когда необходимо использовать функцию @FXRedirect
для обработки перенаправления, функция должна возвращать тип String
или FXRedirectParam
. Оба типа должны предоставлять зарегистрированное имя Controller, например, если вам нужно перенаправить на страницу успешного входа, Controller — это SuccessController
, тогда вам нужно написать return "SuccessController"
. В этом случае данные не передаются. Если вам нужно передать данные, вы можете использовать способ возврата URL или вернуть FXRedirectParam
, см. следующий пример использования.
Использование аннотаций @FXRedirect
:
@FXRedirect
public String redirectToRegister() {
return "RegisterController";
}
@FXML
@FXRedirect(close = false) //测试弹窗
public String redirectToDialog() {
return "DialogController";
}
@FXML
@FXRedirect //登录成功 Query方式
public String redirectToSuccessWithQuery() {
return "SuccessController?username=" + usernameTF.getText();
}
@FXML
@FXRedirect //登录成功 Param方式
public FXRedirectParam redirectToSuccessWithParam() {
FXRedirectParam params = new FXRedirectParam("SuccessController"); //需要跳转至Controller的名称
params.addParam("username", usernameTF.getText());
return params;
}
@FXML
@FXRedirect //登录成功 两种方式混合
public FXRedirectParam redirectToSuccessWithAll() {
FXRedirectParam params = new FXRedirectParam("SuccessController"); //需要跳转至Controller's name
params.addParam("username", usernameTF.getText());
params.addQuery("token", new Date().toString());
return params;
}
close указывает, следует ли закрыть текущее окно, по умолчанию — true, то есть по умолчанию текущее окно закрывается при переходе к другому окну.
Если вам нужно перенести данные в другое окно, вы можете выбрать способ возврата строки URL, например: return "SuccessController?name=JavaFX&password=Plus"
или возврат класса FXRedirectParam
в JavaFX-Plus, в зависимости от способа передачи данных, выберите addParam() или addQuery() для добавления данных параметров.
Создайте программу начального интерфейса Controller, здесь в качестве примера используется интерфейс входа:
Сначала мы разрабатываем интерфейс данных между LoginController и SuccessController следующим образом:
username: 用户名
password: 密码
token: 令牌 //设计用于两种方式传递数据
Исходный код выглядит следующим образом:
@FXController(path = "fxml/redirectDemo/login.fxml")
@FXWindow(title = "fxml/redirectDemo", mainStage = true)
public class LoginController extends FXBaseController {
@FXML
private TextField usernameTF;
@FXML
private PasswordField passwordPF;
@FXML
public void registerClick() { //点击“注册”
redirectToRegister();
}
@FXRedirect
public String redirectToRegister() { //重定向至注册界面
return "RegisterController";
}
@FXML
@FXRedirect(close = false) //弹窗
public String redirectToDialog() {
return "DialogController";
}
@FXML
@FXRedirect //登录成功 Query方式
public String redirectToSuccessWithQuery() {
return "SuccessController?username=" + usernameTF.getText() + "&password=" + passwordPF.getText();
}
@FXML
@FXRedirect //登录成功 Param方式
public FXRedirectParam redirectToSuccessWithParam() {
FXRedirectParam params = new FXRedirectParam("SuccessController");
params.addParam("username", usernameTF.getText());
params.addParam("password", passwordPF.getText());
return params;
}
@FXML
@FXRedirect
public FXRedirectParam redirectToSuccessWithAll() {
FXRedirectParam params = new
${NAME} extends FXBaseController {
}
Генерация класса Controller в программе JavaFX-Plus, который может быть представлен в виде окна или обычного элемента управления. Расширение имени файла — java.
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "") package ${PACKAGE_NAME};#end
import cn.edu.scau.biubiusuisui.annotation.FXController;
import cn.edu.scau.biubiusuisui.entity.FXBaseController;
#parse("File Header.java")
@FXController(path = "")
public class ${NAME} extends FXBaseController {
}
Перевод:
$NAME$ расширяет FXBaseController {
}
JavaFXPlusController
Генерирует класс Controller в программе JavaFX Plus, который можно отобразить в виде окна или стандартного элемента управления. Имя файла имеет расширение java.
#если (${PACKAGE_NAME} и ${PACKAGE_NAME} не равно "") пакет ${PACKAGE_NAME}; #конец
импорт cn.edu.scau.biubiusuisui.аннотация.FXController;
импорт cn.edu.scau.biubiusuisui.сущность.FXBaseController;
#разбор ("File Header.java")
@FXController (путь = "")
общественный класс $NAME$ расширяет FXBaseController{
}
``` **Создание первого приложения**
1. Главный класс программы.
public class Demo extends Application { @Override public void start(Stage primaryStage) throws Exception { FXPlusApplication.start(Demo.class); //其他配置和JavaFX аналогичны, здесь необходимо вызвать метод start класса FXPlusAppcalition для запуска JavaFX-plus } }
2. Далее мы создаём FXML и Controller.
@FXController(path = "fxml/Main.fxml") @FXWindow(title = "demo1") public class MainController extends FXBaseController{ @FXML private ResourceBundle resources; @FXML private URL location; @FXML private Button addBtn; @FXML private Button delBtn; @FXML private ListView list;
Student student;
@FXML
void addWord(ActionEvent event) {
student.addList("hello" );
}
@FXML
void delWord(ActionEvent event) {
student.delList("hello");
}
@Override
public void initialize() {
student = (Student) FXEntityFactory.wrapFxBean(Student.class); // Из фабрики получаем преобразованный из JavaBean в JavaFXBean объект Student
Property listProperty = FXPlusContext.getEntityPropertyByName(student, "list");
list.itemsProperty().bind(listProperty);
}
}
Определение класса Student:
@FXEntity public class Student {
@FXField //отмечает, будет ли создано соответствующее свойство
private String name;
@FXField
private List<String> list = new ArrayList<>();
public void addList(String word){
list.add(word);
}
public void delList(String word){
list.remove(word);
}
}
Обратите внимание, что корневой тег файла FXML должен быть `<fx:root>`.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.Pane?>
<fx:root prefHeight="400.0" prefWidth="600.0" type="Pane" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cn.edu.scau.biubiusuisui.example.MainController">
<children>
<Button fx:id="addBtn" layoutX="432.0" layoutY="83.0" mnemonicParsing="false" onAction="#addWord" text="add" />
<Button fx:id="delBtn" layoutX="432.0" layoutY="151.0" mnemonicParsing="false" onAction="#delWord" text="del" />
<ListView fx:id="list" layoutX="42.0" layoutY="51.0" prefHeight="275.0" prefWidth="334.0" />
</children>
</fx:root>
Из нашего кода видно, что мы редко выполняем операции с пользовательским интерфейсом, и все объекты, с которыми мы работаем, являются объектами базовых типов. Такая операция очень полезна для преобразования обычного проекта в проект JavaFX, и конечный результат будет выглядеть следующим образом:
Обновление списка
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )