Можно ли объединить Groovy SwingBuilder с подклассом Java JFrame?

Я пишу приложение Griffon/Groovy/Swing. Тем не менее, мне нравится использовать инструменты WYSIWYG GUI, такие как инструмент Eclipe WindowBuilder.

Мне интересно, можно ли совместить два подхода? Я хотел бы использовать SwingBuilder для управления привязкой представления/модели и некоторыми высокоуровневыми задачами графического интерфейса (такими как JDesktopPane и JInternalFrame), но иметь содержимое, разработанное в JFrame, управляемое WindowBuilder.

Вот простой заводной скрипт:

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())
    }
  }
}

и это подкласс ExamplePanel JFrame:

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);

    }

}

Сценарий groovy создает JDesktopPane и два визуально идентичных JInternalFrame. Второй JInternalFrame содержит ExamplePanel, но не имеет инфраструктуры для обнаружения нажатий кнопок или изменения содержимого метки.

Есть ли отличный способ получить то же поведение в ExamplePanel, что и в SwingBuilder, определенном internalFrame?


person spierepf    schedule 25.03.2018    source источник


Ответы (2)


Да, вы можете внедрить любой пользовательский компонент, используя различные альтернативы:

  1. Выберите конкретный узел. В вашем случае ExamplePanel расширяет Panel, поэтому вы можете использовать узел panel() следующим образом.

    internalFrame { панель (новая панель примеров ()) }

  2. Выберите общий узел. Вы можете использовать widget или container. Первый не принимает вложенность, а второй делает.

    internalFrame { container(new ExamplePanel()) { /* дополнительные настройки */ } }

  3. Вы можете создать свою собственную фабрику узлов и зарегистрировать ее в билдере. В руководстве по грифонам есть раздел, показывающий, как это можно сделать. http://griffon-framework.org/guide/2.14.0/#_views_builder_customizers< /а>

person Andres Almiray    schedule 28.03.2018

Это не «ответ», поскольку он не отвечает на ваш вопрос. Однако я хочу указать на другое направление.

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

Существует доменный язык для макета Swing, который называется Miglayout. Это не сложно, как только вы уловили идею, и я обнаружил, что с помощью Groovy Swing Builder и Miglayout легко создать довольно сложный графический интерфейс.

Я написал свой опыт в 3 сообщениях в блоге здесь.

https://sites.google.com/site/dracodoc/groovy/swingbuildermiglayout

person dracodoc    schedule 25.03.2018