2

I'm new to groovy and griffon and currently playing around a little bit with SwingBuilder. I would like to add a subclass of JSplitPane (which uses a thin divider as described at http://www.formdev.com/blog/swing-tip-jsplitpane-with-zero-size-divider/).

Below you can find the view definition script. I've used a container()-Element to add my Splitpane-subclass. When I start my application, I get an java.lang.IllegalArgumentException. Any ideas, how to fix this?


The view:

frame(id:"frame",
 title: 'The new database explorer implemented with groovy/griffon',
 size: [600, 400],
 locationByPlatform:true,
 iconImage: imageIcon('/griffon-icon-48x48.png').image,
 iconImages: [imageIcon('/griffon-icon-48x48.png').image,
              imageIcon('/griffon-icon-32x32.png').image,
              imageIcon('/griffon-icon-16x16.png').image]) {

   panel (id:'mainPanel',
           opaque:false) {
       borderLayout()
       toolBar(id:'toolBar',
               constraints:NORTH,
               floatable:false,
               opaque: false,
               preferredSize: new Dimension(200,50)) {
           hglue()
           textField(id:'search', "clientPropertyJTextField.variant":"search",
                   maximumSize: new Dimension(150,35),
                   preferredSize: new Dimension(150,35))
       }
       panel(id: 'centerPanel',
               constraints: CENTER,
               opaque: true,
               background: new Color(238, 238, 238)) {
           borderLayout()
           container (new SplitPaneWithThinDivider(),
                      id:'mainSplitPane',
                      constraints: CENTER,
                      dividerLocation: 150
                      ) {
               scrollPane(id:'treeScroller', border:null) {
                   tree(id:'explorerTree',
                           rootVisible: false)
               }
               scrollPane(border:null) {
                   textArea()
               }
           }
       }
   }
}

The exception:

2012-03-15 06:45:01,778 [AWT-EventQueue-0] ERROR org.codehaus.griffon.runtime.builder.UberBuilder - An error occurred while building at.rehdie.dbexp.main.ExplorerFrameView@59c87031
java.lang.IllegalArgumentException: cannot add to layout: unknown constraint: null
    at java_awt_Container$add.call(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7_closure8.doCall(ExplorerFrameView.groovy:54)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7_closure8.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7.doCall(ExplorerFrameView.groovy:49)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4.doCall(ExplorerFrameView.groovy:47)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2.doCall(ExplorerFrameView.groovy:31)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:167)
    at at.rehdie.dbexp.main.ExplorerFrameView.run(ExplorerFrameView.groovy:23)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:151)
    at org.codehaus.griffon.runtime.builder.UberBuilder.build(UberBuilder.groovy:155)
    at org.codehaus.griffon.runtime.core.AbstractMVCGroup$1.run(AbstractMVCGroup.java:129)
2012-03-15 06:45:01,781 [main] ERROR griffon.util.GriffonExceptionHandler - Uncaught Exception
java.lang.RuntimeException: java.lang.IllegalArgumentException: cannot add to layout: unknown constraint: null
    at griffon.swing.SwingUIThreadHandler.executeSync(SwingUIThreadHandler.java:46)
    at griffon.core.UIThreadManager.executeSync(UIThreadManager.java:247)
    at org.codehaus.griffon.runtime.core.AbstractMVCGroup.buildScriptMember(AbstractMVCGroup.java:127)
    at org.codehaus.griffon.runtime.core.DefaultMVCGroupManager.initializeMembers(DefaultMVCGroupManager.java:230)
    at org.codehaus.griffon.runtime.core.DefaultMVCGroupManager.buildMVCGroup(DefaultMVCGroupManager.java:149)
    at org.codehaus.griffon.runtime.core.AbstractMVCGroupManager.createMVCGroup(AbstractMVCGroupManager.java:238)
    at org.codehaus.griffon.runtime.core.AbstractMVCGroupManager.createMVCGroup(AbstractMVCGroupManager.java:186)
    at org.codehaus.griffon.runtime.core.AbstractGriffonApplication.createMVCGroup(AbstractGriffonApplication.java:499)
    at org.codehaus.griffon.runtime.core.AbstractGriffonApplication.startup(AbstractGriffonApplication.java:313)
    at griffon.swing.AbstractSwingGriffonApplication.realize(AbstractSwingGriffonApplication.java:78)
    at griffon.swing.AbstractSwingGriffonApplication.run(AbstractSwingGriffonApplication.java:132)
    at griffon.swing.SwingApplication.main(SwingApplication.java:36)
Caused by: java.lang.IllegalArgumentException: cannot add to layout: unknown constraint: null
    at java_awt_Container$add.call(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7_closure8.doCall(ExplorerFrameView.groovy:54)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7_closure8.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7.doCall(ExplorerFrameView.groovy:49)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4_closure7.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4.doCall(ExplorerFrameView.groovy:47)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2_closure4.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:140)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2.doCall(ExplorerFrameView.groovy:31)
    at at.rehdie.dbexp.main.ExplorerFrameView$_run_closure2.doCall(ExplorerFrameView.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeFactoryMethod(UberInterceptorMetaClass.groovy:96)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.this$3$invokeFactoryMethod(UberInterceptorMetaClass.groovy)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass$this$3$invokeFactoryMethod.callCurrent(Unknown Source)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:167)
    at at.rehdie.dbexp.main.ExplorerFrameView.run(ExplorerFrameView.groovy:23)
    at org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass.invokeMethod(UberInterceptorMetaClass.groovy:151)
    at org.codehaus.griffon.runtime.builder.UberBuilder.build(UberBuilder.groovy:155)
    at org.codehaus.griffon.runtime.core.AbstractMVCGroup$1.run(AbstractMVCGroup.java:129)
Dieter Rehbein
  • 941
  • 8
  • 16

3 Answers3

2

A wild, untested guess, but does:

       widget( new SplitPaneWithThinDivider(),
               id:'mainSplitPane',
               constraints: CENTER,
               dividerLocation: 150,
               leftComponent: scrollPane(id:'treeScroller', border:null) {
                 tree(id:'explorerTree', rootVisible: false )
               },
               rightComponent: scrollPane(border:null) {
                 textArea()
               } )

Work at all?

tim_yates
  • 167,322
  • 27
  • 342
  • 338
0

Tried the code with Griffon 0.9.5-rc2, but used application() instead of frame(), and splitPane() as I don't have access to the custom SplitPaneWithThinDivider component and it works. I presume ExplorerFrameView belongs to a secondary MVC group. Have you tried using application() instead of frame() ?

You can have as many application() nodes per Views as this node has pretty much the same behavior as frame() but it knows how to deal with applets.

Andres Almiray
  • 3,236
  • 18
  • 28
0

Thanks for your response, Tim's version works perfectly. I've also tried the following:

splitPane (new SplitPaneWithThinDivider(),
           id:'mainSplitPane',
           constraints: CENTER,
           dividerLocation: 150,
           "clientPropertyQuaqua.Tree.style": "sideBar",
           border: null) {

   scrollPane(id:'treeScroller', border:null) {
       tree(id:'explorerTree',
            rootVisible: false)
   },           
   scrollPane(border:null) {
       textArea()
   }           
}

But this way the left component of the splitpane was always the default "Left button" (the same was true, when I used new JSplitPane() instead of new SplitPaneWithThinDivider()).

When I changed it to

splitPane (new SplitPaneWithThinDivider(),
           id:'mainSplitPane',
           constraints: CENTER,
           dividerLocation: 150,
           "clientPropertyQuaqua.Tree.style": "sideBar",
           border: null) {

   scrollPane(id:'treeScroller', border:null) {
       tree(id:'explorerTree',
            rootVisible: false)
   },           
   scrollPane(border:null) {
       textArea()
   }           
}
bean(mainSplitPane, leftComponent: treeScroller)

it worked.

Dieter Rehbein
  • 941
  • 8
  • 16