1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Biubiuyuyu-JavaFX-Plus

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 28 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 23:59 24587e4

JavaFX-Plus

Другие языки: English

Содержание

Введение

  • [Процесс разработки](#Процесс разработки)
    • Maven репозиторий

    • Git адрес

    • Конкретное применение

    • Функциональное описание фреймворка

      • Модульная разработка

        • Описание
        • Создание модуля
        • Импорт только что созданных элементов управления в SceneBuilder
      • Интеграция с Spring

      • Логирование

        • Введение
        • Использование
        • Вывод результатов
      • Жизненный цикл

        • Объяснение
        • Жизненные циклы нескольких контроллеров
        • Пример
      • Сигнальный механизм

      • Преобразование JavaBean и JavaFXBean

      • Функция «вытащить и вставить»

      • Привязка данных

        • Связывание Bean и View
        • Связывание View и View
        • Функциональное выражение связывания
      • Многооконный переключатель

      • Введение

        • Аннотации, связанные с этим
      • Определение

        • Метод использования
        • Демонстрация примера
      • Интернационализация и локализация

        • Модуль введения
        • Способ использования
        • Демонстрационный пример
      • Использование фреймворка

    • Шаблоны кода

      • JavaFXPlusApplication
      • JavaFXPlusWindow
      • JavaFXPlusController
      • JavaFXPlusFXML
    • Встроенные аннотации

    • Два фабричных метода и один контекст

    • Создание первой программы

    • Список обновлений

Введение

Этот фреймворк не является фреймворком для улучшения пользовательского интерфейса (UI). Он был разработан для упрощения процесса разработки проектов JavaFX и уменьшения зависимости между компонентами проекта. На данный момент основные функции фреймворка включают:

JavaFx-Plus

Процесс разработки

  • Модульность
  • Интеграция со Spring
  • Сигнальные механизмы
  • Преобразование JavaBeans и JavaFXBeans
  • Функция «Вытащить и вставить» (например, перетаскивание окон)
  • Привязка данных
    • Связывание Beans и Views
    • Связывание Views и Views
    • Функциональное связывание выражений
  • Переключение между несколькими окнами
  • Введение
    • Связанные аннотации
  • Определение
    • Метод использования
    • Демонстрация примеров

Maven репозиторий

<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>

Git адрес

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 Отображение результатов

Импорт недавно созданных элементов управления в SceneBuilder

Входное изображение

Рисунок 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**
  1. 打印日志的两种方式

    — Через 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);
}
}

Динамическая демонстрация

Как показано на рисунке:

20191210-175409-actionDemo

Многооконная функция переключения

Введение в функцию

В 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, см. следующий пример использования.

Способ использования

  1. Использование аннотаций @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() для добавления данных параметров.

  2. Создайте программу начального интерфейса 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 {
    
}

JavaFXPlusController

Генерация класса 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, и конечный результат будет выглядеть следующим образом:

введите сюда описание изображения

Обновление списка

v1.0.0

  • Модульное развитие
  • Интеграция со Spring
  • Механизм сигналов
  • Преобразование JavaBean в JavaFXBean
  • Функция «вытащить и вставить»
  • Привязка данных

v1.1.0

  • Добавлена функция переключения между несколькими окнами

v1.2.0

  • Разработан модуль кода файлов, после импорта в IDE можно быстро генерировать файлы FXPlusController, FXPlusWindow, FXPlusApplication и FXPlusFXML, соответствующие стандартам программирования JavaFX-Plus
  • Улучшена функция переключения между несколькими окнами, которая может переносить данные при переключении, см.: [Функция переключения между несколькими окнами](#функция переключения между несколькими окнами)
  • Добавлено свойство icon в аннотации @FXWindow, передавая URL-адрес значка в виде строки, можно добавить значок в строку заголовка окна
  • Доработана концепция жизненного цикла JavaFX-Plus
  • Добавлен модуль журнала log
  • Добавлены операции интернационализации
  • Добавлены примеры кода LifeDemo для демонстрации жизненного цикла тестирования и LangDemo для тестирования интернационализации
  • Стандартизация кода и обновление README

v1.3.0

  • Открыты интерфейсы для динамического изменения заголовка окна setWindowTitle, значка окна setIcon и возможности перетаскивания и изменения размера окна setDragAndResize
  • Асинхронизация отправки и получения сигналов в механизме сигналов
  • Поддержка настройки нескольких имён в FXSender и FXReceiver, то есть одна функция может отправлять или получать несколько сигналов

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Biubiuyuyu-JavaFX-Plus.git
git@api.gitlife.ru:oschina-mirror/Biubiuyuyu-JavaFX-Plus.git
oschina-mirror
Biubiuyuyu-JavaFX-Plus
Biubiuyuyu-JavaFX-Plus
1.3.0