java - BorderLayout 的作用类似于流式布局

标签 java user-interface border-layout

我很难弄清楚为什么这个边框布局仍然像流布局一样......

我先尝试了这个:

JPanel canvas = new JPanel(new BorderLayout());
add(canvas);

text = new JLabel("hey");
canvas.add(text, BorderLayout.SOUTH);

然后我尝试了这个:

JPanel canvas = new JPanel(new BorderLayout());
add(canvas)
JPanel canvasSouth = new JPanel(new BorderLayout());
canvas.add(canvasSouth, BorderLayout.SOUTH);

text = new JLabel("hey");
canvasSouth.add(text);

然后我说管它呢,我就这样把一切都扔掉:

    JPanel canvas = new JPanel(new BorderLayout());
    add(canvas);

    JPanel canvasSouth = new JPanel(new BorderLayout());
    canvas.add(canvasSouth, BorderLayout.SOUTH);

    JPanel canvasNorth = new JPanel(new BorderLayout());
    canvas.add(canvasNorth, BorderLayout.NORTH);

    JPanel canvasEast = new JPanel(new BorderLayout());
    canvas.add(canvasEast, BorderLayout.EAST);

    JPanel canvasWest = new JPanel(new BorderLayout());
    canvas.add(canvasWest, BorderLayout.WEST);

    text = new JLabel("hey");
    canvasSouth.add(text);

我以前也遇到过这个问题,但始终无法自行解决。因此我向大家询问。谢谢。

最佳答案

这个问题是一个复合问题...

  1. 您将 canvas 添加到仍然使用 FlowLayoutJPanel,后者将使用 canvas' s preferredSize 确定如何最好地布局
  2. 您要将空的 JPanel 添加到 BorderLayout 的所有位置,因为它们的默认 preferredSize0x0 ,就像您根本没有添加任何内容一样。因此,唯一向 canvas 及其父容器提供任何大小调整提示的是 JLabel

相反,放弃 Canvas 。只需将父容器的布局设置为BorderLayout即可。为您添加到父容器的其他组件提供一些大小调整提示。

BorderLayout

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.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class game extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public game() {
        nonMaingame canvas = new nonMaingame();
        setSize(1020, 720);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(canvas);

    }

    public static void main(String[] args) {
        new game().setVisible(true);

    }

    public class nonMaingame extends JPanel implements ActionListener {

        /**
         *
         */
        private static final long serialVersionUID = 1L;
        JLabel text;

        public nonMaingame() {
            setLayout(new BorderLayout());

            JPanel canvasSouth = makePanel(Color.RED);
            add(canvasSouth, BorderLayout.SOUTH);

            JPanel canvasNorth = makePanel(Color.BLUE);
            add(canvasNorth, BorderLayout.NORTH);

            JPanel canvasEast = makePanel(Color.YELLOW);
            canvasEast.setBackground(Color.YELLOW);
            add(canvasEast, BorderLayout.EAST);

            JPanel canvasWest = makePanel(Color.MAGENTA);
            add(canvasWest, BorderLayout.WEST);

            text = new JLabel("hey");
            canvasSouth.add(text);
        }

        protected JPanel makePanel(Color color) {
            JPanel pane = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(100, 100);
                }
            };
            pane.setBackground(color);
            return pane;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub

        }

    }

}

关于java - BorderLayout 的作用类似于流式布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33905256/

相关文章:

c++ - 使用 Qt 进行音频信号处理 GUI 开发,如何?

ios - View 没有异步添加 subview Swift

java - Java 中有 JPanel 限制吗?

Android圆角边框颜色左上角仅动态

java - 如何使用 Alfresco Web 服务进行 Alfresco

java - 将所有非字母数字更改为 +

c# - C# 的免费或开源树状网格?

html - float child 的响应折叠边界

java - 如果语句没有调用正确的字符串或 boolean 值

java - Lmax Disruptor,许多消费者 - 如何让消费者只接受特定类型的消息并独立进行?