diff --git a/README.en.md b/README.en.md index 3409f70..510f198 100644 --- a/README.en.md +++ b/README.en.md @@ -70,8 +70,6 @@ The framework is not the framework for beautifying UI, but to simplify the step ### The Process of Developing -Our project has suspended update from Nov. 25, 2019, and the next release will be updated to 2.0. We try to provides more data binding operations and optimize performance. - - [x] Modularization - [x] Integration with Spring - [x] Signal Mechanism diff --git a/README.md b/README.md index a35f6b0..2d401c1 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,6 @@  ### 开发进程 -2019年11月25日起项目暂停更新,将会下次发布将会升级为2.0版本,到时候将会提供更多数据绑定操作,以及优化性能。 - - [x] 模块化 - [x] 与Spring的融合 - [x] 信号机制 @@ -1331,6 +1329,10 @@ public class Student { 4. 完善JavaFX-Plus生命周期 5. 新增日志log模块 6. 新增语言国际化操作 -7. 新增测试生命周期LifeDemo示例和测试国际化的LanguageDemo示例代码 +7. 新增测试生命周期LifeDemo示例和测试国际化的LangDemo示例代码 8. 规范化代码和更新README +## v1.3.0 TODO + +1. 开放动态修改窗口标题setWindowTitles、窗口图标setIcon、窗口可拖拽缩放setDragAndResize的接口 + diff --git a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java b/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java index 1c27413..2513808 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java @@ -4,13 +4,19 @@ import cn.edu.scau.biubiusuisui.annotation.FXController; import cn.edu.scau.biubiusuisui.annotation.FXWindow; import cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus; import cn.edu.scau.biubiusuisui.config.FXPlusApplication; +import cn.edu.scau.biubiusuisui.exception.ProtocolNotSupport; +import cn.edu.scau.biubiusuisui.function.DragWindowHandlerImpl; import cn.edu.scau.biubiusuisui.log.FXPlusLoggerFactory; import cn.edu.scau.biubiusuisui.log.IFXPlusLogger; +import cn.edu.scau.biubiusuisui.utils.FileUtil; import cn.edu.scau.biubiusuisui.utils.ResourceBundleUtil; import cn.edu.scau.biubiusuisui.utils.StringUtil; +import javafx.event.EventHandler; +import javafx.scene.image.Image; import javafx.scene.layout.Pane; import javafx.stage.Stage; +import java.io.File; import java.io.IOException; import java.lang.annotation.Annotation; import java.net.URL; @@ -19,7 +25,7 @@ import java.util.Map; import java.util.ResourceBundle; -/** +/* * In JavaFX-Plus Framework Controller * We use MVC model * V means view which stand for fxml @@ -36,7 +42,7 @@ import java.util.ResourceBundle; * @since JavaFX2.0 JDK1.8 */ public class FXBaseController extends Pane { - private static IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(FXBaseController.class); + private static final IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(FXBaseController.class); protected String name = ""; private Stage stage; @@ -45,7 +51,8 @@ public class FXBaseController extends Pane { /** - * @description 用于携带信息数据 + *
description 用于携带信息数据
+ * * @version 1.2 */ private Mapdescription: 开放设置窗口标题
+ * + * @param title 标题 + * @return true--修改标题成功 false--修改失败 + * @version 1.3 + */ + public final void setWindowTitle(String title) { + if (this.isWindow) { + this.stage.setTitle(title); + logger.info("setting title of window"); + } else { + logger.warn("the controller is not window"); + } + } + + /** + *description: 开放设置窗口图标
+ * + * @param icon String 图标URL地址,需要放在resources文件下或项目根目录下 + */ + public final void setIcon(String icon) { + if (this.isWindow) { + if (!"".equals(icon)) { + try { + URL iconUrl = new FileUtil().getFilePathFromResources(icon); + if (iconUrl != null) { + if (new File(StringUtil.getRootPath(iconUrl)).exists()) { + this.stage.getIcons().clear(); + this.stage.getIcons().add(new Image(icon)); + } else { + logger.warn("the icon file has not existed"); + } + } else { + logger.warn("the icon file has not existed"); + } + } catch (ProtocolNotSupport protocolNotSupport) { + logger.error(protocolNotSupport.getMessage(), protocolNotSupport); + } + } + } + } + + /** + *Description 开放是否允许窗口可拖拽和缩放的接口
+ * + * @param draggable 可拖拽 + * @param resizable 可缩放 + */ + public final void setDragAndResize(boolean draggable, boolean resizable) { + this.stage.setResizable(resizable); + if (draggable || resizable) { + EventHandler dragWindowHandler = new DragWindowHandlerImpl(stage, this, draggable, resizable); + this.setOnMousePressed(dragWindowHandler); + this.setOnMouseDragged(dragWindowHandler); + this.setOnMouseMoved(dragWindowHandler); + } + } + + /** + * 获取Controller名字 + * + * @return name + */ public String getName() { if ("".equals(name) || name == null) { // 原本无“name == null”判断条件,会出错 return StringUtil.getBaseClassName(getClass().getSimpleName()); @@ -224,11 +298,11 @@ public class FXBaseController extends Pane { } public boolean isWindow() { - return isWindow; + return this.isWindow; } public void setWindow(boolean window) { - isWindow = window; + this.isWindow = window; } public Stage getStage() { diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/ChineseController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/ChineseController.java index c1dd03e..02476ec 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/ChineseController.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/ChineseController.java @@ -17,6 +17,9 @@ import javafx.fxml.FXML; @FXWindow(mainStage = true, title = "languageDemo") @FXController(path = "fxml/langDemo/langDemo.fxml", locale = FXPlusLocale.SIMPLIFIED_CHINESE) public class ChineseController extends FXBaseController { + private String title = "languageDemo"; + private int count = 0; + @FXML public void clickToChinese() { redirect("ChineseController"); @@ -32,8 +35,18 @@ public class ChineseController extends FXBaseController { redirect("KoreanController"); } + /** + * 测试是否setWindowTitle接口 + */ + @FXML + public void changeTitleClick() { + this.setWindowTitle(this.title + count); + count++; + } + @FXRedirect public String redirect(String name) { return name; } + } diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/EnglishController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/EnglishController.java index 95ef72f..8d6386d 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/EnglishController.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/EnglishController.java @@ -16,6 +16,9 @@ import javafx.fxml.FXML; @FXWindow(mainStage = false, title = "languageDemo") @FXController(path = "fxml/langDemo/langDemo.fxml", locale = FXPlusLocale.ENGLISH) public class EnglishController extends FXBaseController { + private String title = "languageDemo"; + private int count = 0; + @FXML public void clickToChinese() { redirect("ChineseController"); @@ -31,6 +34,15 @@ public class EnglishController extends FXBaseController { redirect("KoreanController"); } + /** + * 测试是否setWindowTitle接口 + */ + @FXML + public void changeTitleClick() { + this.setWindowTitle(this.title + count); + count++; + } + @FXRedirect public String redirect(String name) { return name; diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/KoreanController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/KoreanController.java index 373f08b..0d7d256 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/KoreanController.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/KoreanController.java @@ -16,6 +16,9 @@ import javafx.fxml.FXML; @FXWindow(mainStage = false, title = "languageDemo") @FXController(path = "fxml/langDemo/langDemo.fxml", locale = FXPlusLocale.KOREAN) public class KoreanController extends FXBaseController { + private String title = "languageDemo"; + private int count = 0; + @FXML public void clickToChinese() { redirect("ChineseController"); @@ -31,6 +34,16 @@ public class KoreanController extends FXBaseController { redirect("KoreanController"); } + + /** + * 测试是否setWindowTitle接口 + */ + @FXML + public void changeTitleClick() { + this.setWindowTitle(this.title + count); + count++; + } + @FXRedirect public String redirect(String name) { return name; diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/LanguageDemo.java b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/LanguageDemo.java index d610437..53217b9 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/LanguageDemo.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/langDemo/LanguageDemo.java @@ -17,4 +17,5 @@ public class LanguageDemo extends Application { public void start(Stage primaryStage) throws Exception { FXPlusApplication.start(getClass()); } + } diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/lifeDemo/MainController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/lifeDemo/MainController.java index 18d4f83..802aeca 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/example/lifeDemo/MainController.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/lifeDemo/MainController.java @@ -8,7 +8,6 @@ import cn.edu.scau.biubiusuisui.entity.FXPlusLocale; import cn.edu.scau.biubiusuisui.log.FXPlusLoggerFactory; import cn.edu.scau.biubiusuisui.log.IFXPlusLogger; import javafx.fxml.FXML; -import javafx.scene.input.Clipboard; /** * @author suisui diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/windowDemo/DemoController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/windowDemo/DemoController.java new file mode 100644 index 0000000..9a0c083 --- /dev/null +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/windowDemo/DemoController.java @@ -0,0 +1,53 @@ +package cn.edu.scau.biubiusuisui.example.windowDemo; + +import cn.edu.scau.biubiusuisui.annotation.FXController; +import cn.edu.scau.biubiusuisui.annotation.FXWindow; +import cn.edu.scau.biubiusuisui.entity.FXBaseController; +import javafx.fxml.FXML; +import javafx.scene.control.ToggleButton; +import javafx.stage.StageStyle; + +/** + * @author suisui + * @description 测试Controller + * @date 2020/8/29 09:41 + * @since JDK1.8 + */ +@FXWindow(mainStage = true, title = "windowDemo", icon = "image/icon.png", style = StageStyle.UNDECORATED) +@FXController(path = "fxml/windowDemo/windowDemo.fxml") +public class DemoController extends FXBaseController { + private String title = "windowDemo -- "; + private int count = 0; + private String iconStr = "image/icon2.png"; + private String iconStr2 = "image/icon3.png"; + + + @FXML + private ToggleButton canResizableTB; + + @Override + public void initialize() throws Exception { + canResizableTB.selectedProperty().addListener(e -> { + this.setDragAndResize(true, canResizableTB.isSelected()); + }); + } + + /** + * 修改标题点击事件 + */ + @FXML + public void changeTitleClick() { + this.setWindowTitle(title + count); + count++; + } + + /** + * 字符串修改图标 + */ + @FXML + public void changeIconClick() { + this.setIcon(count % 2 == 0 ? iconStr : iconStr2); + count++; + } + +} diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/windowDemo/FXWindowDemo.java b/src/main/java/cn/edu/scau/biubiusuisui/example/windowDemo/FXWindowDemo.java new file mode 100644 index 0000000..8ca0400 --- /dev/null +++ b/src/main/java/cn/edu/scau/biubiusuisui/example/windowDemo/FXWindowDemo.java @@ -0,0 +1,20 @@ +package cn.edu.scau.biubiusuisui.example.windowDemo; + +import cn.edu.scau.biubiusuisui.annotation.FXScan; +import cn.edu.scau.biubiusuisui.config.FXPlusApplication; +import javafx.application.Application; +import javafx.stage.Stage; + +/** + * @author suisui + * @description 测试开放设置部分FXWindow属性的接口 + * @date 2020/8/29 09:40 + * @since JDK1.8 + */ +@FXScan(base = "cn.edu.scau.biubiusuisui.example.windowDemo") +public class FXWindowDemo extends Application { + @Override + public void start(Stage primaryStage) throws Exception { + FXPlusApplication.start(FXWindowDemo.class); + } +} diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXControllerFactory.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXControllerFactory.java index 487389d..6eae35e 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXControllerFactory.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXControllerFactory.java @@ -13,7 +13,7 @@ import cn.edu.scau.biubiusuisui.expression.data.ExpressionParser; import cn.edu.scau.biubiusuisui.function.FXWindowParser; import cn.edu.scau.biubiusuisui.log.FXPlusLoggerFactory; import cn.edu.scau.biubiusuisui.log.IFXPlusLogger; -import cn.edu.scau.biubiusuisui.messageQueue.MessageQueue; +import cn.edu.scau.biubiusuisui.mq.MessageQueue; import cn.edu.scau.biubiusuisui.proxy.FXControllerProxy; import cn.edu.scau.biubiusuisui.stage.StageManager; import cn.edu.scau.biubiusuisui.utils.ResourceBundleUtil; @@ -168,7 +168,7 @@ public class FXControllerFactory { * @Description 为有FXWindow注解的类创建Stage */ private static Stage createWindow(FXWindow fxWindow, Class clazz, FXBaseController fxBaseControllerProxy) { - logger.info("creating window"); + logger.info("creating window....."); Stage stage = new Stage(); fxBaseControllerProxy.setStage(stage); double preWidth = fxWindow.preWidth() == 0 ? fxBaseControllerProxy.getPrefWidth() : fxWindow.preWidth(); diff --git a/src/main/java/cn/edu/scau/biubiusuisui/function/Draggale.java b/src/main/java/cn/edu/scau/biubiusuisui/function/Draggable.java similarity index 82% rename from src/main/java/cn/edu/scau/biubiusuisui/function/Draggale.java rename to src/main/java/cn/edu/scau/biubiusuisui/function/Draggable.java index 4a3d808..a7495e0 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/function/Draggale.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/function/Draggable.java @@ -6,6 +6,6 @@ package cn.edu.scau.biubiusuisui.function; * @date 2019/7/27 1:54 * @since JavaFX2.0 JDK1.8 */ -public interface Draggale { +public interface Draggable { } diff --git a/src/main/java/cn/edu/scau/biubiusuisui/function/FXWindowParser.java b/src/main/java/cn/edu/scau/biubiusuisui/function/FXWindowParser.java index 11caa64..c16cb98 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/function/FXWindowParser.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/function/FXWindowParser.java @@ -22,44 +22,28 @@ import java.net.URL; * @since JavaFX2.0 JDK1.8 */ public class FXWindowParser { - private static IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(FXWindowParser.class); + private static final IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(FXWindowParser.class); public void parse(Stage stage, FXBaseController fxControllerProxy, FXWindow fxWindow) { logger.info("parsing @FXWindow of class: " + fxControllerProxy.getName()); + // 处理 title - stage.setTitle(fxWindow.title()); + fxControllerProxy.setWindowTitle(fxWindow.title()); // 处理 icon - if (!"".equals(fxWindow.icon())) { - try { - URL iconUrl = new FileUtil().getFilePathFromResources(fxWindow.icon()); - if (iconUrl != null) { - if (new File(StringUtil.getRootPath(iconUrl)).exists()) { - stage.getIcons().add(new Image(fxWindow.icon())); - } else { - logger.warn("the icon file has not existed"); - } - } else { - logger.warn("the icon file has not existed"); - } - } catch (ProtocolNotSupport protocolNotSupport) { - logger.error(protocolNotSupport.getMessage(), protocolNotSupport); - protocolNotSupport.printStackTrace(); - } + fxControllerProxy.setIcon(fxWindow.icon()); + + // 处理draggable和resizable + if (fxWindow.draggable() || fxWindow.resizable()) { + fxControllerProxy.setDragAndResize(fxWindow.draggable(), fxWindow.resizable()); } // fxWindow的resizable默认为false if (fxWindow.resizable()) { - stage.setResizable(true); + fxControllerProxy.setDragAndResize(fxWindow.draggable(), true); } - // 处理draggable和resizable - if (fxWindow.draggable() || fxWindow.resizable()) { - EventHandler dragWindowHandler = new DragWindowHandlerImpl(stage, fxWindow.minWidth(), fxWindow.minHeight(), fxControllerProxy, fxWindow.draggable(), fxWindow.resizable()); - fxControllerProxy.setOnMousePressed(dragWindowHandler); - fxControllerProxy.setOnMouseDragged(dragWindowHandler); - fxControllerProxy.setOnMouseMoved(dragWindowHandler); - } + // 处理style stage.initStyle(fxWindow.style()); } diff --git a/src/main/java/cn/edu/scau/biubiusuisui/messageQueue/MessageQueue.java b/src/main/java/cn/edu/scau/biubiusuisui/mq/MessageQueue.java similarity index 74% rename from src/main/java/cn/edu/scau/biubiusuisui/messageQueue/MessageQueue.java rename to src/main/java/cn/edu/scau/biubiusuisui/mq/MessageQueue.java index dd338be..173cb8e 100644 --- a/src/main/java/cn/edu/scau/biubiusuisui/messageQueue/MessageQueue.java +++ b/src/main/java/cn/edu/scau/biubiusuisui/mq/MessageQueue.java @@ -1,4 +1,4 @@ -package cn.edu.scau.biubiusuisui.messageQueue; +package cn.edu.scau.biubiusuisui.mq; import cn.edu.scau.biubiusuisui.annotation.FXReceiver; import cn.edu.scau.biubiusuisui.entity.FXBaseController; @@ -20,9 +20,8 @@ import java.util.concurrent.ConcurrentHashMap; * @date 2019/6/25 12:24 * @since JavaFX2.0 JDK1.8 */ - public class MessageQueue { - private IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(MessageQueue.class); + private static final IFXPlusLogger logger = FXPlusLoggerFactory.getLogger(MessageQueue.class); private static Map