JavaFXã¯è¯ãã§ãïŒ
æåã«ãJavaFXã«ã€ããŠå°ã説æããŸãã ç§ãã¡ã¯åœŒå¥³ãšäžç·ã«ä»äºã奜ãã§ããã
ææ°ã®API ããã«ããŒãããªããŠãããã¹ãŠãéåžžã«ã¢ãã³ã«èŠããŸãã
ããŒã¿ã«
ããŒã¿ããªãã³éçº ã ãããåŽæããŸãã 倧éã®ããŒã¿ã«åºã¥ããããžãã¯ã¯ããžã£ã³ã¯ãã²ãã¿ãŒ/ã»ãã¿ãŒããã³ãŒããã¯ãªã¢ããŸã-ãããŠã³ïŒãã ããŒã¿å€æŽã€ãã³ããåæ¹åã®ããã€ã³ãããåŠçããŸãã
FXML ãããã¿ã€ãã³ã°ã«æé©ã§ãã èšèšè
ã«ã¯æããã§ããOracleã®åªããèŠèŠããŒã«ãJavaFX Scene BuilderãããããŸãã ãããããFXMLãéåžžã®ã³ãŒãã®åœ¢ã§æžãçŽãããã£ãããšã«æ³šæããŠãã ããã FXMLã®ä¿å®ã¯ã³ãŒããããç°¡åã§ããã³ãŒããšFXMLã®2ã€ã®ãã¡ã€ã«ãåžžã«ç·šéããå¿
èŠããããŸãã ããã«ãã³ãŒãã䜿çšããå Žåãç¶æ¿ã䜿çšããæ¹ãç°¡åã§ãã
ããŒã ã³ã³ããŒãã³ãã®æ§é ã ããªãŒã§å®è¡ã§ããŸãã ã«ãã¯ã¢ããã§æ€çŽ¢ã§ããŸãïŒïŒã DOMã®ããã«ã jQueryãæžãã ãã§ãã
CSS ããã¯æ¬åœã«ãã®ã§ãã 1ã€ã®äžè¬çãªcssãã¡ã€ã«ãä»ããŠã³ã³ããŒãã³ãããã¹ããŒãããŸãã IDã·ã¥ããã¯ãCSSã¯ã©ã¹ãã»ã¬ã¯ã¿ãŒãããã³ç䌌ã»ã¬ã¯ã¿ãŒã
ããã¹ããšã³ãžã³ è€éãªããã¹ãçšã®éåžžã«åªãããšã³ãžã³ã
WebView Webkitãšã³ãžã³ã«æŽç·Žãããã³ã³ããŒãã³ããå®è£
ããŸãã
åã®èšäºã§ããã«ã€ããŠèªãã§ãã ãã ã
ããŸãè¯ããªã
ããã§ãã äœãæªãã®ïŒ ãã€ãŠJavaFXã¹ã¯ãªããã¯çºæãããã ãã§ã¯ãããŸããã§ããã ã²ãã¿ãŒãšã»ãã¿ãŒãä»ããŠãã€ã³ãå¯èœãªããŒã¿ã«ã¢ã¯ã»ã¹ããããã®ãã£ãŒã«ããäœæããããšã¯ãäžæ©åŸéããŠæšæ¥ã§ãã Javaã¯ããã§ã¯ããŸãè¯ããããŸããã Java 8ã«ã¯ã©ã ãåŒããããŸããããã®å€èŠ³ã¯ãJavaã§äœããè¡ãå¿
èŠããããšãã質åã«å¯Ÿããçãã§ãããããåºæ¬çãªãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèããæ©äŒã§ããããŸãã
ã°ã«ãŒãŽã£ãŒïŒ
Groovyãéžæããããšã§ããããã®åé¡ããã¹ãŠèªåã§è§£æ±ºããŸããã ç°¡æœã§ãè¯ãæå³ã§å€ããã®ïŒæçãããã®ïŒã§ãããIDEAã§ãã管çãããŠããŸãã Groovyã䜿çšãããšãã³ãŒãã10å確å®ã«ã«ããã§ããŸããã åäœããèŠãç®ãèªã¿åããJavaã®ããã«èŠããŸãããã³ã³ãã¯ãããšããç¹ã§ã¯åªããŠããŸãã
JVMã«ã¯å€ãã®åªããçŸããèšèªããŸã ãããŸãããGroovyãç§ãã¡ã«åã£ãŠããã®ã¯å¶ç¶ã§ãã ãŸãããã£ãã泚éã倧奜ãã§ãããã§äœããå£ããããããŸããã ããã«ãç§ã¯å人çã«Groovyã䜿çšãã7幎ã®çµéšããããããŒã ã«å°é家ãããå Žåã¯ãå®å
šã«æªç¥ã®ãã®ããšãããã䜿çšããæ¹ãè¯ãã§ãã
ã¡ãªã¿ã«ãGroovyã¯èšèªã®äººæ°ã§18äœã«ãªã£ãŠããŸãïŒ
TIOBEã«ããïŒã
ç§ãã¡ã®å®è·µ
次ã«ãããã€ãã®äŸãèŠãŠã¿ãŸãããã ãããžã§ã¯ãããã³ããŒããŸããã³ãŒãã¯æ¬ç©ã§ãã
ã³ã³ããŒãã³ãæ§æ
ã³ãŒãã䜿çšããŠã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæ§æããã ãã§ãã
Javaã§ã¯ãå€ãå²ãåœãŠãããã«ã1è¡ãã€1ã¹ããããã€ã¹ããããèžãå¿
èŠããããŸããã
Button button = new Button(); button.setFocusTraversable(false); button.setLayoutX(23); button.setPrefHeight(30); button.setPrefWidth(30); button.setText("ADD");
Groovyãæžãæããå Žåãåãããã«èŠããŸããïŒ
Button button = new Button(focusTraversable: false, layoutY: 23, prefHeight: 30, prefWidth: 30, text: "Add")
Groovesã¯ãç¥ããªã人ã«ãset / getãã¬ãã£ãã¯ã¹ãªãã§ã¢ã¯ã»ã¹æ¹æ³ïŒã²ãã¿ãŒãã»ãã¿ãŒïŒã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã ã€ãŸããã¯ã©ã¹ã«setTextã¡ãœãããããå Žåãå€ã®åçŽãªå²ãåœãŠïŒtext = "Add"ïŒã«ãã£ãŠåŒã³åºãããŸãã ããã«ãGroovyã¯ã©ã¹ãã³ã³ãã€ã«ãããšãã²ãã¿ãŒãšã»ãã¿ãŒãèªåçã«ãããªãã¯ãã£ãŒã«ãã«è¿œå ãããŸãã ãããã£ãŠãset / getã¡ãœãããå®éã«å¿
èŠãšããªãå Žåã«æºããåŒã³åºãããšã¯ç§å¯ã§ã¯ãããŸããã
ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒã«ãã¢ãæž¡ãããšãã§ããŸã-nameïŒvalueïŒå®éãããã¯éåžžã®HashMapã§ãããããã§ã®æ§æã¯Groovy Maps-[key1ïŒvalue1ãkey2ïŒvalue]ïŒã
ããã«ãIDEAãããããã¹ãŠãéç¥ããããŒã¿åãšã¢ã¯ã»ã¹å¶éãæ€èšŒããããšãéèŠã§ãã
ã³ã³ããŒãã³ããæ§æãããã®æ¹æ³ã¯ãããã«ã³ã³ããŒãã³ãã®æ§é ãæ§æããããšã¯äžå¯èœã§ããããšã瀺åããŠããŸããïŒ
ã§ããŸãïŒ
menus.addAll( new Menu(text: "File", newItems: [ new MenuItem( text: "New Window", onAction: { t -> ApplicationUtil.startAnotherColtInstance() } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.N, KeyCombination.SHORTCUT_DOWN) ), new Menu(text: "New Project", newItems: [ newAs = new MenuItem( text: "New AS Project", id: "new-as", onAction: { t -> ProjectDialogs.newAsProjectDialog(scene, false) } as EventHandler<ActionEvent> ), newJs = new MenuItem( text: "New JS Project", id: "new-js", onAction: { t -> ProjectDialogs.newJsProjectDialog(scene, false) } as EventHandler<ActionEvent> ) ]), new SeparatorMenuItem(), new MenuItem( text: "Open Project", onAction: { t -> ProjectDialogs.openProjectDialog(scene, false) } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN) ), recentProjectsSubMenu = new Menu(text: "Open Recent", newItems: [ clearRecentProjects = new MenuItem( text: "Clear List", onAction: { t -> RecentProjects.clear() } as EventHandler<ActionEvent> ), ]), new SeparatorMenuItem(), save = new MenuItem( text: "Save Project", id: "save", onAction: { t -> ProjectDialogs.saveProjectDialog() } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN), disable: true ), saveAs = new MenuItem( text: "Save As...", onAction: { t -> ProjectDialogs.saveAsProjectDialog(scene) } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN, KeyCombination.SHIFT_DOWN), ), new MenuItem( text: "Close Project", onAction: { t -> ProjectDialogs.closeProjectDialog() } as EventHandler<ActionEvent>, accelerator: new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN), ), new SeparatorMenuItem(), new MenuItem( text: "Exit", onAction: { t -> ApplicationUtil.exitColt() } as EventHandler<ActionEvent> ), ]), new Menu(text: "Help", newItems: [ new MenuItem( text: "Open Demo Projects Directory", onAction: { t -> ProjectDialogs.openDemoProjectDialog(scene) } as EventHandler<ActionEvent> ), new MenuItem( text: "Open Welcome Screen", onAction: { t -> ProjectDialogs.openWelcomeScreen(scene) } as EventHandler<ActionEvent> ), ]) )
ãã®ãããªã³ãŒãã¯ãFXMLã»ã©èªã¿ããããããŸããã ããã«ãããã§ã¯ãFXMLã§å®è¡ã§ããªãã£ããã¹ãŠã®ã€ãã³ããã³ãã©ãŒã説æã§ããŸãã ãããŠããã®ãããªã³ãŒãã®ä¿å®ã¯ç°¡åã§ãã
åçãªããããã£ãšã¡ãœãã
æ°é
ãã®ããèªè
ã¯ãã¡ãã¥ãŒé
ç®ãnewItemsãã¯äœã®ããã«ããã®ã§ããããïŒ ã¯ããMenuã¯ã©ã¹ã«ã¯ãã®ãããªã¡ãœããã¯ãããŸããã é
ç®ãã£ãŒã«ãã®ã¿ãèªã¿åãããšãã§ããããå²ãåœãŠãããšãã§ããªãããããã®ãããªã¡ãœãããè¿œå ããŸããããsetItemsïŒïŒãã¡ãœããã¯ãããŸãããããgetItemsïŒïŒãã®ã¿ããããæ°ããå€ãå²ãåœãŠãããšã¯ã§ããŸãããã¡ãã¥ãŒãæ§é ãšããŠæ§æããåçãã£ãŒã«ããè¿œå ããŸããã
ãã®ãããªãã£ãŒã«ãã®è¿œå ã¯éåžžã«ç°¡åã§ãããJavaãšã³ãã£ãã£ã¯ãåçã¡ãœãããªã©ã®ã»ãã£ã·ã§ã³ã«é·ãéæµæããŠããŸããã ç§ãã¡ã¯ããã€ããã¯ã¹ã䜿çšããå¿
èŠæ§ã®äºå®ãšå解ãããŸã§ãå€ãã®èªè»¢è»ãçºæããŸããã ãããŠããã¹ãŠãã·ã³ãã«ã§å€§èäžæµã§ããããšãå€æããŸããã
åçãã£ãŒã«ããè¿œå ããŠãå¥ã®ã¯ã©ã¹GroovyDynamicMethodsã«ç§»åããŸããã 圌ã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
class GroovyDynamicMethods { private static inited = false static void init() { if(inited)return inited = true addSetter(javafx.scene.Node, "newStyleClass", { String it -> styleClass.add(it) }) addSetter(Parent, "newChildren", {List<MenuItem> it -> children.addAll(it) }) addSetter(Menu, "newItems", {List<MenuItem> it -> items.addAll(it) }) } private static void addSetter(Class clazz, String methodName, Closure methodBody) { addMethod(clazz, "set" + methodName.capitalize(), methodBody) } private static void addMethod(Class clazz, String methodName, Closure methodBody) { ExpandoMetaClass exp = new ExpandoMetaClass(clazz, false) exp."$methodName" = methodBody exp.initialize() clazz.metaClass = exp } }
ã芧ã®ãšããã3ã€ã®ã¡ãœãããè¿œå ããã ãã§ãæ§é å
šäœã§ã³ã³ããŒãã³ãã®æ§æããµããŒãã§ããŸãã
ããã«ãã¯ã©ã¹ã«ãããã®åçãã£ãŒã«ããããããšãç解ããããã«IDEAã«æããŸããã

IDEAã¯ããã®ãããªãã£ãŒã«ããJavaFX APIã«ååšãããã®ããã«ååšããããšãèªèããŠããŸãã
ãã€ã³ãå¯èœãªããããã£ã®äœ¿çš
ããŒã¿ãã€ã³ãã£ã³ã°ã¯çŽ æŽãããããšã§ãã ç§ãã¡ã®ããŒã ã¯ãã®ãã³ãã©ã䜿çšããŸã-ããã€ã³ãã£ã³ã°ãéããŠäœããã§ãããªãããã€ã³ãã£ã³ã°ãéããŠãããããŠãã ãããã ã...åŸã§ããçŽããªãããã«ãã
ãã³ãã£ã³ã°ã䜿çšãããšãããŒã¿ã¢ãã«ãšã³ã³ããŒãã³ããé¢é£ä»ããããšãã§ããŸãã UIã³ã³ããŒãã³ãèªäœã«ã¯ãã¢ãã«ããŒã¿ã«é¢é£ä»ããããããŸãã¯ãããã®ããããã£ããžãã¯ã®å€æŽã«åºã¥ããŠãããŒã¿å€æŽã€ãã³ãã«ãµãã¹ã¯ã©ã€ãã§ãããã€ã³ãã£ã³ã°ããããã£ããããŸãã
ç°¡åãªãã§ãã¯ããã¯ã¹ã®äŸïŒ
CheckBox checkBox = new CheckBox(); checkBox.selectedProperty().bindBidirectional(selectedProperty);
ãããŠããã§ãã¯ããã¯ã¹ãã¯ãªãã¯ããã€ãã³ãã«åå¿ããŸãïŒ
CheckBox checkBox = new CheckBox(); checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> value, Boolean before, Boolean after) { System.out.println("value = " + value); } });
䜿çšã¯äŸ¿å©ã§ãã ãã®ãããªããããã£ãèšè¿°ããããšã¯ããŸã䟿å©ã§ã¯ãããŸããã
Javaã¯ãã®ãããªã·ããªãªãæäŸããŸãïŒIDEAã³ãŒãã¯èªåçã«çæãããŸãïŒã
private StringProperty name = new SimpleStringProperty();
ãã¹ãŠãåé¡ãªããIDEããã®ãããªã³ãŒããçæããŸãã ãŸããããã¯æãã§ã¯ãããŸãããïŒ ãªãããããã¹ãŠèŠãå¿
èŠãããã®ã§ããïŒ ããããã¹ãŠã®ãŽãã®èåŸã«ãç§ãã¡ã®è«çã¯èŠããŸããã
解決çïŒ ãã®ã³ãŒããçæããASTå€æã䜿çšããŸãã ã³ã³ãã€ã«æã
ããããã£ïŒJavaã§10è¡ã§èšè¿°ïŒã¯ã1è¡ã§Groovyã«å€ããã次ã®ããã«ãªããŸãã
@FXBindable String name;
@FXBindableã¯ã
GroovyFXã䜿çšããããšãã
ç§ãã¡ã®ãã®ã䜿çšããããšãã§ããŸãã
ãã®æ³šéãåå²ãã
githubã§ååŸã§ããŸãã
ããã«ãåããããžã§ã¯ãã§ã¯ãæ¡åŒµå
.gdslã®ãã¡ã€ã«ããããIDEAã«ãã®æ³šéã䜿çšããããã«
æ瀺ããŸã
-autocliteãªã©
ãã®ãããªå€æã§ã¯ãsetNameãgetNameãgetNamePropertyã¡ãœãããäœæãããŸãã ããã«ãnameïŒïŒã¡ãœãããè¿œå ãããããã«å°ãªãæåãæžãããšã§ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã å³ããããã»ãšãã©ã®å Žåããã®ç¹å®ã®æ¹æ³ã䜿çšããŸãã
this.nameInput.textProperty().bindBidirectional(this.name())
å¿åã¯ã©ã¹ã§ããŠã³
ã¡ãã¥ãŒã®äŸã§ã¯ãå¿åã¯ã©ã¹ãä»ããŠã€ãã³ãããµãã¹ã¯ã©ã€ãããŸãã ã¡ãã¥ãŒæ§é ã®äŸã¯ãã€ãã³ããã³ãã©ãŒããã·ã§ã«ãã§ããããšã瀺ããŠããŸãã
onAction: { t -> ProjectDialogs.newAsProjectDialog(scene, false) } as EventHandler<ActionEvent>
ãas EventHandlerãã®ãã¹ãŠã®éæ³ã¯ããã¬ãžã£ãŒã®æ¬äœãEventHandlerã¯ã©ã¹ã®handleã¡ãœããã®æ¬äœã«ç§»åããããšã§ãã ãã®ãããªçãã¬ã³ãŒãã䜿çšããŠã€ãã³ããåŠçãããšãã³ãŒããç°¡æœã«ãªããŸãã ã¡ãªã¿ã«ãã¹ããŒãIDEAã¯ãã¯ã€ãã¯å€æŽã®ãQuick to instant instantiationãã¯ã€ãã¯ãã£ãã¯ã¹ãæäŸããŸãã ã¯ã©ã¹ãã³ãã©ãŒã§ããã€ãã®ã¡ãœããããªãŒããŒããŒãããå¿
èŠãããå Žåã¯ãMapïŒ[handler1ïŒ{}ãhandler2ïŒ{}]ïŒãä»ããŠå¥ã®æžã蟌ã¿ã䜿çšããããšãã§ããŸãã
XMLã®ä»äº
ãã®ãããžã§ã¯ãã§ã¯ãããŒã¿ã¢ãã«ãXMLã§ã·ãªã¢ã«åãããã£ã¹ã¯ããååŸããå¿
èŠããããŸããã æåã¯ç¿æ
£çã«XStreamã䜿çšãããã£ãã®ã§ããããã管çããããæ§é ãå¿
èŠã§ãã-JavaFXã®Bindableããããã£ã¯å€§ãããã³ã³ããŒã¿ãŒã¯æžãã®ãé¢åã§ãã JAXBãèŠãŠãããŸãã«ãæªãã ãŸããGroovy XMLã·ãªã¢ã«åã䜿çšããŸãã
XmlSlurperãã«ãã€ã³Groovy SDKãç»å ŽããŸããã
åBeanã¢ãã«ã¯ãbuildXmlãšbuildModelã®2ã€ã®ã¡ãœãã-ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãšãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ãå®è£
ããŸã
Closure buildXml(Project project) { return { 'launcher'(launcherType) 'browser-path'(browserPath) 'nodejs-path'(nodejsPath) 'console-value'(console) } } @Override void buildModel(Object node) { launcherType = node.'launcher' browserPath = node.'browser-path' nodejsPath = node.'nodejs-path' console = node.'console-value' }
buildXmlã¡ãœããã¯ãæ§é ãããã¯ããŒã¯ãšããŠè¿ããŸãã ããã§ã®éæ³ã¯ãååšããªãã¡ãœãããšããããã£ãåŒã³åºããŠå²ãåœãŠãããšã§ãã ååšããªãã¡ãœãããåŒã³åºããããšãããããã£ãåããŒãã®åœ¢åŒã§äœæãããå€ãååšããªããã£ãŒã«ãã«å²ãåœãŠããããšãXMLå±æ§ãäœæãããååšããªãã¡ãœãããåŒã³åºããããã¹ããã©ã¡ãŒã¿ãŒãšããŠæž¡ããããšãåã蟌ã¿XMLããŒãæ§é ãäœæãããŸãã
buildModelã¡ãœããã¯ããŒãåŒæ°ãåããåçãªã¯ãšã¹ããä»ããŠããŒãã解æããŸãã
ãã¡ã€ã«ãæäœãã
ç§ãã¡ã®ããã°ã©ã ã¯ããã¡ã€ã«ã·ã¹ãã ã§å€§ãã«æ©èœããŸãã Groovyã䜿çšããŠãIOã³ãŒãã倧å¹
ã«åæžããããšãã§ããŸããã ããç§ããšã«ä¿åããå¿
èŠã¯ãããŸããã§ããããããžãŒãªWebãµãŒããŒããããŸããã§ãããGroovyãå€ãã®äœæ¥ãè¡ã£ãŠãããããšã¯ç§ãã¡ã«ãšã£ãŠã¯åé¡ãããŸããã§ããã
Groovy SDKã¯ãFileãå«ãJavaã¯ã©ã¹ã®å€ãã®äŸ¿å©ãªæ¡åŒµæ©èœãæäŸããŸãã ããšãã°ãåã«ãããã¹ãããã£ãŒã«ããä»ããŠãã¡ã€ã«ã®å
容ãèªã¿æžãããæ©èœããŸãã¯ãsplitEachLineãã䜿çšããŠãã¡ã€ã«ã®è¡ãæäœããæ©èœã
ããã«ããã¡ã€ã«ã®æ€çŽ¢ãšãã£ã«ã¿ãªã³ã°ã«ã䜿çšã§ããAntBuilderãæ°ã«å
¥ããŸããã
次ã®äŸã§ã¯ããã¡ã€ã«ãã³ããŒããŸãã
def ant = new AntBuilder() ant.sequential { myDir = "test/to/" mkdir(dir:myDir) copy(todir:myDir) { fileset(dir:"text/from/") { include(name:"**/*.*") } } }
fileScanerã䜿çšããŠããã¿ãŒã³ã§ãã¡ã€ã«ãæ€çŽ¢ã§ããŸãã
def ant = new AntBuilder() def scanner = ant.fileScanner { fileset(dir: file) { include(name: "**/*.jpg") } } scanner.each{ printlt(it) }
ãããŠãã¡ãããAntBuilderã¯ãã¹ãŠã®æ¡åŒµæ©èœãåããæ¬æ ŒçãªANTã§ãã ãŸã å匷ãšå匷ããããŸãã GradleãAntBuilderã䜿çšããŠãããããã«ãããããããšãã§ãããšããäºå®ã¯å°è±¡çã§ãã
GPathã䜿çšããŠããŒããæäœãã
JavaFXã®ã³ã³ããŒãã³ãã®æ§é 以æ¥ãããŒãã®èŠæ±ãã³ã¬ã¯ã·ã§ã³ãšããŠäœ¿çšããŸããã ãã®ã¢ãããŒãã§ã¯ãå€æ°ã®ã«ãŒããåãé€ããã³ãŒãã倧å¹
ã«åæžããŸããã
ããšãã°ãJavaã§ã®ã¹ã¯ããŒã«ãåé€ããã«ã¯ïŒ
webView.getChildrenUnmodifiable().addListener(new ListChangeListener<Node>() { @Override void onChanged(ListChangeListener.Change<? extends Node> change) { Set<jNode> scrolls = webView.lookupAll(".scroll-bar"); for (Node scroll : scrolls) { scroll.setVisible(false); } } });
Groovyã§ãåãããšïŒ
webView.childrenUnmodifiable.addListener({ change -> webView.lookupAll(".scroll-bar")*.visible = false } as ListChangeListener)
ãã¡ã€ãã£ã³ã°NPE
æŒç®åãïŒãã-ç§ãã¡ã®æèŠã§ã¯ã1ã€ã ãã§ãJavaããGroovyãžã®åãæ¿ãã«ã€ããŠèããããšãã§ããŸãã
model?.projectSettings?.projectPaths?.livePaths?.each{ println(it) }
ãããJavaã«å€æããå°ãªããšã20è¡ã®ã³ãŒããååŸããŸãã
ãããã«
ããããç§ãã¡ãèŠããŠããããšã®ãã¹ãŠã§ãã ãã¡ããããããžã§ã¯ãã§ã¯ä»ã®Groovyã®ãã°ããºãã䜿çšããŸãããããã¹ãŠããªã¹ããããšãèšäºã®ç¯å²ãè¶
ããŠããŸããGroovyã«ã¯å€ãã®æç§æžããããŸãã
ããããGroovyããç§ãã¡ã«åããªããã®ã«ã€ããŠè©±ãããããšæããŸãã ãŸããäžå¿
èŠãªãã€ããã¯ã¹ãåé¿ããŸããã ç§ãã¡ã®ããŒã ã§ã¯ãå€æ°ãŸãã¯ãã£ãŒã«ããäœæãããšãã«ã¿ã€ããæå®ããå¿
èŠãããããšã«åæããŸããïŒã¹ãããã³ã°ã®ãã©ã¡ãŒã¿ãŒãé€ã-ããã§ã¯ãããã®åã³ã®ååã倱ãããŸãïŒã ãŸããããã¯ã¹ã€ã³ãšãªãŒããŒããŒãæŒç®åã䜿çšããŸããã§ããã ã³ãŒããžã£ã°ãªã³ã°ã¯æªãç¿æ
£ã ãšèããŠããŸããã³ã³ãã¯ããªã ãã§ãªããå¶åŸ¡ããããµããŒããããã³ãŒããå¿
èŠã§ãã ããããããããã¹ãŠã§ãã Groovyã¯Javaã«éåžžã«ãã䌌ãŠããããã®ã³ã³ããã¹ãã§äœ¿çšããŸãããã³ã³ãã€ã«äžã«ASTå€æãå®è¡ãããã³ãŒããäœæãããšãã«ããã¶ã€ã³ã«äœãä»ã®ãã®ãèªåçã«è¿œå ããããšæ³å®ããŠããŸãã ããã¯ãèªåçææ©èœãåããJavaã§ãã ãããŠãä»ã«äœãå¿
èŠãããŸããã
Codeorchestra.comãããžã§ã¯ã
ãµã€ã