调整窗口大小时的GridBagLayout元素行为

Ben*_*oit 1 java swing layout-manager gridbaglayout

我是Java Swing的新手并试图制作一个简单的布局(我想),但是我遇到了很多问题,达到了我想要的行为.这是我的代码:

    setSize(800, 600);       
    setLocationRelativeTo(null);                     
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    equipementPanel.setPreferredSize(new Dimension(275, 300));
    grillePanel.setPreferredSize(new Dimension(300, 600));

    GridBagConstraints c = new GridBagConstraints();

    c.gridx = 0; c.gridy = 0;
    c.anchor = GridBagConstraints.NORTHWEST;
    c.gridwidth = 1; c.gridheight = 1;
    c.weightx = 0.0; c.weighty = 0.0;
    this.add(equipementPanel, c);

    c.fill = GridBagConstraints.BOTH;
    c.gridx = 0; c.gridy = 1;
    c.anchor = GridBagConstraints.SOUTHWEST;
    c.gridwidth = 1; c.gridheight = 2;
    c.weightx = 0.0; c.weighty = 0.0;
    this.add(informationPanel, c);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1; c.gridy = 0;
    c.anchor = GridBagConstraints.NORTHEAST;
    c.weightx = 1.0; c.weighty = 1.0;
    this.add(grillePanel, c);

    c.fill = GridBagConstraints.BOTH;
    c.gridx = 1; c.gridy = 1;
    c.anchor = GridBagConstraints.SOUTHEAST;
    c.weightx = 1.0; c.weighty = 0.0;
    this.add(commandePanel, c);

    this.validate();
Run Code Online (Sandbox Code Playgroud)

我的笔记本电脑的屏幕是我想要的好结果.

  1. equipementPanel =绿色
  2. grillePanel =灰色

在此输入图像描述

但是在我的大屏幕上......它应该是灰色的.红色没关系.

在此输入图像描述

当我缩小规模时,这是一场灾难.

在此输入图像描述

我想要它做的是
灰色不应该有固定的高度和宽度.
黄色应始终具有固定高度但不应具有宽度.
红色应始终具有固定宽度但不应具有高度.绿色应该始终固定.

窗口最小可以设置为绿色+黄色的高度.和绿色的宽度+任何不错的显示.

我知道小窗口的奇怪行为是因为我的尺寸低于300 + 600,但是我需要在某个地方修复一些尺寸!?!?

如果我能用另一种布局达到相同的行为,我很乐意尝试.如果我改变并使用一些ScrollPanel,那会改变什么吗?

我添加了一个mcve: MCVE.JAVA

package mcve;
import java.awt.EventQueue;
public class MCVE {
 /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            mcve.gui.MainWindow mainWindow  = new mcve.gui.MainWindow();
            mainWindow.setVisible(true);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.Java

package mcve.gui;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;

public class MainWindow extends JFrame 
{ 
    public MainWindow() 
    {
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setLayout(new GridBagLayout()); 
        initComponents();
    }

    private void initComponents() 
    {                             
        setSize(800, 600);       
        setLocationRelativeTo(null);                     
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

        GrillePanel grillePanel = new GrillePanel();
        CommandePanel commandePanel = new CommandePanel();
        InformationPanel informationPanel = new InformationPanel();
        EquipementPanel equipementPanel = new EquipementPanel();

        equipementPanel.setPreferredSize(new Dimension(275, 300));
        grillePanel.setPreferredSize(new Dimension(300, 600));

        GridBagConstraints c = new GridBagConstraints();

        c.gridx = 0; c.gridy = 0;
        c.anchor = GridBagConstraints.NORTHWEST;
        c.gridwidth = 1; c.gridheight = 1;
        c.weightx = 0.0; c.weighty = 0.0;
        this.add(equipementPanel, c);

        c.fill = GridBagConstraints.BOTH;
        c.gridx = 0; c.gridy = 1;
        c.anchor = GridBagConstraints.SOUTHWEST;
        c.gridwidth = 1; c.gridheight = 2;
        c.weightx = 0.0; c.weighty = 0.0;
        this.add(informationPanel, c);

        c.fill = GridBagConstraints.HORIZONTAL;
        c.gridx = 1; c.gridy = 0;
        c.anchor = GridBagConstraints.NORTHEAST;
        c.weightx = 1.0; c.weighty = 1.0;
        this.add(grillePanel, c);

        c.fill = GridBagConstraints.BOTH;
        c.gridx = 1; c.gridy = 1;
        c.anchor = GridBagConstraints.SOUTHEAST;
        c.weightx = 1.0; c.weighty = 0.0;
        this.add(commandePanel, c);

        this.validate();
    }    
}
Run Code Online (Sandbox Code Playgroud)

4面板

package mcve.gui;

import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class InformationPanel extends JPanel 
{
    public InformationPanel()
    {
        setBackground(Color.red);
        setBorder(BorderFactory.createLineBorder(Color.black));
        setVisible(true);
    }

}

package mcve.gui;

import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class GrillePanel extends JPanel
{
    public GrillePanel()
    {
        setBackground(Color.lightGray);
        setBorder(BorderFactory.createLineBorder(Color.black));
        setVisible(true);
    }
}

package mcve.gui;

import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class EquipementPanel extends JPanel 
{
    public EquipementPanel()
    {
        setBackground(Color.green);
        setBorder(BorderFactory.createLineBorder(Color.black));
        setVisible(true);
    }

}

package mcve.gui;

import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class CommandePanel extends JPanel 
{
    public CommandePanel()
    {
        setBackground(Color.yellow);
        setBorder(BorderFactory.createLineBorder(Color.black));
        setVisible(true);
    }

}
Run Code Online (Sandbox Code Playgroud)

Mad*_*mer 5

有两个基本问题(我认为)......

一,您试图在单个布局管理器中管理复杂的布局,这在最好的时候非常难.

二,当组件的可用大小低于其首选大小时,你似乎不明白布局管理器会做什么,在这种情况下GridBagLayout,恢复到它的最小大小......

您可以通过使用权重(weightx/ weighty)来克服其中的一部分,但有时,您只需要为最小尺寸提供硬值...

在不知道您的确切需求的情况下(并且您将需要决定哪些组件更重要),这是一个粗略的例子......

在此输入图像描述

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LayoutTest {

    public static void main(String[] args) {
        new LayoutTest();
    }

    public LayoutTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JPanel greenPane = new JPanel() {

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(275, 300);
                    }

                    @Override
                    public Dimension getMinimumSize() {
                        return getPreferredSize();
                    }

                    @Override
                    public Color getBackground() {
                        return Color.GREEN;
                    }

                };
                JPanel redPane = new JPanel() {

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(300, 600);
                    }

                    @Override
                    public Dimension getMinimumSize() {
                        return getPreferredSize();
                    }

                    @Override
                    public Color getBackground() {
                        return Color.RED;
                    }

                };

                JPanel left = new JPanel(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.weightx = 1;
                gbc.weighty = 0.25;
                gbc.fill = GridBagConstraints.BOTH;

                left.add(greenPane, gbc);
                gbc.gridy++;
                gbc.weighty = 0.75;
                left.add(redPane, gbc);

                JPanel yellowPane = new JPanel() {

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(600, 50);
                    }

                    @Override
                    public Dimension getMinimumSize() {
                        return getPreferredSize();
                    }

                    @Override
                    public Color getBackground() {
                        return Color.YELLOW;
                    }

                };

                JPanel grayPane = new JPanel() {

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(400, 600);
                    }

                    @Override
                    public Dimension getMinimumSize() {
                        return getPreferredSize();
                    }

                    @Override
                    public Color getBackground() {
                        return Color.GRAY;
                    }

                };

                JPanel center = new JPanel(new GridBagLayout());
                gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.weightx = 1;
                gbc.weighty = 1;
                center.add(grayPane, gbc);

                gbc.gridy++;
                gbc.weighty = 0;
                center.add(yellowPane, gbc);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(left, BorderLayout.WEST);
                frame.add(center);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)