Jas*_*n S 55 java layout user-interface swing declarative
我想知道在Java中是否有任何关于声明性GUI编程的建议.(我厌恶基于视觉的GUI创建者/编辑器软件,但我对手动实例化JPanels和Boxes以及JLabel和JLists等感到有些厌倦)
这是我的整体问题,但对于我正在考虑的方法,我有两个具体的问题:
JavaFX:JavaFX中是否有一个真实GUI显示的示例(例如,不是圆形和矩形,但是列表框和按钮以及标签等),它可以与访问和更新各种元素的Java源文件连接?
简单的旧Swing有一些东西要解析XUL-ish XML:有没有人发明过一种用于Java的声明性语法(如XUL)用于Java Swing?我想,要创建一些基于STaX的代码来创建一些代码,实例化Swing元素的层次结构,并通过某种对象模型访问层次结构,我认为这并不难.但我宁愿使用一些众所周知,记录和测试的东西,而不是试图自己发明这样的东西.
JGoodies表格 - 不完全是声明性的,但有点接近我和JGoodies Binding有好运.但他们的表单布局的语法似乎有点神秘.
编辑:这里有很多很棒的答案!(我在上面添加了#3)我特别感谢您在使用其中一个框架进行实际应用时获得的任何经验.
ps我尝试了一些谷歌搜索("java gui declarative"),只是不太清楚要找什么.
Mic*_*ers 23
你可以看看javabuilders ; 它使用YAML来构建Swing UI.
手册 [PDF]中的一个简单示例:
JFrame:
name: myFrame
title: My Frame
content:
- JLabel:
name: myLabel2
text: My First Label
- JLabel:
name: myLabel2
text: My Second Label
Run Code Online (Sandbox Code Playgroud)
或者:
JFrame:
name: myFrame
title: My Frame
content:
- JLabel: {name: myLabel2, text: My First Label}
- JLabel: {name: myLabel2, text: My Second Label}
Run Code Online (Sandbox Code Playgroud)
甚至:
JFrame(name=myFrame,title=My Frame):
- JLabel(name=myLabel2, text=My First Label)
- JLabel(name=myLabel2, text=My Second Label)
Run Code Online (Sandbox Code Playgroud)
小智 20
作为CookSwing的作者,这是一个能够满足您需求的工具,在实际实现之前,我已经仔细研究过这个主题了.我以编写Java Swing GUI应用程序为生.
IMO,如果您要使用任何类型的命令式编程语言来描述Java Swing组件,您可能只是使用Java.Groovy等只是在没有太多简化的情况下增加了复杂性.
声明性语言要好得多,因为即使是非程序员也可以理解它,特别是当你需要将特定布局的微调任务委托给艺术家时.由于简单性,可读性以及大量可用的编辑器/转换工具等,XML非常适用于声明性语言(而非其他选择).
以下是声明性GUI编程中面临的问题,而不是任何特定的顺序.CookSwing已经解决了这些问题.
Tom*_*ine 13
如果简洁很重要,您可能需要考虑双括号成语:
new JFrame("My Frame") {{
setName("myFrame");
add(new JLabel("My First Label") {{
setName("myLabel2");
}};
add(new JLabel("My Second Label") {{
setName("myLabel2");
}};
}}
Run Code Online (Sandbox Code Playgroud)
然后,你不会失去任何众所周知的通用编程语言的强大功能(你知道你将需要它,而JellyTags很糟糕).你需要的只是一个额外的成语.
它并没有被大量使用,因为实际上人们在使用XML来解决问题并没有解决真正的痛点.
通常,您可以使用构建器层来抽象重复的代码.GUI代码不一定非常糟糕,几乎所有内容都是(包括在教科书中).
Kev*_*Day 11
我强烈推荐使用MiG Layout - 需要几天的时间来熟悉语法,但是一旦你掌握了它,就会产生奇迹.我使用JGoodies Forms已经有一段时间了,Karsten的构建器概念运行良好,但它有点神秘...... MiG更容易上手,并且产生了非常简洁的代码.