【问题标题】:Java Swing GUI BorderLayout: Location of componentsJava Swing GUI BorderLayout:组件的位置
【发布时间】:2020-08-11 01:53:41
【问题描述】:

我是 Java 新手,我正在玩一个简单的 GUI 示例:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class DrawTest {

    class DrawingPanel extends JPanel {

        private Rectangle2D shape;

        public DrawingPanel(Rectangle2D shape) {
            this.shape = shape;
        }

        public void paintComponent(Graphics g) {

            Graphics2D g2D = (Graphics2D) g;            
            super.paintComponent(g2D);  
            g2D.setColor(new Color(31, 21, 1));
            g2D.fill(shape);

        }

    }


    public void draw() {
        JFrame frame = new JFrame();
        Rectangle2D shape = new Rectangle2D.Float();
        final DrawingPanel drawing = new DrawingPanel(shape);

        shape.setRect(0, 0, 400, 400);
        frame.getContentPane().add(BorderLayout.NORTH, new JButton("TestN"));
        frame.getContentPane().add(BorderLayout.SOUTH, new JButton("TestS"));
        frame.getContentPane().add(BorderLayout.EAST, new JButton("TestE"));
        frame.getContentPane().add(BorderLayout.WEST, new JButton("TestW"));
        frame.getContentPane().add(BorderLayout.CENTER, drawing);
        frame.pack();
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);  
    }
}

public class DrawMain {
    public static void main(String[] args) {
        DrawTest test = new DrawTest();
        test.draw();

    }
}

正如预期的那样,这段代码生成了一个框架,矩形位于中心,按钮围绕它。但是,如果我像这样更改代码:

        frame.getContentPane().add(BorderLayout.NORTH, drawing);
        frame.getContentPane().add(BorderLayout.SOUTH, new JButton("TestS"));
        frame.getContentPane().add(BorderLayout.EAST, new JButton("TestE"));
        frame.getContentPane().add(BorderLayout.WEST, new JButton("TestW"));
        frame.getContentPane().add(BorderLayout.CENTER, new JButton("TestC"));

“TestC”按钮在中间有一个很大的区域,而矩形没有足够的空间。如果我移除其他按钮(TestS、TestE、TestW),情况也是如此:我得到一个巨大的 TestC 按钮和顶部矩形的一小部分(甚至不是缩放的矩形)。

为什么矩形在顶部(NORTH)绘制时没有获得足够的空间,但在中心绘制时却获得了足够的空间?

【问题讨论】:

  • 来自doc:“NORTH 和 SOUTH 组件可以水平拉伸;EAST 和 WEST 组件可以垂直拉伸;CENTER 组件可以水平和垂直拉伸以填充剩余的任何空间。”
  • 另请注意add(String,Component) 的文档:“此方法在 1.1 中已过时。请改用 add(Component, Object) 方法。”
  • @c0der 感谢您指出 add(String,Component) 方法已过时,我不知道这一点。

标签: java swing layout-manager border-layout


【解决方案1】:

DrawingPanel 应该 @Override getPreferredSize() 返回适当的大小。

然后布局管理器会将首选大小作为提示。一些布局管理器会根据布局和约束的逻辑扩展组件的高度或宽度。例如。 BorderLayout 会将PAGE_START / PAGE_END 中的组件拉伸到内容窗格的宽度,并将LINE_START / LINE_END 拉伸到其中最高者或CENTER 的高度。 GridBagLayout OTOH 将完全隐藏/删除没有足够空间的组件,没有足够的空间以首选大小显示它,这就是“pack”的用武之地。

所以将frame.setSize(500,500);(这并不比猜测更好)更改为frame.pack();,这将使框架需要的最小尺寸,以便显示它包含的组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2013-02-26
    • 2012-02-14
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多