SwingBuilder, как синтаксис GUI для Java?
Существует ли библиотека, позволяющая писать графические интерфейсы на основе Swing, аналогичные тем, что были реализованы SwingBuilder в Groovy?
Я надеюсь разработать Java-приложение с графическим интерфейсом без встраивания Groovy или другого полного языка программирования в Java, и я нахожу стандартный синтаксис Java довольно утомительным.
2 ответа
В какой-то момент я пошел по этому пути, а затем нашел MiGLayout - если я не использую разделенную панель, я обычно могу расположить каждый из моих видов на одной панели с минимальными трудностями. Существует небольшая кривая обучения, но как только вы преодолеете горб, вы можете вывести действительно приятный на вид графический интерфейс практически мгновенно.
Вся парадигма вложения панелей внутри других панелей не является чистой для многих проектов - вы столкнетесь с менеджером по расположению.
Я не знаю такой библиотеки, хотя было бы возможно что-то подобное (без именованных параметров, что снижает читабельность). Кто-то, возможно, преобразовал SwingBuilder в Java.
[Похоже, вы можете получить исходный код Java для SwingBuilder по адресу http://kickjava.com/src/groovy/swing/SwingBuilder.java.htm. Я не знаю, насколько это актуально]
Самое простое, что вы можете найти в простом Java, это использовать "двойной вьющийся трюк" (который на самом деле не трюк, а просто анонимное определение внутреннего класса).
Пример SwingBuilder на вашей ссылочной странице:
new SwingBuilder().edt {
frame(title:'Frame', size:[300,300], show: true) {
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)
}
}
может быть написано что-то вроде следующего в Java
new JFrame() {{
setTitle("Frame");
setSize(300,300);
setLayout(new BorderLayout());
textlabel = new JLabel("Click the button!");
add(textlabel, BorderLayout.NORTH);
add(new JButton("Click Me") {{
addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
count++;
textlabel.setText("Clicked " + count + " time(s).");
System.out.println("clicked");
}});
}}, BorderLayout.SOUTH);
setVisible(true);
}};
ПРИМЕЧАНИЕ. Проблема в том, что при использовании
new SomeClass() {{ ... }}
это на самом деле создает новое определение класса. Я бы не рекомендовал делать это очень часто из-за этого.