【问题标题】:How to insert JPanel beside a grid?如何在网格旁边插入 JPanel?
【发布时间】:2015-03-02 11:44:57
【问题描述】:

我刚刚使用(Java Swing 库)构建了这个网格,代码如下:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class TestGrid02 extends JPanel {

   private static final long serialVersionUID = 1L;

   protected static final Color SELECTION_COLOR = Color.red;
   private JPanel selectedPanel = null;
   private Color originalColor = new Color(238,238,238) ;
   private static final Dimension PREF_SIZE = new Dimension(50, 50);
   public JPanel panel;
   public JPanel panel_1;
   public JFrame frame;



   public TestGrid02() {

    createMap(10,10);

   }


   public void createMap(int maxX,int maxY) {    

       String [ ][ ] map = new String [maxX][maxY];

      for (int i = 0; i < maxX; i++) {

          for (int j = 0; j < maxY ; j++) {
              map [i][j] = "["+ i + ","+  j +"]";


          JPanel panel = new JPanel();
              add(panel);
              panel.setPreferredSize(PREF_SIZE);
              String name = String.format("[%d, %d]",  i, j);
              setLayout(new GridLayout(maxX,maxY, 1, 1));
              setBackground(Color.GRAY);
              panel.setName(name);

              System.out.println( map [i][j]); 
          }
      }

      addMouseListener(new MouseAdapter() {
          @Override
          public void mousePressed(MouseEvent e) {
             JPanel panel = (JPanel) getComponentAt(e.getPoint());

             if (panel == null || panel == TestGrid02.this) {
                return;
             }

             if (selectedPanel != null) {
                selectedPanel.setBackground(originalColor);
                selectedPanel.removeAll();
                selectedPanel.revalidate();
                selectedPanel.repaint();
             }

             selectedPanel = panel;
             selectedPanel.setBackground(SELECTION_COLOR);
             selectedPanel.add(new JLabel(selectedPanel.getName()));
             selectedPanel.revalidate();
             selectedPanel.repaint();
          }
       });

  }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("Astar");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new TestGrid02());
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);     
      frame.pack();


   }

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

但我想要添加另一个JPanel 到网格的“东”,其中包含例如 2 个文本区域和 1 个按钮,例如这张图片 - [1]: p>

我已经尝试添加另一个面板,但它出现在网格的顶部。我该如何解决这个问题?

【问题讨论】:

  • “如何解决这个问题?” 合并布局。对按钮使用GridLayout,然后将该面板添加到具有另一种布局的(新的第二个面板)中。将您的另一个面板添加到第二个面板。

标签: java swing jpanel layout-manager grid-layout


【解决方案1】:

这可以通过组合布局来实现。对按钮使用GridLayout,然后将该面板添加到具有另一种布局的(新的第二个面板)中。将您的另一个面板添加到第二个面板。此示例为每个主面板设置不同的颜色以显示它们如何协同工作。

请注意,对于该屏幕截图,我将面板网格设置为一半大小。

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

public class TestGrid02  {

    private static final Dimension PREF_SIZE = new Dimension(50, 50);
    private JPanel ui;
    private JPanel gameGrid;

    public TestGrid02() {
        initUI();
    }

    private final void initUI() {
        ui = new JPanel(new BorderLayout(5, 5));
        ui.setBackground(Color.YELLOW);
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));
        createMap(10, 10);
        ui.add(gameGrid);

        JPanel controlsConstrain = new JPanel(new BorderLayout(4, 4));
        ui.add(controlsConstrain, BorderLayout.LINE_END);
        controlsConstrain.setBackground(Color.GREEN);

        JPanel controls = new JPanel(new GridLayout(0, 1, 0, 25));
        controlsConstrain.add(controls, BorderLayout.PAGE_START);
        controls.setBackground(Color.CYAN);
        controls.setBorder(new EmptyBorder(40, 20, 20, 20));
        controls.add(new JTextField(10));
        controls.add(new JTextField(10));
        controls.add(new JButton("OK"));
    }

    public void createMap(int maxX, int maxY) {
        gameGrid = new JPanel(new GridLayout(maxX, maxY, 1, 1));
        gameGrid.setBackground(Color.RED);

        for (int i = 0; i < maxX; i++) {

            for (int j = 0; j < maxY; j++) {
                JPanel panel = new JPanel();
                panel.setPreferredSize(PREF_SIZE);
                String name = String.format("[%d, %d]", i, j);
                panel.setName(name);
                gameGrid.add(panel);
            }
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("Astar");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TestGrid02().getUi());
        // this was being called at the wrong time, but ..
        // frame.setLocationRelativeTo(null);
        // ..better to..
        frame.setLocationByPlatform(true);
        frame.pack();
        frame.setVisible(true);  // should be last.
    }

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

    public JPanel getUi() {
        return ui;
    }
}

【讨论】:

    【解决方案2】:

    尝试使用BorderLayout。像这样的东西(我没有测试过,但你可以从这里开始并自己继续):

    public TestGrid02() {
        setLayout(new BorderLayout());
        JPanel centerPanel = new JPanel();
        add(centerPanel, BorderLayout.CENTER);
        createMap(centerPanel, 10,10);
        add(otherPanel, BorderLayout.EAST); // otherPanel contains your buttons, text fields, etc.
    }
    

    并在createMap方法改变:

    add(panel);
    

    作者:

    centerPanel.add(panel);
    

    【讨论】:

    • 我遵循了您的解决方案,但 centerPanel 向下移动,而另一个面板向上移动
    • 也许这个setLayout(new GridLayout(maxX,maxY, 1, 1));应该是panel.setLayout(new GridLayout(maxX,maxY, 1, 1));
    猜你喜欢
    • 1970-01-01
    • 2018-02-26
    • 2014-08-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多