SwingBuilder, как синтаксис GUI для Java? - PullRequest
2 голосов
/ 26 октября 2010

Существует ли библиотека, которая позволяет писать графические интерфейсы на основе Swing, аналогично тому, как SwingBuilder в Groovy?

Я надеюсь разработать приложение с графическим интерфейсом Java без встраивания Groovyили другой полный язык программирования на Java, и я нахожу стандартный синтаксис Java довольно утомительным.

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Я пошел по этому пути в одной точке, а затем обнаружил MiGLayout - если я не использую разделенную панель, я обычно могу расположить каждый из моих видов на одной панели, с минимумомхлопот.Существует некоторая кривая обучения, но как только вы преодолеете горб, вы можете практически мгновенно выбить действительно красивый графический интерфейс.

Вся парадигма вложенности панелей внутри других панелей не чистадля многих дизайнов - вы столкнетесь с менеджером по расположению.

1 голос
/ 26 октября 2010

Я не знаю о такой библиотеке, хотя было бы возможно что-то подобное (без именованных параметров, что снижает читабельность). Кто-то, возможно, преобразовал 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() {{ ... }}

это фактически создание нового определения класса. Я бы не рекомендовал делать это очень часто из-за этого.

...