我正在编写一个Griffon / Groovy / Swing应用程序。但是,我喜欢使用像Eclipe的WindowBuilder工具那样的WYSIWYG GUI工具。
我想知道是否有可能将这两种方法结合起来?我想使用SwingBuilder
来管理视图/模型绑定和一些高级GUI任务(例如JDesktopPane
和JInternalFrame
),但将内容设计为{{{ 1}由WindowBuilder管理。
这是一个简单的groovy脚本:
JFrame
这是JFrame的ExamplePanel子类:
package example
import groovy.swing.SwingBuilder
import java.awt.BorderLayout as BL
count = 0
new SwingBuilder().edt {
frame(title: 'Frame', size: [300, 300], show: true) {
desktopPane() {
internalFrame(visible: true, bounds: [25, 25, 200, 100]) {
borderLayout()
textlabel = label(text: 'Click the button!', constraints: BL.NORTH)
button(text:'Click Me',
actionPerformed: {count++; textlabel.text = "Clicked ${count} time(s)."; println "clicked"}, constraints:BL.SOUTH)
}
internalFrame(visible: true, bounds: [50, 50, 200, 100]).add(new ExamplePanel())
}
}
}
groovy脚本创建一个package example;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JButton;
public class ExamplePanel extends JPanel {
/**
* Create the panel.
*/
public ExamplePanel() {
setLayout(new BorderLayout(0, 0));
JLabel textLabel = new JLabel("Click the button!");
add(textLabel, BorderLayout.NORTH);
JButton button = new JButton("Click Me");
add(button, BorderLayout.SOUTH);
}
}
和两个视觉上相同的JDesktopPane
。第二个JInternalFrame
包含JInternalFrame
,但它没有用于检测按钮点击或更改标签内容的基础结构。
是否有一种常规方法可以在ExamplePanel
中获得与ExamplePanel
定义的SwingBuilder
相同的行为?
答案 0 :(得分:0)
这不是"答案"因为它没有回答你的问题。但是我想指出另一个方向。
GUI设计工具通常使用一些网格布局和从绘图中创建的任意位置。如果您正确使用布局,GUI可以正确响应应用程序调整大小,而设计工具的网格布局通常无法通过调整大小进行缩放。
Swing布局有一种名为Miglayout的域语言。一旦你掌握了这个想法并不难,我发现使用groovy swing builder和Miglayout很容易创建相当复杂的GUI。
我在这里的3篇博客文章中写了我的经历。
https://sites.google.com/site/dracodoc/groovy/swingbuildermiglayout
答案 1 :(得分:0)
是的,您可以使用不同的替代方案嵌入任何自定义组件:
选择一个特定节点。在您的情况下ExmaplePanel
扩展Panel
,因此您可以通过以下方式使用panel()
节点
internalFrame { 面板(新的ExamplePanel()) }
选择一个通用节点。您可以使用widget
或container
。前者不接受嵌套,而后者则接受嵌套。
internalFrame { container(new ExamplePanel()){/ *进一步自定义* /} }
您可以创建自己的节点工厂并将其注册到构建器。格里芬指南有一节介绍如何完成。 http://griffon-framework.org/guide/2.14.0/#_views_builder_customizers