Как настроить размер сетки после изменения размера рамки? - PullRequest
1 голос
/ 28 мая 2011

Мне было интересно следующее: у меня есть компонент MainWindow (который содержит фрейм (JFrame)) и несколько других JPanels.Где один JPanel, скажем, gridPanel использует gridLayout в качестве LayoutManager.Теперь моя проблема в том, что я хочу настроить (установить размер строк / установить размер столбцов) после изменения размера окна.Может кто-нибудь сказать мне, как я могу выполнить действия, которые могут быть вызваны после изменения размера фрейма, поскольку я не знаком с вовлеченными слушателями.

Это должно быть сделано на большинстве "стандартных" практик кодирования.Спасибо за ваш ответ и ответы!

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Если вы хотите, чтобы ваша сетка «заполняла» контейнер или заполняла JFrame, тогда ключом является использование правильных менеджеров компоновки для хранения контейнера, использующего GridLayout.Например, если вы добавите контейнер, использующий GridLayout, в другой контейнер, который использует FlowLayout, то контейнер, использующий GridLayout, не изменит размер, если его контейнер-хранилище изменит размер.Однако если вы добавите контейнер, использующий GridLayout, в другой контейнер, который использует BorderLayout, и в его положение BorderLayout.CENTER, то контейнер, использующий GridLayout, изменит размер, так как размер родительского контейнера, использующего BorderLayout, изменится.

Пример:

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 .

0 голосов
/ 28 мая 2011

Вот почему я хотел настроить только столбцы.

Возможно Wrap Layout - это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...