Question

I'm currently trying to create an application with Griffon 0.9.5 and the FlamingoBuilder.

I've the changed the value of frameClass in Application.groovy to 'org.jvnet.flamingo.ribbon.JRibbonFrame' and tried a few things in order to add a ribbon to the application window.

My first attempt was creating a ribbonTask node with nested ribbonBand nodes. The application starts but the buttons are not shown.

application(title: 'test01',
        preferredSize: [320, 240],
        pack: true,
        locationByPlatform: true,
        iconImage: imageIcon('/griffon-icon-48x48.png').image,
        {
            ribbonTask(title: 'Start') {
                    ribbonBand(id: 'fooBarBand', title: 'FooBar', image: imageIcon('/griffon-icon-48x48.png').image) {
                        commandButton(id: 'fooButton', text: 'Foo', image: imageIcon('/griffon-icon-48x48.png').image)
                        commandButton(id: 'barButton', text: 'Bar', image: imageIcon('/griffon-icon-48x48.png').image)
                    }
            }

            // add content here
            label('Content Goes Here') // delete me
        }
)

Screenshot of first attempt


In my second attempt I explicitly create a RibbonTask and call addTask. The buttons are shown. However, I'm not sure if this is really the Griffon-way of doing things. Question: Is there a better way to create a ribbon?

application(title: 'test01',
        preferredSize: [320, 240],
        pack: true,
        locationByPlatform: true,
        iconImage: imageIcon('/griffon-icon-48x48.png').image,
        {
            ribbonBand(id: 'fooBarBand', title: 'FooBar', image: imageIcon('/griffon-icon-48x48.png').image) {
                commandButton(id: 'fooButton', text: 'Foo', image: imageIcon('/griffon-icon-48x48.png').image)
                commandButton(id: 'barButton', text: 'Bar', image: imageIcon('/griffon-icon-48x48.png').image)
            }
            current.ribbon.addTask new RibbonTask('Start', fooBarBand)

            // add content here
            label('Content Goes Here') // delete me
        }
)

Screenshot of second attempt


I then tried adding a ribbonApplicationMenu with the following code snippet:

        ribbonApplicationMenu(id: 'appMenu') {
            ribbonApplicationMenuEntryPrimary(id: 'quitMenuEntry', text: 'Quit',
                    entryKind: JCommandButton.CommandButtonKind.ACTION_ONLY,
                    image: imageIcon('/griffon-icon-48x48.png').image)
        }

However, it doesn't work. I get the following runtime exception:

java.lang.RuntimeException: Failed to create component for 'ribbonApplicationMenuEntryPrimary' reason: groovy.lang.MissingPropertyException: No such property: text for class: griffon.builder.flamingo.factory.RibbonApplicationMenuEntryPrimaryFactory

The documentation of FlamingoBuilder states that there is a text property and when I remove the text property I get an exception because the text property must be set. I'm a little bit at loss. What's wrong with this code snippet?

Was it helpful?

Solution

I'm afraid the first issue is related to the application() node factory vs ribbonFrame() factory. You see, Griffon assumes the frame subclass to behave like any other regular JFrame however JRibbonFrame handles its children in a different way. This is not know to ApplicationFactory so it "fails" to add ribbon tasks unless you add them manually as you show in the second snippet.

This problem can be fixed by moving the parent/child relationship code from ribbonFrame() to ribbonBand/ribbonTask factories. This requires a new release of FlamingoBuilder.

Now on the second problem, that appears to be a bug on our side. Considering that FlamingoBuilder should be updated in any case we'll fix this problem too.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top