Как лучше всего выложить эти компоненты в Swing? - PullRequest
5 голосов
/ 09 января 2009

Каков наилучший подход / LayoutManager для JPanel, который необходим для отображения компонентов, показанных на изображении? (Обратите внимание, что при изменении размера окна поля должны изменяться по горизонтали, но не надписи).

В настоящее время я пытаюсь (и изо всех сил) сделать это с помощью GridBagLayout. Это правильный подход или есть лучший способ? Должен ли я пытаться разделить + покорить отдельные секции, может быть?

Будем благодарны за любые мысли или советы. : -)

http://img261.imageshack.us/img261/2091/layouthb6.png

PS Если вы читаете это, а изображения нет, пожалуйста, потерпите меня, пока я это исправлю!

Ответы [ 13 ]

11 голосов
/ 09 января 2009

Я бы посмотрел на вложенность JPanels. Было бы очень легко сделать каждую строку отдельной JPanel, а затем просто сложить JPanels.

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

Используя GridBagLayout, вы можете расположить строку, увеличив значения GridBagConstraint.gridx, а затем сбросив GridBagConstraint.gridx = 0 и GridBagConstraint.gridy++ для перехода к следующей строке.

4 голосов
/ 09 января 2009

Я бы предложил сторонний бесплатный менеджер макетов. MigLayout приходит на ум (см. Пример формы внизу связанной страницы) или JGoodies FormLayout , что особенно хорошо для подобных форм.

Стандартные менеджеры компоновки хороши, но, к сожалению, не подходят для частого использования таких экранов (новый GroupLayout, используемый дизайнером Matisse в Netbeans, не был создан даром). Связанные менеджеры компоновки намного проще в использовании и поддержании IMHO.

2 голосов
/ 12 января 2009

Я бы определенно использовал DesignGridLayout :

DesignGridLayout layout = new DesignGridLayout(this);
layout.row().grid(label0).add(field0);
layout.emptyRow();
layout.row().grid(label1).add(field1);
layout.row().grid(label2).add(field2);
layout.row().grid(label3).add(field3);
layout.row().grid(label4).add(field4);
layout.emptyRow();
layout.row().grid(label5).add(field5).grid(label6).add(field6);
layout.row().grid(label7).add(field7).grid(label8).add(field8);
layout.emptyRow();
layout.row().grid(label9).add(field9);

Отказ от ответственности: я один из авторов DesignGridLayout.

1 голос
/ 09 января 2009

Я лично предпочитаю GroupLayout .

Даже если вы не используете GUI Builder, вы можете использовать макет вручную, и с ним довольно просто и просто работать, если вы понимаете концепции.

1 голос
/ 09 января 2009

Если вы можете использовать внешний код, взгляните на JGoodies менеджеры по расположению.

Лично я считаю, что GridBagLayout доставляет больше хлопот, чем стоит - в той степени, в которой я написал свои собственные менеджеры компоновки, чтобы избежать этого.

0 голосов
/ 17 апреля 2009

Вы можете описать макет в виде таблицы HTML, а затем использовать этот инструмент: http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy

Чтобы перевести макет в код Java для настройки GridBagLayout.

0 голосов
/ 23 января 2009

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

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

Если вы можете использовать IDE, это действительно может упростить ситуацию (например, Матисс в NetBeans).

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class GridBagLayoutTest extends JPanel {

    public GridBagLayoutTest() {
        setLayout(new GridBagLayout());
        addToLayout(new JLabel(     "Label 0" ), 0, 0, 0d, 1);
        addToLayout(new JTextField( "Field 0" ), 0, 1, 1d, 4);
        addToLayout(new JLabel(     "*"       ), 0, 5, 0d, 1);
        addToLayout(new JPanel()               , 1, 0, 0d, 1);
        addToLayout(new JLabel(     "Label 1" ), 2, 0, 0d, 1);
        addToLayout(new JTextField( "Field 1" ), 2, 1, 1d, 4);
        addToLayout(new JLabel(     "*"       ), 2, 5, 0d, 1);
        addToLayout(new JLabel(     "Label 2" ), 3, 0, 0d, 1);
        addToLayout(new JTextField( "Field 2" ), 3, 1, 1d, 1);
        addToLayout(new JLabel(     "*"       ), 3, 2, 0d, 1);
        addToLayout(new JLabel(     "Label 3" ), 3, 3, 0d, 1);
        addToLayout(new JTextField( "Field 3" ), 3, 4, 1d, 1);
        addToLayout(new JLabel(     "*"       ), 3, 5, 0d, 1);
    }

    private void addToLayout(java.awt.Component comp, int y, int x, double weightx, int gridwidth) {
        add(comp, new GridBagConstraints(x, y, gridwidth, 1, weightx, 0d,
                                         GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                                         new java.awt.Insets(2, 4, 2, 4), 0, 0 ) );
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new GridBagLayoutTest());
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
}
0 голосов
/ 11 января 2009

GridBagLayout, конечно.

Если форма именно такая, значит, вам нужно более одного JPanel. (Если у вас есть кнопки, вам, вероятно, понадобится еще одна, в зависимости от того, где / как они находятся)

В полях 0 - 4 и 9 gridwidth будет установлено на 4, другие по умолчанию (1, но вам не нужно устанавливать его на 1)

«Пробелы» между группами полей могут быть достигнуты через вставки.

(по крайней мере, для этого макета) я бы не стал предлагать сторонние менеджеры макетов. GridBagLayout не сложно. Требуется (немного) время, чтобы привыкнуть к этому.

Визуальный редактор + Eclipse может сделать это для вас легко. (Мне не очень комфортно с Netbeans и его развитием свинга. Пробовал, но никогда не влюблялся. Может быть, я слишком увлечен Eclipse)

0 голосов
/ 10 января 2009

GridBagLayout , безусловно, лучший выбор для этого. И NetBeans Матисс , вероятно, является самым быстрым способом достижения этого. Если вы используете другую IDE, просто скопируйте и вставьте автоматически сгенерированный код.

0 голосов
/ 10 января 2009

Начиная с Java SE 6 вы можете использовать GroupLayout

Это очень просто и выглядит так, как вы хотите.

Для этого окна:

альтернативный текст http://img165.imageshack.us/img165/8237/sampleusinggrouplayoutca2.png

У меня есть этот код:

    // Layout the components using the new GroupLayout added
    // in java 1.6.
    // Adding to the main frame
    private void layoutComponents(){
        JPanel panel = new JPanel();

        GroupLayout layout = new GroupLayout(panel);
        panel.setLayout(layout);

        layout.setAutoCreateGaps(true);         
        layout.setAutoCreateContainerGaps(true);

        SequentialGroup hGroup = layout.createSequentialGroup();

        JLabel nameLbl  = new JLabel("Name");
        JLabel countLbl = new JLabel("Amount");
        JLabel dateLbl  = new JLabel("Date(dd/MM/yy)");
        hGroup.addGroup(layout.createParallelGroup().
                addComponent(nameLbl).
                addComponent(countLbl).
                addComponent(dateLbl).
                addComponent(go));

        hGroup.addGroup(layout.createParallelGroup().
                addComponent(name).
                addComponent(count).
                addComponent(date));

        layout.setHorizontalGroup(hGroup);

        SequentialGroup vGroup = layout.createSequentialGroup();

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(nameLbl).
                addComponent(name));

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(countLbl).
                addComponent(count));

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(dateLbl).
                addComponent(date));

        vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
                addComponent(go));
        layout.setVerticalGroup(vGroup);

        frame.add( panel , BorderLayout.NORTH );
        frame.add( new JScrollPane( textArea ) );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...