WindowBuilder для Swing сделал данные члена, и это казалось ненужным - PullRequest
2 голосов
/ 21 сентября 2011

WindowBuilder для Swing создает флажки в качестве локальных переменных и текстовые поля в качестве данных элементов.Это несоответствие беспокоило меня.Так как все это в любом случае связано с JFrame верхнего уровня, эти виджеты обязательно будут существовать до тех пор, пока в JFrame есть ссылки на них, поэтому нет необходимости в том, чтобы текстовые поля были данными-членами.Мне кажется, что текстовые поля должны быть локальными, как и флажки.Местные жители лучше инкапсулируют.Локальные ссылки могут умереть в конце конструктора объекта GUI (класса, расширяющего JFrame), сгенерированного WindowBuilder, и JFrame будет по-прежнему иметь ссылки на все виджеты.

Делая их локальными и помещая "final" вперед этими объявлениями виджетов, чтобы их можно было использовать внутри анонимных внутренних классов обработчика событий, было то, что нужно для их работы.Мне также пришлось немного изменить порядок, поскольку порядок создания текстовых полей не имеет значения, если они все объявлены как члены.Порядок имеет значение для местных жителей, поэтому мне пришлось немного переместить использование оператора «new» (instantiation) «вверх» к верхней части локальной области видимости.Они просто должны были быть к северу от обработчиков событий, которые их используют.

До сих пор я не нашел никаких ошибок как следствие, поэтому я спрашиваю, почему WindowBuilder не сделал это таким образом для начала.Я новичок в Swing и WindowBuilder, поэтому существует высокая вероятность того, что у WindowBuilder есть веские причины не делать этого, даже если это подходит для моего случая.

Ниже приведен вывод WindowBuilder посленекоторые тривиальные модификации именования, но до модификаций, описанных выше .Это вывод с двумя текстовыми полями, двумя флажками, двумя кнопками на севере и одной меткой в ​​центре.Это вставляется здесь на случай, если кто-то увидит здесь что-то, что может объяснить выбор использования данных элементов WindowBuilder.

public class TestWB extends JFrame
{
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField textBox1;
    private JTextField textBox2;

    public TestWB() // the constructor
    { 
       ... // see the constructor below
    }
}

Конструктор для вышеуказанного класса:

public TestWB()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 646, 451);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JPanel northPanel = new JPanel();
    contentPane.add(northPanel, BorderLayout.NORTH);

    JButton button1 = new JButton("button1");
    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        }
    });
    northPanel.add(button1);

    JButton button2 = new JButton("button2");
    button2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    northPanel.add(button2);

    final JCheckBox checkBox1 = new JCheckBox("cb1");
    checkBox1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            CbProcessor cbp = new CbProcessor();
            cbp.dealWithCb(checkBox1.isSelected(), textBox1);
        }
    });
    northPanel.add(checkBox1);

    final JCheckBox checkBox2 = new JCheckBox("cb2");
    checkBox2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            CbProcessor cbp = new CbProcessor();
            cbp.dealWithCb(checkBox2.isSelected(), textBox2);
        }
    });
    northPanel.add(checkBox2);

    textBox1 = new JTextField();
    textBox1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    textBox1.setText("tb1");
    northPanel.add(textBox1);
    textBox1.setColumns(5);

    textBox2 = new JTextField();
    textBox2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    textBox2.setText("tb2");
    northPanel.add(textBox2);
    textBox2.setColumns(5);

    JPanel centerPanel = new JPanel();
    contentPane.add(centerPanel, BorderLayout.CENTER);

    JLabel label1 = new JLabel("label1");
    centerPanel.add(label1);
}

Ответы [ 2 ]

6 голосов
/ 28 сентября 2011

Это тот случай, когда чтение документации WindowBuilder легко ответило бы на ваши вопросы.WindowBuilder будет генерировать код любым удобным для вас способом.Виджеты могут быть локальными переменными, полями или любой их комбинацией.Вы можете управлять областью действия различных виджетов индивидуально или в зависимости от типа (устанавливая значения по умолчанию).Фактически, WindowBuilder обладает невероятно богатым набором настроек генерации кода и может воспроизводить практически любой стиль генерации кода, который вы пожелаете.Он также с радостью проведет реинжиниринг практически любого кода, который вы к нему добавите, так что вы сможете вносить практически любые изменения в сгенерированный код (вручную или с помощью инструмента), и он останется совершенно счастливым.

Swing Code Generation Preferences

Swing Variable Preferences

1 голос
/ 21 сентября 2011

Я ничего не знаю о WindowBuilder, но я кое-что знаю о SWT и SimpleDesktopAplication FrameWorks, но

1) оба основаны на AWT (часть от SWT) и Swing

2) оба переопределяют стандартные методы AWT и Swing

3) в некоторых случаях слишком сложно вернуться к стандартным методам AWT & Swing из методов Framework

Я бы предложил изучить базовые Свинг в начале,

...