diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml
new file mode 100644
index 0000000..eab40b3
--- /dev/null
+++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__log4j_log4j_1_2_17.xml b/.idea/libraries/Maven__log4j_log4j_1_2_17.xml
new file mode 100644
index 0000000..e383c1b
--- /dev/null
+++ b/.idea/libraries/Maven__log4j_log4j_1_2_17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml
new file mode 100644
index 0000000..09c4cf0
--- /dev/null
+++ b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml
new file mode 100644
index 0000000..e06e71e
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_aop_4_3_13_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml
new file mode 100644
index 0000000..0a8cafe
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_beans_4_3_13_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml
new file mode 100644
index 0000000..8050852
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_context_4_3_13_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml
new file mode 100644
index 0000000..b95dd78
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_core_4_3_13_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml
new file mode 100644
index 0000000..7a825ff
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_expression_4_3_13_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index d621d46..62c3d01 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -6,7 +6,43 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -34,47 +70,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -83,10 +123,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
@@ -95,48 +167,24 @@
-
+
-
-
+
+
+
+
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -146,12 +194,12 @@
@@ -171,6 +219,16 @@
Property
Simple
builder
+ Builder
+ BeanA
+ get
+ monitor
+ Expressi
+ com.sun.javafx.fxml.expression.
+ BeanAdapter
+ ExpressionValue
+ Expression
+ init
config.FXMLoaer
@@ -180,42 +238,22 @@
Wrapper
ReadOnly
Pane
+ FXBeanAdapter
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -230,17 +268,43 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -288,8 +352,6 @@
-
-
@@ -297,6 +359,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -353,6 +433,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -377,6 +518,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -386,40 +571,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -433,6 +584,8 @@
+
+
@@ -446,7 +599,7 @@
-
+
@@ -458,14 +611,15 @@
-
-
-
+
+
+
+
@@ -484,13 +638,13 @@
-
-
+
+
-
+
@@ -498,12 +652,12 @@
-
-
+
+
-
+
@@ -561,11 +715,11 @@
+
-
@@ -603,6 +757,14 @@
+
+
+
+
+
+
+
+
1561745555309
@@ -632,7 +794,14 @@
1562209287880
-
+
+ 1562209745536
+
+
+
+ 1562209745536
+
+
@@ -668,7 +837,7 @@
-
+
@@ -681,27 +850,29 @@
+
-
+
+
-
-
+
+
-
+
-
-
+
+
@@ -793,233 +964,56 @@
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/cn/edu/scau/biubiusuisui/config/FXMLLoaderPlus.java
+ 2572
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/cn/edu/scau/biubiusuisui/config/FXMLLoaderPlus.java
+ 2571
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/cn/edu/scau/biubiusuisui/proxy/classProxy/FXEntityProxy.java
+ 16
+
+
+
+
+ file://$PROJECT_DIR$/src/main/java/cn/edu/scau/biubiusuisui/entity/FXPlusContext.java
+ 27
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fields
+ JAVA
+ EXPRESSION
+
+
+ fileds
+ JAVA
+ EXPRESSION
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1030,53 +1024,394 @@
-
-
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1118,6 +1453,7 @@
+ 1.8
diff --git a/JavaFx-Plus.iml b/JavaFx-Plus.iml
index 0234078..205baac 100644
--- a/JavaFx-Plus.iml
+++ b/JavaFx-Plus.iml
@@ -1,5 +1,10 @@
+
+
+
+
+
@@ -15,5 +20,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/out/artifacts/JavaFx_Plus_jar/JavaFx-Plus.jar b/out/artifacts/JavaFx_Plus_jar/JavaFx-Plus.jar
index ed9e3cf..1cc151c 100644
Binary files a/out/artifacts/JavaFx_Plus_jar/JavaFx-Plus.jar and b/out/artifacts/JavaFx_Plus_jar/JavaFx-Plus.jar differ
diff --git a/pom.xml b/pom.xml
index 17d629e..fbd09e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,6 +23,29 @@
test
+
+ org.javassist
+ javassist
+ 3.21.0-GA
+
+
+
+ org.springframework
+ spring-core
+ 4.3.13.RELEASE
+
+
+ org.springframework
+ spring-context
+ 4.3.13.RELEASE
+
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXBind.java b/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXBind.java
new file mode 100644
index 0000000..7b6cf74
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXBind.java
@@ -0,0 +1,14 @@
+package cn.edu.scau.biubiusuisui.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @Author jack
+ * @Date:2019/7/4 13:58
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+@Inherited
+public @interface FXBind {
+ String [] bind();
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/config/FXMLLoaderPlus.java b/src/main/java/cn/edu/scau/biubiusuisui/config/FXMLLoaderPlus.java
index 798bec3..4d53711 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/config/FXMLLoaderPlus.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/config/FXMLLoaderPlus.java
@@ -1,5 +1,7 @@
package cn.edu.scau.biubiusuisui.config;
+import cn.edu.scau.biubiusuisui.entity.FXBaseController;
+import cn.edu.scau.biubiusuisui.factory.FXFactory;
import javafx.fxml.*;
/*
@@ -109,6 +111,16 @@ public class FXMLLoaderPlus {
private static final RuntimePermission GET_CLASSLOADER_PERMISSION =
new RuntimePermission("getClassLoader");
+ private boolean show = false;
+
+ public boolean isShow() {
+ return show;
+ }
+
+ public void setShow(boolean show) {
+ this.show = show;
+ }
+
// Abstract base class for elements
private abstract class Element {
public final cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus.Element parent;
@@ -747,6 +759,8 @@ public class FXMLLoaderPlus {
super.processStartElement();
updateValue(constructValue());
+ //如果是FXBaseController对象需要注入fxml
+ //因为如果只是单纯反射不具有FXPlus功能只有FX功能
if (value instanceof Builder>) {
processInstancePropertyAttributes();
@@ -1009,12 +1023,17 @@ public class FXMLLoaderPlus {
if (value == null) {
try {
- value = ReflectUtil.newInstance(type);
+ if(FXBaseController.class.isAssignableFrom(type)) {
+ value = FXFactory.getFXController(type,fx_id);
+ }else{
+ value = type.newInstance();
+ }
} catch (InstantiationException exception) {
throw constructLoadException(exception);
} catch (IllegalAccessException exception) {
throw constructLoadException(exception);
}
+
}
}
@@ -2551,27 +2570,29 @@ public class FXMLLoaderPlus {
((Initializable)controller).initialize(location, resources);
} else {
// Inject controller fields
- Map> controllerFields =
- controllerAccessor.getControllerFields();
+ if (!show) {
+ Map> controllerFields =
+ controllerAccessor.getControllerFields();
- injectFields(LOCATION_KEY, location);
+ injectFields(LOCATION_KEY, location);
- injectFields(RESOURCES_KEY, resources);
+ injectFields(RESOURCES_KEY, resources);
- // Initialize the controller
- Method initializeMethod = controllerAccessor
- .getControllerMethods()
- .get(cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus.SupportedType.PARAMETERLESS)
- .get(INITIALIZE_METHOD_NAME);
+ // Initialize the controller
+ Method initializeMethod = controllerAccessor
+ .getControllerMethods()
+ .get(cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus.SupportedType.PARAMETERLESS)
+ .get(INITIALIZE_METHOD_NAME);
- if (initializeMethod != null) {
- try {
- MethodUtil.invoke(initializeMethod, controller, new Object [] {});
- } catch (IllegalAccessException exception) {
- // TODO Throw when Initializable is deprecated/removed
- // throw constructLoadException(cn.edu.scau.biubiusuisui.exception);
- } catch (InvocationTargetException exception) {
- throw constructLoadException(exception);
+ if (initializeMethod != null) {
+ try {
+ MethodUtil.invoke(initializeMethod, controller, new Object[]{});
+ } catch (IllegalAccessException exception) {
+ // TODO Throw when Initializable is deprecated/removed
+ // throw constructLoadException(cn.edu.scau.biubiusuisui.exception);
+ } catch (InvocationTargetException exception) {
+ throw constructLoadException(exception);
+ }
}
}
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/config/FXPlusApplication.java b/src/main/java/cn/edu/scau/biubiusuisui/config/FXPlusApplication.java
index aaaf473..5e1dccb 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/config/FXPlusApplication.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/config/FXPlusApplication.java
@@ -1,7 +1,10 @@
package cn.edu.scau.biubiusuisui.config;
import cn.edu.scau.biubiusuisui.annotation.FXScan;
+import cn.edu.scau.biubiusuisui.factory.BeanBuilder;
+import cn.edu.scau.biubiusuisui.factory.FXBuilder;
import cn.edu.scau.biubiusuisui.factory.FXFactory;
+import cn.edu.scau.biubiusuisui.function.FXWindowParser;
import cn.edu.scau.biubiusuisui.utils.ClassUtils;
import java.util.List;
@@ -17,7 +20,14 @@ import java.util.Set;
public class FXPlusApplication {
- public static void start(Class clazz){
+ private static FXWindowParser windowAnnotationParser = new FXWindowParser();
+
+ private static BeanBuilder DEFALUT_BEAN_FACTORY = new FXBuilder();
+
+ private static BeanBuilder beanBuilder;
+
+ public static void start(Class clazz, BeanBuilder beanBuilder){
+ FXPlusApplication.beanBuilder = beanBuilder;
Annotation []annotations = clazz.getDeclaredAnnotations();
for(Annotation annotation : annotations){
if(FXScan.class.equals(annotation.annotationType())){
@@ -32,7 +42,7 @@ public class FXPlusApplication {
List temps = classUtils.scanAllClassName(dir);
for(String className:temps){
try {
- loadFXPlusClass(className);
+ loadFXPlusClass(className,beanBuilder);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
@@ -41,9 +51,12 @@ public class FXPlusApplication {
}
}
}
+ public static void start(Class clazz){
+ start(clazz,DEFALUT_BEAN_FACTORY);
+ }
- private static void loadFXPlusClass(String className) throws ClassNotFoundException {
+ private static void loadFXPlusClass(String className,BeanBuilder beanBuilder) throws ClassNotFoundException {
Class clazz = Class.forName(className);
- FXFactory.loadFXController(clazz);
+ FXFactory.loadFXController(clazz,beanBuilder);
}
}
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 64c3f37..706a1e7 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java
@@ -56,6 +56,7 @@ public class FXBaseController extends Pane {
FXMLLoaderPlus fxmlLoader = new FXMLLoaderPlus(getClass().getClassLoader().getResource(fxController.path()));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
+ fxmlLoader.setShow(true);
try {
fxmlLoader.load();
} catch (IOException e) {
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java b/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java
index eda6a19..0c0e4f9 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java
@@ -2,8 +2,11 @@ package cn.edu.scau.biubiusuisui.example;
import cn.edu.scau.biubiusuisui.annotation.FXScan;
import cn.edu.scau.biubiusuisui.config.FXPlusApplication;
+import cn.edu.scau.biubiusuisui.factory.BeanBuilder;
import javafx.application.Application;
import javafx.stage.Stage;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author jack
@@ -14,6 +17,12 @@ import javafx.stage.Stage;
public class Demo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
- FXPlusApplication.start(Demo.class);
+ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
+ FXPlusApplication.start(Demo.class, new BeanBuilder() {
+ @Override
+ public Object getBean(Class type) {
+ return context.getBean(type);
+ }
+ });
}
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/HelloFXPlusDemo.java b/src/main/java/cn/edu/scau/biubiusuisui/example/HelloFXPlusDemo.java
new file mode 100644
index 0000000..e417afd
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/HelloFXPlusDemo.java
@@ -0,0 +1,8 @@
+package cn.edu.scau.biubiusuisui.example;
+
+/**
+ * @Author jack
+ * @Date:2019/7/7 10:44
+ */
+public class HelloFXPlusDemo {
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/Main2.java b/src/main/java/cn/edu/scau/biubiusuisui/example/Main2.java
new file mode 100644
index 0000000..5741c14
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/Main2.java
@@ -0,0 +1,23 @@
+package cn.edu.scau.biubiusuisui.example;
+
+import cn.edu.scau.biubiusuisui.annotation.FXController;
+import cn.edu.scau.biubiusuisui.annotation.FXWindow;
+import cn.edu.scau.biubiusuisui.entity.FXBaseController;
+import javafx.stage.StageStyle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author jack
+ * @Date:2019/7/4 11:36
+ */
+@FXController(path = "Main.fxml")
+@Component
+@FXWindow(title = "hello",resizable = true,style = StageStyle.UNDECORATED)
+public class Main2 extends FXBaseController {
+
+ @Autowired
+ Student student;
+
+
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java
index 65d0ae2..12bafee 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java
@@ -1,7 +1,6 @@
package cn.edu.scau.biubiusuisui.example;
-import cn.edu.scau.biubiusuisui.annotation.FXController;
-import cn.edu.scau.biubiusuisui.annotation.FXWindow;
+import cn.edu.scau.biubiusuisui.annotation.*;
import cn.edu.scau.biubiusuisui.entity.FXBaseController;
import cn.edu.scau.biubiusuisui.entity.FXPlusContext;
import cn.edu.scau.biubiusuisui.factory.FXEntityFactory;
@@ -9,6 +8,7 @@ import javafx.beans.property.Property;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
+import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.stage.StageStyle;
@@ -20,7 +20,7 @@ import java.util.ResourceBundle;
* @Date:2019/6/25 1:47
*/
@FXController(path = "Main.fxml")
-@FXWindow(title = "demo1", draggable = true, resizable = true,style = StageStyle.UNDECORATED)
+//@FXWindow(title = "demo1", draggable = true, resizable = true,style = StageStyle.UNDECORATED)
public class MainController extends FXBaseController{
@FXML
@@ -38,9 +38,14 @@ public class MainController extends FXBaseController{
@FXML
private ListView list;
+ @FXML
+ @FXBind(bind = {"text=${student.name}"})
+ Label label;
+
Student student;
@FXML
+ @FXSender
void addWord(ActionEvent event) {
student.addList("hello" );
}
@@ -50,6 +55,12 @@ public class MainController extends FXBaseController{
student.delList("hello");
}
+
+ @FXReceiver(name = "MainController#haha:addWord")
+ void test2(){
+ System.out.println("?--?");
+ }
+
@Override
public void initialize() {
student = (Student) FXEntityFactory.createJavaBeanProxy(Student.class);
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/Student.java b/src/main/java/cn/edu/scau/biubiusuisui/example/Student.java
index 94aaca8..bf254e0 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/example/Student.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/Student.java
@@ -2,6 +2,7 @@ package cn.edu.scau.biubiusuisui.example;
import cn.edu.scau.biubiusuisui.annotation.FXEntity;
import cn.edu.scau.biubiusuisui.annotation.FXField;
+import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@@ -11,6 +12,7 @@ import java.util.List;
*/
@FXEntity
+@Component
public class Student {
@FXField
@@ -63,4 +65,5 @@ public class Student {
public void delList(String word){
list.remove(word);
}
+
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/springDemo/SpringController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/springDemo/SpringController.java
new file mode 100644
index 0000000..9871ea7
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/springDemo/SpringController.java
@@ -0,0 +1,50 @@
+package cn.edu.scau.biubiusuisui.example.springDemo;
+
+import cn.edu.scau.biubiusuisui.annotation.FXController;
+import cn.edu.scau.biubiusuisui.annotation.FXWindow;
+import cn.edu.scau.biubiusuisui.entity.FXBaseController;
+import cn.edu.scau.biubiusuisui.entity.FXPlusContext;
+import cn.edu.scau.biubiusuisui.example.Student;
+import cn.edu.scau.biubiusuisui.factory.FXEntityFactory;
+import cn.edu.scau.biubiusuisui.factory.FXFactory;
+import javafx.beans.property.Property;
+import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.stage.StageStyle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author jack
+ * @Date:2019/7/4 11:36
+ */
+@FXController(path = "springDemo.fxml")
+@Component
+@FXWindow(title = "hello",resizable = true,style = StageStyle.UNDECORATED)
+public class SpringController extends FXBaseController {
+
+ @Autowired
+ Student student;
+
+
+ Student studentProxy;
+
+ @FXML
+ Label label;
+
+ int count = 1;
+
+ @Override
+ public void initialize() {
+ studentProxy = (Student) FXEntityFactory.createJavaBeanProxy(student);
+ Property property = FXPlusContext.getEntityPropertyByName(studentProxy, "name");
+ label.textProperty().bind(property);
+ }
+
+ @FXML
+ public void add(){
+ studentProxy.setName("Jack : " + count);
+ count++;
+ }
+
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/springDemo/SpringDemo.java b/src/main/java/cn/edu/scau/biubiusuisui/example/springDemo/SpringDemo.java
new file mode 100644
index 0000000..0e3a9d2
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/springDemo/SpringDemo.java
@@ -0,0 +1,29 @@
+package cn.edu.scau.biubiusuisui.example.springDemo;
+
+import cn.edu.scau.biubiusuisui.annotation.FXScan;
+import cn.edu.scau.biubiusuisui.config.FXPlusApplication;
+import cn.edu.scau.biubiusuisui.example.Demo;
+import cn.edu.scau.biubiusuisui.factory.BeanBuilder;
+import javafx.application.Application;
+import javafx.stage.Stage;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @Author jack
+ * @Date:2019/7/7 10:43
+ */
+@FXScan(base = {"cn.edu.scau.biubiusuisui.example.springDemo"})
+public class SpringDemo extends Application {
+ @Override
+ public void start(Stage primaryStage) throws Exception {
+ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
+ FXPlusApplication.start(SpringDemo.class, new BeanBuilder() {
+ @Override
+ public Object getBean(Class type) {
+ System.out.println(type);
+ return context.getBean(type);
+ }
+ });
+ }
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/BeanBuilder.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/BeanBuilder.java
new file mode 100644
index 0000000..e507951
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/BeanBuilder.java
@@ -0,0 +1,9 @@
+package cn.edu.scau.biubiusuisui.factory;
+
+/**
+ * @Author jack
+ * @Date:2019/7/4 11:16
+ */
+public interface BeanBuilder {
+ Object getBean(Class type);
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXBuilder.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXBuilder.java
new file mode 100644
index 0000000..2f0a0b0
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXBuilder.java
@@ -0,0 +1,20 @@
+package cn.edu.scau.biubiusuisui.factory;
+
+/**
+ * @Author jack
+ * @Date:2019/7/4 11:13
+ */
+public class FXBuilder implements BeanBuilder{
+ @Override
+ public Object getBean(Class type) {
+ Object object = null;
+ try {
+ object = type.newInstance();
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return object;
+ }
+}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java
index a1f05ea..9190127 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java
@@ -22,16 +22,17 @@ public class FXEntityFactory {
private FXEntityFactory(){}
- public static Object createJavaBeanProxy(Class clazz) {
+ public static Object createJavaBeanProxy(Class clazz){
+ return createJavaBeanProxy(clazz, new FXBuilder());
+ }
+ public static Object createJavaBeanProxy(Class clazz,BeanBuilder beanBuilder) {
Object object = null;
- try {
- object = clazz.newInstance();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
+ object = beanBuilder.getBean(clazz);
+ if(object !=null){
+ return createJavaBeanProxy(object);
+ }else {
+ return null;
}
- return createJavaBeanProxy(object);
}
public static Object createJavaBeanProxy(Object object){
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java
index 97bd4ac..51b038d 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java
@@ -5,9 +5,13 @@ import cn.edu.scau.biubiusuisui.annotation.FXWindow;
import cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus;
import cn.edu.scau.biubiusuisui.entity.FXBaseController;
import cn.edu.scau.biubiusuisui.entity.FXPlusContext;
+import cn.edu.scau.biubiusuisui.example.Student;
+import cn.edu.scau.biubiusuisui.function.FXExpressionParser;
import cn.edu.scau.biubiusuisui.function.FXWindowParser;
import cn.edu.scau.biubiusuisui.messageQueue.MessageQueue;
import cn.edu.scau.biubiusuisui.proxy.classProxy.FXControllerProxy;
+import com.sun.javafx.fxml.BeanAdapter;
+import javafx.collections.ObservableMap;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
@@ -15,6 +19,7 @@ import javafx.stage.Stage;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.net.URL;
+import java.util.Map;
/**
* @Author jack
@@ -22,100 +27,119 @@ import java.net.URL;
*/
public class FXFactory {
+
+ private static final BeanBuilder BEAN_BUILDER = new FXBuilder();
private static FXWindowParser windowAnnotationParser = new FXWindowParser();
+ private static FXExpressionParser expressionParser = new FXExpressionParser();
- private FXFactory() { }
- public static void loadFXController(Class clazz) {
- getFXController(clazz, "");
+ private FXFactory() {
+ }
+
+ public static void loadFXController(Class clazz, BeanBuilder beanBuilder) {
+ if (clazz.getDeclaredAnnotation(FXWindow.class) != null) {
+ getFXController(clazz, null, beanBuilder);
+ }
}
public static FXBaseController getFXController(Class clazz) {
- FXBaseController fxBaseController = getFXController(clazz, "");
+ return getFXController(clazz, BEAN_BUILDER);
+ }
+
+ public static FXBaseController getFXController(Class clazz, BeanBuilder beanBuilder) {
+ FXBaseController fxBaseController = getFXController(clazz, null, beanBuilder);
return fxBaseController;
}
-
public static FXBaseController getFXController(Class clazz, String controllerName) {
- FXBaseController fxBaseController = getFxBaseController(clazz, controllerName);
+ return getFXController(clazz, controllerName, BEAN_BUILDER);
+ }
+
+ public static FXBaseController getFXController(Class clazz, String controllerName, BeanBuilder beanBuilder) {
+ FXBaseController fxBaseController = getFxBaseController(clazz, controllerName, beanBuilder);
return fxBaseController;
}
private static void register(FXBaseController fxBaseController, FXBaseController fxBaseControllerProxy) {
- FXPlusContext.addController(fxBaseController);
- MessageQueue.getInstance().registerCosumer(fxBaseController, fxBaseControllerProxy);
+ FXPlusContext.addController(fxBaseController); //保存
+ MessageQueue.getInstance().registerCosumer(fxBaseController, fxBaseControllerProxy); // 添加进入消息队列 信号功能
+ }
+
+ private static FXBaseController getFxBaseController(Class clazz, String controllerName) {
+
+ return null;
}
/**
- *
- * @param clazz instance that extends by FXBaseController
+ * @param clazz instance that extends by FXBaseController
* @param controllerName
* @return
*/
- private static FXBaseController getFxBaseController(Class clazz, String controllerName) {
- Annotation[] annotations = clazz.getAnnotations();
+
+ private static FXBaseController getFxBaseController(Class clazz, String controllerName, BeanBuilder beanBuilder) {
Boolean isController = false;
URL fxmlPath;
Boolean isWindow = false;
FXWindow fxWindow = null;
FXController fxController = null;
//reflect and get FXController cn.edu.scau.biubiusuisui.annotation
- for (Annotation annotation : annotations) {
- if (annotation.annotationType().equals(FXController.class)) {
- fxController = (FXController) annotation;
- isController = true;
- } else if (annotation.annotationType().equals(FXWindow.class)) {
- fxWindow = (FXWindow) annotation;
- isWindow = true;
- }
- }
-
+ fxController = (FXController) clazz.getDeclaredAnnotation(FXController.class);
+ fxWindow = (FXWindow) clazz.getDeclaredAnnotation(FXWindow.class);
Pane parent = null;
FXBaseController fxControllerProxy = null;
FXBaseController fxBaseController = null;
- if (isController) {
+ if (fxController != null) {
String name = fxController.path();
fxmlPath = clazz.getClassLoader().getResource(name);
FXMLLoaderPlus fxmlLoader = new FXMLLoaderPlus(fxmlPath);
- try {
- // create a cn.edu.scau.biubiusuisui.proxy for monitoring methods
- fxBaseController = (FXBaseController) clazz.newInstance();
+ // create a cn.edu.scau.biubiusuisui.proxy for monitoring methods
+ fxBaseController = (FXBaseController) beanBuilder.getBean(clazz);
+ if (fxBaseController != null) {
FXControllerProxy controllerProxy = new FXControllerProxy();
fxControllerProxy = (FXBaseController) controllerProxy.getInstance(fxBaseController);
- fxControllerProxy.setName(controllerName);
- fxBaseController.setName(controllerName);
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
+ fxmlLoader.setRoot(fxControllerProxy);
+ fxmlLoader.setController(fxControllerProxy);
+ try {
+ parent = fxmlLoader.load();
+ if (controllerName != null) {
+ fxControllerProxy.setName(controllerName);
+ fxBaseController.setName(controllerName);
+ } else {
+ fxBaseController.setName(parent.getId());
+ }
+ register(fxBaseController, fxControllerProxy);
+ } catch (IOException exception) {
+ throw new RuntimeException(exception);
+ }
}
- fxmlLoader.setRoot(fxControllerProxy);
- fxmlLoader.setController(fxControllerProxy);
- try {
- parent = fxmlLoader.load();
- } catch (IOException exception) {
- throw new RuntimeException(exception);
- }
- }else{
+ } else {
return null;
}
//register
- register(fxBaseController, fxControllerProxy);
- if (isWindow) {
- Stage stage = new Stage();
- fxControllerProxy.setStage(stage);
- fxBaseController.setStage(stage);
- double preWidth = fxWindow.preWidth() == 0 ? fxControllerProxy.getPrefWidth() : fxWindow.preWidth();
- double preHeight = fxWindow.preHeight() == 0 ? fxControllerProxy.getPrefWidth() : fxWindow.preHeight();
- Scene scene = new Scene(fxControllerProxy, preWidth, preHeight);
- stage.setScene(scene);
- windowAnnotationParser.parse(stage, fxControllerProxy, fxWindow);
- stage.show();
+
+ if (fxWindow != null) {
+ createWindow(fxWindow, fxControllerProxy, fxBaseController);
}
return fxControllerProxy;
}
+ private static void createWindow(FXWindow fxWindow, FXBaseController fxControllerProxy, FXBaseController fxBaseController) {
+ Stage stage = new Stage();
+ fxControllerProxy.setStage(stage);
+ fxBaseController.setStage(stage);
+ double preWidth = fxWindow.preWidth() == 0 ? fxControllerProxy.getPrefWidth() : fxWindow.preWidth();
+ double preHeight = fxWindow.preHeight() == 0 ? fxControllerProxy.getPrefWidth() : fxWindow.preHeight();
+ Scene scene = new Scene(fxControllerProxy, preWidth, preHeight);
+ stage.setScene(scene);
+ windowAnnotationParser.parse(stage, fxControllerProxy, fxWindow);
+ stage.show();
+ }
+
+ private static void parseControllerBindExpression(FXBaseController fxBaseController, ObservableMap namespaces) {
+ expressionParser.parse(fxBaseController, namespaces);
+ }
+
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/function/FXExpressionParser.java b/src/main/java/cn/edu/scau/biubiusuisui/function/FXExpressionParser.java
new file mode 100644
index 0000000..20907a2
--- /dev/null
+++ b/src/main/java/cn/edu/scau/biubiusuisui/function/FXExpressionParser.java
@@ -0,0 +1,56 @@
+package cn.edu.scau.biubiusuisui.function;
+
+import cn.edu.scau.biubiusuisui.annotation.FXBind;
+import cn.edu.scau.biubiusuisui.entity.FXBaseController;
+import cn.edu.scau.biubiusuisui.entity.FXPlusContext;
+import com.sun.javafx.fxml.BeanAdapter;
+import com.sun.javafx.fxml.expression.Expression;
+import com.sun.javafx.fxml.expression.ExpressionValue;
+import javafx.beans.property.Property;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ObservableMap;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+/**
+ * @Author jack
+ * @Date:2019/7/4 13:55
+ */
+public class FXExpressionParser {
+
+ private static final String BIND_EXPRESSION_PREFIX = "${";
+ private static final String BIND_EXPRESSION_SUFIX = "}";
+
+ public static void parse(FXBaseController fxBaseController, ObservableMap namespaces) {
+// Class clazz = fxBaseController.getClass();
+// Field[] fields = clazz.getDeclaredFields();
+// for (Field field : fields) {
+// FXBind fxBind = field.getDeclaredAnnotation(FXBind.class);
+// if (fxBind != null) {
+// String[] names = fxBind.bind();
+// for (String propertyName : names) {
+// String args[] = propertyName.split("=");
+// String name = args[0];
+// String value = args[1];
+// if (value.startsWith(BIND_EXPRESSION_PREFIX) && value.endsWith(BIND_EXPRESSION_SUFIX)) {
+// value = value.substring(BIND_EXPRESSION_PREFIX.length(), value.length() - 1);
+// Object object = null;
+// try {
+// field.setAccessible(true);
+// object = field.get(fxBaseController);
+// } catch (IllegalAccessException e) {
+// e.printStackTrace();
+// }
+//
+// BeanAdapter targetAdapter = new BeanAdapter(object);
+// ObservableValue