调整框架大小后如何调整网格尺寸?

时间:2011-05-28 12:35:09

标签: java swing resize frame grid-layout

我想知道以下内容:我有一个MainWindow组件(包含一个框架(JFrame))和其他几个JPanel。在一个JPanel中,让我们说gridPanel使用gridLayout作为LayoutManager。现在我的问题是我想在调整窗口大小后调整(设置行的大小/设置列的大小)。有人能告诉我如何在调整框架大小后实现可以触发的动作,因为我不熟悉所涉及的听众。

应该在最“标准”的编码实践上完成。感谢您的回复和答案!

2 个答案:

答案 0 :(得分:2)

如果您希望网格“填满”容器,或填满JFrame,那么关键是使用适当的布局管理器来保存GridLayout使用容器。例如,如果将GridLayout使用容器添加到另一个使用FlowLayout的容器中,那么使用GridLayout的容器在其容器容器更改大小时不会更改大小。但是,如果将GridLayout使用容器添加到另一个使用BorderLayout及其BorderLayout.CENTER位置的容器中,则随着使用BorderLayout的父容器调整大小,GridLayout-using容器将调整大小。

示例:

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ExpandingGrid extends JPanel {
   private static final int GAP = 5;

   public ExpandingGrid() {

      // create a BorderLayout-using JPanel
      JPanel borderLayoutPanel = new JPanel(new BorderLayout());
      borderLayoutPanel.setBorder(BorderFactory.createTitledBorder("BorderLayout Panel"));
      borderLayoutPanel.add(createGridPanel(), BorderLayout.CENTER); // add a Grid to it

      // create a FlowLayout-using JPanel
      JPanel flowLayoutPanel = new JPanel(new FlowLayout());
      flowLayoutPanel.setBorder(BorderFactory.createTitledBorder("FlowLayout Panel"));
      flowLayoutPanel.add(createGridPanel()); // add a grid to it

      // set up the main JPanel 
      setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      setLayout(new GridLayout(1, 0, GAP, 0)); // grid with 1 row
      // and add the borderlayout and flowlayout using JPanels to it
      add(borderLayoutPanel);
      add(flowLayoutPanel);
   }

   // create a JPanel that holds a bunch of JLabels in a GridLayout
   private JPanel createGridPanel() {
      int rows = 5;
      int cols = 5;
      JPanel gridPanel = new JPanel(new GridLayout(rows, cols));
      for (int i = 0; i < rows; i++) {
         for (int j = 0; j < cols; j++) {
            // create the JLabel that simply shows the row and column number
            JLabel label = new JLabel(String.format("[%d, %d]", i, j),
                     SwingConstants.CENTER);
            // give the JLabel a border
            label.setBorder(BorderFactory.createEtchedBorder());
            gridPanel.add(label); // add to the GridLayout using JPanel
         }
      }
      return gridPanel;
   }

   private static void createAndShowUI() {
      JFrame frame = new JFrame("ExpandingGrid");
      frame.getContentPane().add(new ExpandingGrid());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

此外,如果这没有帮助,那么您可能希望详细说明您的问题并发布代码,最好是SSCCE

答案 1 :(得分:0)

  

这就是为什么我只想调整列。

也许Wrap Layout正是您所寻找的。