Java Swing GUI BorderLayout:组件的位置
Java Swing GUI BorderLayout: Location of components
我是 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" 按钮在中间有一个很大的区域,而矩形没有足够的区域 space。如果我删除其他按钮(TestS、TestE、TestW),这甚至是正确的:我得到一个巨大的 TestC 按钮和顶部矩形的一小部分(甚至不是缩放的矩形)。
为什么矩形在顶部(北)绘制时没有得到足够的 space 但在中心绘制时却得到足够的?
DrawingPanel
应该 @Override getPreferredSize()
到 return 一个合适的大小。
然后布局管理器会将首选大小作为 提示。一些布局管理器会根据布局和约束的逻辑来扩展组件的高度或宽度。例如。 BorderLayout
会将 PAGE_START
/ PAGE_END
中的组件拉伸到内容窗格的宽度,并将 LINE_START
/ LINE_END
中的组件拉伸到两者中最高的一个的高度其中,或 CENTER
。 GridBagLayout
OTOH 将完全隐藏/删除 不足以 space 以首选大小显示的组件,这就是 'pack'进来了。
所以将 frame.setSize(500,500);
(这不比猜测好多少)更改为 frame.pack();
,这将使框架成为 需要 的最小尺寸,为了显示它包含的组件。
我是 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" 按钮在中间有一个很大的区域,而矩形没有足够的区域 space。如果我删除其他按钮(TestS、TestE、TestW),这甚至是正确的:我得到一个巨大的 TestC 按钮和顶部矩形的一小部分(甚至不是缩放的矩形)。
为什么矩形在顶部(北)绘制时没有得到足够的 space 但在中心绘制时却得到足够的?
DrawingPanel
应该 @Override getPreferredSize()
到 return 一个合适的大小。
然后布局管理器会将首选大小作为 提示。一些布局管理器会根据布局和约束的逻辑来扩展组件的高度或宽度。例如。 BorderLayout
会将 PAGE_START
/ PAGE_END
中的组件拉伸到内容窗格的宽度,并将 LINE_START
/ LINE_END
中的组件拉伸到两者中最高的一个的高度其中,或 CENTER
。 GridBagLayout
OTOH 将完全隐藏/删除 不足以 space 以首选大小显示的组件,这就是 'pack'进来了。
所以将 frame.setSize(500,500);
(这不比猜测好多少)更改为 frame.pack();
,这将使框架成为 需要 的最小尺寸,为了显示它包含的组件。