Проблема с версией Swing - PullRequest
       12

Проблема с версией Swing

1 голос
/ 27 января 2010

Здравствуйте, я хотел бы получить этот макет свинга внутри JPanel:

JLabel - JTextField - JComboBox

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

Ответы [ 3 ]

5 голосов
/ 27 января 2010

Если у вас есть три компонента и вы хотите, чтобы один в середине расширялся, вы можете, например, использовать BorderLayout, поставить JLabel на BorderLayout.WEST , JComboBox на BorderLayout.EAST и тот, который вы хотите расширить (JTextField) в BorderLayout.CENTER .

Следующее уродливо, но намерение быть минимальным, но показать желаемое поведение:

public class Gotch {
    public static void main( String[] args ) {
        JFrame main = new JFrame();
        JPanel p = new JPanel();
        p.setLayout( new BorderLayout() );
        p.add( new JLabel( "test" ), BorderLayout.WEST );
        p.add( new JTextField( "growable" ), BorderLayout.CENTER );
        p.add( new JComboBox(), BorderLayout.EAST );
        main.add( p );
        main.pack();
        main.setVisible( true );
    }
}
3 голосов
/ 28 января 2010

Думал, что выложу некоторый код, как это сделать с помощью GridBagLayout. Может быть полезно, когда у вас есть что-то, что не совсем подходит для BorderLayout, что часто бывает при создании GUI.

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JFrame frame = new JFrame("GridBagLayout Demo");
        frame.setLayout(new GridBagLayout());

        JLabel label = new JLabel("Demo Label");
        JTextField textField = new JTextField("Demo Text");
        JComboBox comboBox = new JComboBox(new String[] {"hello", "goodbye", "foo"});

        GridBagConstraints cons = new GridBagConstraints();
        cons.insets = new Insets(10, 10, 10, 10);
        frame.add(label, cons);

        cons.gridx = 1;
        cons.weightx = 1;
        cons.weighty = 1;
        cons.insets = new Insets(10, 0, 10, 10);
        cons.fill = GridBagConstraints.HORIZONTAL;

        frame.add(textField, cons);

        cons.gridx = 2;
        cons.weightx = 0;
        cons.weighty = 0;
        cons.insets = new Insets(10, 0, 10, 10);
        cons.fill = GridBagConstraints.NONE;

        frame.add(comboBox, cons);

        frame.pack();
        frame.setVisible(true);
    }
}
1 голос
/ 27 января 2010

Расширение Box - хорошая альтернатива:

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MyPanel extends Box {

    public MyPanel(int axis) {
        super(axis);
        this.setPreferredSize(new Dimension(320, 240));
        JLabel lb = new JLabel("label");
        lb.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        this.add(lb);
        JTextField tf = new JTextField("field");
        this.add(tf);
        String [] items = { "One", "Two", "Three" };
        JComboBox c = new JComboBox(items);
        c.setMaximumSize(new Dimension(100, Short.MAX_VALUE));
        this.add(c);
    }

    private static void create() {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            MyPanel p = new MyPanel(BoxLayout.Y_AXIS);
            f.add(p);
            f.pack();
            f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                create();
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...