BoxLayout的容器按组件调整大小

时间:2017-11-30 23:12:30

标签: java swing user-interface layout-manager boxlayout

我目前正在研究一个项目进行学习,我对GUI有一点问题。

以下是一些代码:

private JButton zoomUp, zoomDown;
private JComboBox fractalList;
private JLabel choice,space;
private JPanel ui,display;
private JFrame window;
    public FractalView(FractalModel m, FractalController c, String title, int size_X, int size_Y)
    { 
    window =new JFrame();
    window.setTitle(title);
    window.setSize(size_X,size_Y);
    window.setLocationRelativeTo(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setResizable(false);
    window.setLayout(new GridBagLayout());


    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor=GridBagConstraints.FIRST_LINE_START;

    ui=new JPanel();        
    ui.setBackground(Color.GRAY);
    ui.setBorder(BorderFactory.createTitledBorder("Interface de Controle et Options"));
    BoxLayout uiLayout = new BoxLayout(ui, BoxLayout.PAGE_AXIS);
    ui.setLayout(uiLayout);
    ui.setMaximumSize(ui.getPreferredSize());

    zoomUp = new JButton("Zoom +");
    zoomUp.setAlignmentX(LEFT_ALIGNMENT);
    zoomUp.setBorder(BorderFactory.createLineBorder(Color.RED));
    ui.add(zoomUp);
    zoomDown = new JButton("Zoom -");
    //ui.add(zoomDown);
    choice = new JLabel("Choisir une fractale : ");
    //ui.add(choice);
    Object[] elements = new Object[]{"Mandelbrot", "Julia", "Buddhabrot"};
    fractalList = new JComboBox<Object>(elements);
    //fractalList.setBorder(BorderFactory.createLineBorder(Color.RED));
    fractalList.setAlignmentX(LEFT_ALIGNMENT);
    fractalList.setMaximumSize(new Dimension(Short.MAX_VALUE,20));
    //ui.add(fractalList);



    gbc.weighty=1;
    gbc.ipadx=300;
    gbc.gridheight=1;
    gbc.fill=GridBagConstraints.VERTICAL;
    gbc.gridx=0;
    gbc.gridy=0;

    window.add(ui,gbc);

    display=new JPanel();
    display.setBackground(Color.RED);
    gbc.weightx=1;
    gbc.gridheight=1;
    gbc.gridwidth=1;
    gbc.fill=GridBagConstraints.BOTH;
    gbc.gridx=1;
    gbc.gridy=0;
    window.add(display,gbc);
    window.setVisible(true);
    }

问题来自JPanel ui。只要它是空的,尺寸就是所希望的。但是当我添加任何组件时,它的重量会增加。

我尝试使用setMaxSize(),但即使它已调整大小,这可能会导致我想在JPanel display上显示的内容出现问题。我宁愿再次避免使用GridBagLayout

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

如果您只想拆分框架并且不想与GridBagLayout战斗,您可以使用BorderLayout。

然后,将一个面板添加到BorderLayout.WEST,将另一个面板添加到BorderLayout.EAST位置。并记得调用setPreferredSize来修复所需的宽度和高度。

我对您的代码进行了一些更改。看看:

public class TestFrame {
    private JButton zoomUp, zoomDown;
    private JComboBox fractalList;
    private JLabel choice, space;
    private JPanel ui, display;
    private JFrame window;

    public TestFrame(String title, int size_X, int size_Y) {
        window = new JFrame();
        window.setTitle(title);
        window.setSize(size_X, size_Y);
        window.setLocationRelativeTo(null);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        window.setLayout(new BorderLayout());

        ui = new JPanel();
        ui.setPreferredSize(new Dimension(size_X/2,size_Y));
        ui.setBackground(Color.GRAY);
        ui.setBorder(BorderFactory.createTitledBorder("Interface de Controle et Options"));
        BoxLayout uiLayout = new BoxLayout(ui, BoxLayout.PAGE_AXIS);
        ui.setLayout(uiLayout);

        zoomUp = new JButton("Zoom +");
        // zoomUp.setAlignmentX(LEFT_ALIGNMENT);
        zoomUp.setBorder(BorderFactory.createLineBorder(Color.RED));
        ui.add(zoomUp);
        zoomDown = new JButton("Zoom -");
         ui.add(zoomDown);
        choice = new JLabel("Choisir une fractale : ");
         ui.add(choice);
        Object[] elements = new Object[] { "Mandelbrot", "Julia", "Buddhabrot" };
        fractalList = new JComboBox<Object>(elements);
        // fractalList.setBorder(BorderFactory.createLineBorder(Color.RED));
        // fractalList.setAlignmentX(LEFT_ALIGNMENT);
        fractalList.setMaximumSize(new Dimension(Short.MAX_VALUE, 20));
         ui.add(fractalList);

        window.add(ui, BorderLayout.WEST);

        display = new JPanel();
        display.setBackground(Color.RED);
        display.setPreferredSize(new Dimension(size_X/2,size_Y));

        window.add(display, BorderLayout.EAST);
        window.setVisible(true);
    }

    public static void main(String[] args) {
        new TestFrame("test of BorderLayout with WEST and EAST", 800, 600);
    }
}

如果你需要比这更复杂的东西,你可以选择miglayout