Java GridBagLayout调整大小和固定大小

时间:2014-01-28 23:42:30

标签: java swing gridbaglayout

这就是我想要实现的目标

------------------------| 150px |
|                       | width |
|                       |   p2  |
|                       |       |
|      Fill frame       |       |
|      p1               |       |
|                       |       |
|                       |       |
------------------------|       |
150px height            |       |
|       p3              |       |
---------------------------------

“填充帧”必须缩放动态,但其他两个正方形具有固定的宽度/高度。

我的代码确实产生了这种布局,但是p1没有缩放以填满整个帧。 有人可以告诉我如何使p1动态吗?

提前致谢。

这是我到目前为止所做的:

    setTitle(Rolit.TITLE);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    mainPanel = new JPanel();
    mainPanel.setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();

//P1    FILL P1 WITH 64 BUTTONS
    p1 = new JPanel();
    p1.setLayout(new GridLayout(8, 8));

    p1.setMinimumSize(new Dimension(600, 600));
    p1.setMaximumSize(new Dimension(600, 600));
    p1.setPreferredSize(new Dimension(600, 600));

    for(int y = 0; y < 8; y++){
        for(int x = 0; x < 8; x++){
            JButton btn = new JButton(x + " , " + y);
            p1.add(btn);
        }
    }

//P2    FILL P2 WITH 4 BUTTONS
    p2 = new JPanel();
    p2.setLayout(new GridLayout(4, 1));
    p2.setMinimumSize(new Dimension(150, 100));
    p2.setMaximumSize(new Dimension(150, 100));
    p2.setPreferredSize(new Dimension(150, 100));

    for(int i = 0; i < 4; i++){
        p2.add(new JButton("Button"));
    }

//P3
    p3 = new JPanel();
    p3.setMinimumSize(new Dimension(100, 150));
    p3.setMaximumSize(new Dimension(100, 150));
    p3.setPreferredSize(new Dimension(100, 150));
    p3.setBackground(Color.BLUE);


//ADD ALL TO mainPanel

    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.BOTH; 
    mainPanel.add(p1, c);        

    c.gridx = 1;
    c.gridheight = 2;  
    c.fill = GridBagConstraints.VERTICAL;
    mainPanel.add(p2, c);

    c.gridx = 0;
    c.gridy = 1;
    c.gridheight = 1;        
    c.gridwidth = 2;
    c.fill = GridBagConstraints.HORIZONTAL;
    mainPanel.add(p3, c);

    setContentPane(mainPanel);
    pack();
    setLocationRelativeTo(null);
    setVisible(true);

2 个答案:

答案 0 :(得分:3)

您需要为weightx提供weightyGridBagConstraints值,这些值会影响各个组件对父容器大小变化的响应以及占用的“重量”在给定的单元格内

请查看How to use GridBagLayout了解详情

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

public class TestGridBagLayout {

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

    private JPanel mainPanel;
    private JPanel p1;
    private JPanel p2;
    private JPanel p3;

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

                mainPanel = new JPanel();
                mainPanel.setLayout(new GridBagLayout());
                GridBagConstraints c = new GridBagConstraints();

                //P1    FILL P1 WITH 64 BUTTONS
                p1 = new JPanel();
                p1.setLayout(new GridLayout(8, 8));

                p1.setMinimumSize(new Dimension(600, 600));
                p1.setMaximumSize(new Dimension(600, 600));
                p1.setPreferredSize(new Dimension(600, 600));

                for (int y = 0; y < 8; y++) {
                    for (int x = 0; x < 8; x++) {
                        JButton btn = new JButton(x + " , " + y);
                        p1.add(btn);
                    }
                }

                //P2    FILL P2 WITH 4 BUTTONS
                p2 = new JPanel();
                p2.setLayout(new GridLayout(4, 1));
                p2.setMinimumSize(new Dimension(150, 100));
                p2.setMaximumSize(new Dimension(150, 100));
                p2.setPreferredSize(new Dimension(150, 100));

                for (int i = 0; i < 4; i++) {
                    p2.add(new JButton("Button"));
                }

                //P3
                p3 = new JPanel();
                p3.setMinimumSize(new Dimension(100, 150));
                p3.setMaximumSize(new Dimension(100, 150));
                p3.setPreferredSize(new Dimension(100, 150));
                p3.setBackground(Color.BLUE);

                //ADD ALL TO mainPanel
                c.gridx = 0;
                c.gridy = 0;
                c.fill = GridBagConstraints.BOTH;
                c.weightx = 1;
                c.weighty = 1;
                mainPanel.add(p1, c);

                c.gridx = 1;
                c.gridheight = 2;
                c.weighty = 1;
                c.weightx = 0;
                c.fill = GridBagConstraints.VERTICAL;
                mainPanel.add(p2, c);

                c.gridx = 0;
                c.gridy = 1;
                c.gridheight = 1;
                c.gridwidth = 2;
                c.fill = GridBagConstraints.HORIZONTAL;
                c.weighty = 0;
                c.weightx = 1;
                mainPanel.add(p3, c);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(mainPanel);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

答案 1 :(得分:3)

我会考虑使用使用BorderLayouts的嵌套JPanel。例如:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class EmielGui extends JPanel {
   protected static final int DELTA_DIMEN = 1;
   protected static final int MAX_DIMEN = 600;
   private static final int DELAY = 20;
   private JPanel rightPanel = new JPanel();
   private JPanel bottomPanel = new JPanel();
   private JPanel centerPanel = new JPanel();
   private int dimen = 100;

   public EmielGui() {
      JPanel tempCenterPanel = new JPanel(new BorderLayout());
      tempCenterPanel.add(centerPanel, BorderLayout.CENTER);
      tempCenterPanel.add(bottomPanel, BorderLayout.SOUTH);

      setLayout(new BorderLayout());
      add(rightPanel, BorderLayout.EAST);
      add(tempCenterPanel, BorderLayout.CENTER);

      rightPanel.setMinimumSize(new Dimension(150, 0));
      bottomPanel.setMinimumSize(new Dimension(0, 150));

      rightPanel.setPreferredSize(rightPanel.getMinimumSize());
      bottomPanel.setPreferredSize(bottomPanel.getMinimumSize());

      rightPanel.setBorder(BorderFactory.createLineBorder(Color.red));
      bottomPanel.setBorder(BorderFactory.createLineBorder(Color.blue));
      centerPanel.setBorder(BorderFactory.createLineBorder(Color.green));

      new Timer(DELAY, new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            dimen += DELTA_DIMEN;
            if (dimen < MAX_DIMEN) {
               centerPanel.setPreferredSize(new Dimension(dimen, dimen));
               SwingUtilities.getWindowAncestor(EmielGui.this).pack();

            } else {
               ((Timer) e.getSource()).stop();
            }
         }
      }).start();
   }

   private static void createAndShowGui() {
      EmielGui mainPanel = new EmielGui();

      JFrame frame = new JFrame("EmielGui");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}