2013-09-11 3 views
3

Спустя почти 4 года в программировании на Java я решил научиться писать классы GUI самостоятельно, так как до сих пор я всегда использовал редактор графического редактора NetBeans (я не особенно этому горжусь, но он работал довольно хорошо, избегая меня беспокоиться о компоновке компонентов).GroupLayout сгенерированный код в NetBeans

Дело в том, что я следую How to Use GroupLayout учебным пособиям, чтобы узнать об этом менеджере макетов, который я нахожу очень мощным. Теперь я сделал небольшой пример по своему усмотрению, а затем попытаюсь сделать то же самое в редакторе графических сред Netbeans, и обнаружил некоторые различия между обоими кодами, и я хотел бы знать, что я что-то упустил, или NetBeans просто добавляет бесполезный код в определение GroupLayout ,

Это моя цель:

enter image description here

Это мой SSCCE:

public static void main(String[] args) {   
    JLabel label = new JLabel("This is a test"); 
    label.setFont(new Font("Segoe UI Semibold", Font.BOLD | Font.ITALIC, 24)); 

    JSeparator separator = new JSeparator(JSeparator.HORIZONTAL); 

    DefaultListModel model = new DefaultListModel(); 
    model.addElement("Apple"); 
    model.addElement("Orange"); 
    model.addElement("Kiwi"); 
    model.addElement("Watermelon"); 

    JList list = new JList(model); 
    list.setPreferredSize(new Dimension(400, 300)); 
    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.setViewportView(list); 

    JFrame frame = new JFrame("Test"); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 


    Container contentPane = frame.getContentPane();   
    GroupLayout layout = new GroupLayout(contentPane); 
    layout.setAutoCreateContainerGaps(true); 
    contentPane.setLayout(layout); 

    layout.setHorizontalGroup(
      layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
       .addComponent(label, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) 
       .addComponent(separator) 
       .addComponent(scrollPane) 
      );   
    layout.setVerticalGroup(
      layout.createSequentialGroup() 
       .addComponent(label) 
        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(separator, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) 
        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) 
        .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)    
     );   
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

Как вы можете видеть, что я только определил paralell группу в качестве горизонтальной группы и последовательной группы как по вертикали группа. Но Netbeans автогенерирует этот код:

layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) 
       .addComponent(label, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) 
       .addComponent(separator) 
       .addComponent(scrollPane)) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(label) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(separator, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 224, Short.MAX_VALUE) 
      .addContainerGap()) 
    ); 

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

+4

Просто комментарий: GroupLayout предназначен для использования с строителем, поэтому его трудно использовать с ручным кодированием. Мое предложение состояло в том, чтобы использовать LayoutManager, который предназначен для удобства использования в ручном коде, один из Big Three: MigLayout, FormLayout, DesignGridBagLayout. – kleopatra

+1

+1 для sscce; обратите внимание, что они имеют разные изменения размера. – trashgod

+0

Спасибо за комментарии! Я посмотрю на других менеджеров компоновки, потому что, да, это трудно использовать с помощью ручной кодировки. @trashgod, вы правы в изменении поведения. Раньше я этого не замечал. В частности, мне не нравится очень сильно изменять размеры, если это не будет строго необходимо f.e. большие столы или что-то, что может потребовать много места. Это только мои предпочтения. – dic19

ответ

6

Престижность применения дизайнера GUI NetBeans как средства для - и не подмены для понимания Swing. Суммируя комментарии,

  • GroupLayout Хотя был разработан для автоматической генерации кода, то можно с пользой использовать вручную, как показано here и here. Он также может быть интегрирован в предлагаемый смешанный подход к разработке here.

  • Опытные разработчики разумно предполагают изучение одного или более популярных форматов сторонних такие как MigLayout, FormLayout или DesignGridLayout, которые вытекают некоторые силы от принятия человеческих считываемых параметров текста. Я вижу GroupLayout в той же категории, но просто имеет fluent interface.

  • В вашем примере два макета имеют различное изменение размера, что может повлиять на другие варианты. Опасайтесь этого общего pitfall.

+1

Большое спасибо за ваше время. У меня есть много, чтобы прочитать здесь, и это очень полезно. Особенно отзыв об изменении размера;) – dic19

Смежные вопросы