Java Swing API-GroupLayout未正确调整所有组件JPanel的大小
我昨天才开始使用JavaSwing,所以如果这不是一个有效的问题,请原谅。我一直在尝试创建一个简单的UI,其中包含一个网格和一个面板,允许用户指定网格维度的大小 我有两个扩展JPanel的类:Java Swing API-GroupLayout未正确调整所有组件JPanel的大小,java,swing,layout-manager,grouplayout,Java,Swing,Layout Manager,Grouplayout,我昨天才开始使用JavaSwing,所以如果这不是一个有效的问题,请原谅。我一直在尝试创建一个简单的UI,其中包含一个网格和一个面板,允许用户指定网格维度的大小 我有两个扩展JPanel的类:GridSizePanel和GridBoxPanelGridSizePanel指定设计允许用户更改尺寸的面板时涉及的标题、边框、标签和字段网格框面板显示实际网格(采用自)GridSizePanel使用GroupLayout作为其布局管理器,GridBoxPanel使用GridBagLayout。编排这些子面
GridSizePanel
和GridBoxPanel
GridSizePanel
指定设计允许用户更改尺寸的面板时涉及的标题、边框、标签和字段<代码>网格框面板显示实际网格(采用自)GridSizePanel
使用GroupLayout作为其布局管理器,GridBoxPanel
使用GridBagLayout。编排这些子面板的父JFrame类(MazeSolverInterface
)使用GroupLayout作为其LayoutManager
问题是,如果我只将GridSizePanel
添加到MazeSolverInterface
的组布局中,当我手动调整窗口大小时,我可以看到GridSizePanel
自动调整大小。一切都好
但是,当我将GridBoxPanel
添加到MazeSolverInterface
时,现在当我手动调整窗口大小时,似乎只有GridBoxPanel
会调整大小。GridSizePanel
根本不会更改维度
以下是我目前的代码:
GridSizePanel:
public class GridSizePanel extends JPanel implements PropertyChangeListener {
public GridSizePanel() throws ParseException {
// set the border properties
TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
title.setTitleColor(Color.BLACK);
title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
Color.DARK_GRAY, Color.GRAY));
this.setBorder(title);
// wire up the group layout and panel to
// each other
GroupLayout gl = new GroupLayout(this);
this.setLayout(gl);
// Turn on automatically adding gaps between components
gl.setAutoCreateGaps(true);
// Turn on automatically creating gaps between components that touch
// the edge of the container and the container.
gl.setAutoCreateContainerGaps(true);
JLabel numRowsLabel = new JLabel("rows");
JLabel numColsLabel = new JLabel("columns");
MaskFormatter textMask = new MaskFormatter("##");
textMask.setPlaceholder("16");
JFormattedTextField rowsText = new JFormattedTextField(textMask);
JFormattedTextField colsText = new JFormattedTextField(textMask);
// configure the text fields
rowsText.setColumns(50);
colsText.setColumns(50);
rowsText.addPropertyChangeListener("value", this);
colsText.addPropertyChangeListener("value", this);
GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
.addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
gl.setHorizontalGroup(horGroup);
GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
gl.setVerticalGroup(verGroup);
}
//public GridSize getSize() {
// return new GridSize()
//}
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
// TODO: fill this with logic to relay grid dimensions to the model
}
}
public class GridBoxPanel extends JPanel {
public GridBoxPanel() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int row = 0; row < 32; row++) {
for (int col = 0; col < 32; col++) {
gbc.gridx = col;
gbc.gridy = row;
GridCell gridCell = new GridCell();
Border border = null;
if (row < 4) {
if (col < 4) {
border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
}
} else {
if (col < 4) {
border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
}
}
gridCell.setBorder(border);
add(gridCell, gbc);
}
}
}
}
public class MazeSolverInterface extends JFrame {
public MazeSolverInterface(String[] args) throws ParseException {
checkArgs(args);
initMaze(args);
}
public void initMaze(String[] args) throws ParseException {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
// create required panels to integrate
GridSizePanel gridSizeComponent = new GridSizePanel();
GridBoxPanel gridDrawComponent = new GridBoxPanel();
gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
pack();
setTitle("v0.0.1");
setSize(700, 700); // TODO: change to something configurable
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void checkArgs(String[] args) {
// TODO: fill with logic to check valid arguments (initial window dimensions)
}
}
public class Main {
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MazeSolverInterface ex = null;
try {
ex = new MazeSolverInterface(args);
} catch (ParseException e) {
e.printStackTrace();
}
ex.setVisible(true);
}
});
}
}
public class GridCell extends JPanel {
private Color defaultBackground;
public GridCell() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
defaultBackground = getBackground();
setBackground(Color.BLUE);
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(defaultBackground);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}
GridBoxPanel:
public class GridSizePanel extends JPanel implements PropertyChangeListener {
public GridSizePanel() throws ParseException {
// set the border properties
TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
title.setTitleColor(Color.BLACK);
title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
Color.DARK_GRAY, Color.GRAY));
this.setBorder(title);
// wire up the group layout and panel to
// each other
GroupLayout gl = new GroupLayout(this);
this.setLayout(gl);
// Turn on automatically adding gaps between components
gl.setAutoCreateGaps(true);
// Turn on automatically creating gaps between components that touch
// the edge of the container and the container.
gl.setAutoCreateContainerGaps(true);
JLabel numRowsLabel = new JLabel("rows");
JLabel numColsLabel = new JLabel("columns");
MaskFormatter textMask = new MaskFormatter("##");
textMask.setPlaceholder("16");
JFormattedTextField rowsText = new JFormattedTextField(textMask);
JFormattedTextField colsText = new JFormattedTextField(textMask);
// configure the text fields
rowsText.setColumns(50);
colsText.setColumns(50);
rowsText.addPropertyChangeListener("value", this);
colsText.addPropertyChangeListener("value", this);
GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
.addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
gl.setHorizontalGroup(horGroup);
GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
gl.setVerticalGroup(verGroup);
}
//public GridSize getSize() {
// return new GridSize()
//}
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
// TODO: fill this with logic to relay grid dimensions to the model
}
}
public class GridBoxPanel extends JPanel {
public GridBoxPanel() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int row = 0; row < 32; row++) {
for (int col = 0; col < 32; col++) {
gbc.gridx = col;
gbc.gridy = row;
GridCell gridCell = new GridCell();
Border border = null;
if (row < 4) {
if (col < 4) {
border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
}
} else {
if (col < 4) {
border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
}
}
gridCell.setBorder(border);
add(gridCell, gbc);
}
}
}
}
public class MazeSolverInterface extends JFrame {
public MazeSolverInterface(String[] args) throws ParseException {
checkArgs(args);
initMaze(args);
}
public void initMaze(String[] args) throws ParseException {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
// create required panels to integrate
GridSizePanel gridSizeComponent = new GridSizePanel();
GridBoxPanel gridDrawComponent = new GridBoxPanel();
gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
pack();
setTitle("v0.0.1");
setSize(700, 700); // TODO: change to something configurable
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void checkArgs(String[] args) {
// TODO: fill with logic to check valid arguments (initial window dimensions)
}
}
public class Main {
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MazeSolverInterface ex = null;
try {
ex = new MazeSolverInterface(args);
} catch (ParseException e) {
e.printStackTrace();
}
ex.setVisible(true);
}
});
}
}
public class GridCell extends JPanel {
private Color defaultBackground;
public GridCell() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
defaultBackground = getBackground();
setBackground(Color.BLUE);
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(defaultBackground);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}
Main:
public class GridSizePanel extends JPanel implements PropertyChangeListener {
public GridSizePanel() throws ParseException {
// set the border properties
TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
title.setTitleColor(Color.BLACK);
title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
Color.DARK_GRAY, Color.GRAY));
this.setBorder(title);
// wire up the group layout and panel to
// each other
GroupLayout gl = new GroupLayout(this);
this.setLayout(gl);
// Turn on automatically adding gaps between components
gl.setAutoCreateGaps(true);
// Turn on automatically creating gaps between components that touch
// the edge of the container and the container.
gl.setAutoCreateContainerGaps(true);
JLabel numRowsLabel = new JLabel("rows");
JLabel numColsLabel = new JLabel("columns");
MaskFormatter textMask = new MaskFormatter("##");
textMask.setPlaceholder("16");
JFormattedTextField rowsText = new JFormattedTextField(textMask);
JFormattedTextField colsText = new JFormattedTextField(textMask);
// configure the text fields
rowsText.setColumns(50);
colsText.setColumns(50);
rowsText.addPropertyChangeListener("value", this);
colsText.addPropertyChangeListener("value", this);
GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
.addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
gl.setHorizontalGroup(horGroup);
GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
gl.setVerticalGroup(verGroup);
}
//public GridSize getSize() {
// return new GridSize()
//}
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
// TODO: fill this with logic to relay grid dimensions to the model
}
}
public class GridBoxPanel extends JPanel {
public GridBoxPanel() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int row = 0; row < 32; row++) {
for (int col = 0; col < 32; col++) {
gbc.gridx = col;
gbc.gridy = row;
GridCell gridCell = new GridCell();
Border border = null;
if (row < 4) {
if (col < 4) {
border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
}
} else {
if (col < 4) {
border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
}
}
gridCell.setBorder(border);
add(gridCell, gbc);
}
}
}
}
public class MazeSolverInterface extends JFrame {
public MazeSolverInterface(String[] args) throws ParseException {
checkArgs(args);
initMaze(args);
}
public void initMaze(String[] args) throws ParseException {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
// create required panels to integrate
GridSizePanel gridSizeComponent = new GridSizePanel();
GridBoxPanel gridDrawComponent = new GridBoxPanel();
gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
pack();
setTitle("v0.0.1");
setSize(700, 700); // TODO: change to something configurable
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void checkArgs(String[] args) {
// TODO: fill with logic to check valid arguments (initial window dimensions)
}
}
public class Main {
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MazeSolverInterface ex = null;
try {
ex = new MazeSolverInterface(args);
} catch (ParseException e) {
e.printStackTrace();
}
ex.setVisible(true);
}
});
}
}
public class GridCell extends JPanel {
private Color defaultBackground;
public GridCell() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
defaultBackground = getBackground();
setBackground(Color.BLUE);
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(defaultBackground);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}
以下是将GridBoxLabel添加到MazeSolverInterface之前的UI外观:
…将GridBoxLabel添加到MazeSolverInterface后:
非常感谢您的帮助。谢谢大家!
编辑:
如上所示,GridBoxPanel
使用GridCell
类。我忘了把它加到这篇文章里,所以在这里。希望这有帮助
GridCell:
public class GridSizePanel extends JPanel implements PropertyChangeListener {
public GridSizePanel() throws ParseException {
// set the border properties
TitledBorder title = BorderFactory.createTitledBorder("Grid Size");
title.setTitleColor(Color.BLACK);
title.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,
Color.DARK_GRAY, Color.GRAY));
this.setBorder(title);
// wire up the group layout and panel to
// each other
GroupLayout gl = new GroupLayout(this);
this.setLayout(gl);
// Turn on automatically adding gaps between components
gl.setAutoCreateGaps(true);
// Turn on automatically creating gaps between components that touch
// the edge of the container and the container.
gl.setAutoCreateContainerGaps(true);
JLabel numRowsLabel = new JLabel("rows");
JLabel numColsLabel = new JLabel("columns");
MaskFormatter textMask = new MaskFormatter("##");
textMask.setPlaceholder("16");
JFormattedTextField rowsText = new JFormattedTextField(textMask);
JFormattedTextField colsText = new JFormattedTextField(textMask);
// configure the text fields
rowsText.setColumns(50);
colsText.setColumns(50);
rowsText.addPropertyChangeListener("value", this);
colsText.addPropertyChangeListener("value", this);
GroupLayout.SequentialGroup horGroup = gl.createSequentialGroup();
horGroup.addGroup(gl.createParallelGroup().addComponent(numRowsLabel).addComponent(numColsLabel))
.addGroup(gl.createParallelGroup().addComponent(rowsText).addComponent(colsText));
gl.setHorizontalGroup(horGroup);
GroupLayout.SequentialGroup verGroup = gl.createSequentialGroup();
verGroup.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numRowsLabel).addComponent(rowsText))
.addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(numColsLabel).addComponent(colsText));
gl.setVerticalGroup(verGroup);
}
//public GridSize getSize() {
// return new GridSize()
//}
@Override
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
// TODO: fill this with logic to relay grid dimensions to the model
}
}
public class GridBoxPanel extends JPanel {
public GridBoxPanel() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int row = 0; row < 32; row++) {
for (int col = 0; col < 32; col++) {
gbc.gridx = col;
gbc.gridy = row;
GridCell gridCell = new GridCell();
Border border = null;
if (row < 4) {
if (col < 4) {
border = new MatteBorder(1, 1, 0, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 0, 1, Color.GRAY);
}
} else {
if (col < 4) {
border = new MatteBorder(1, 1, 1, 0, Color.GRAY);
} else {
border = new MatteBorder(1, 1, 1, 1, Color.GRAY);
}
}
gridCell.setBorder(border);
add(gridCell, gbc);
}
}
}
}
public class MazeSolverInterface extends JFrame {
public MazeSolverInterface(String[] args) throws ParseException {
checkArgs(args);
initMaze(args);
}
public void initMaze(String[] args) throws ParseException {
Container pane = getContentPane();
GroupLayout gl = new GroupLayout(pane);
pane.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
// create required panels to integrate
GridSizePanel gridSizeComponent = new GridSizePanel();
GridBoxPanel gridDrawComponent = new GridBoxPanel();
gl.setHorizontalGroup(gl.createSequentialGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
gl.setVerticalGroup(gl.createParallelGroup().addComponent(gridDrawComponent).addGap(50).addComponent(gridSizeComponent));
pack();
setTitle("v0.0.1");
setSize(700, 700); // TODO: change to something configurable
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void checkArgs(String[] args) {
// TODO: fill with logic to check valid arguments (initial window dimensions)
}
}
public class Main {
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MazeSolverInterface ex = null;
try {
ex = new MazeSolverInterface(args);
} catch (ParseException e) {
e.printStackTrace();
}
ex.setVisible(true);
}
});
}
}
public class GridCell extends JPanel {
private Color defaultBackground;
public GridCell() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
defaultBackground = getBackground();
setBackground(Color.BLUE);
}
@Override
public void mouseExited(MouseEvent e) {
setBackground(defaultBackground);
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
}
GroupLayout
确实是为GUI工具创建的,但是,它可以
手动使用时没有问题。从内置管理器来看,这是一个
我建议您使用
我对您的示例进行了一些修改:
MazeSolverInterface.java
我已经摆脱了GridSizePanel,并将代码移动到MazeSolverInterface中。从设计的角度来看,如果没有其他具体要求,则不需要有标题的面板
面板。标签是右对齐的。文本字段和迷宫对象在
窗口已调整大小
setSize()
方法被删除,因为它更倾向于使用pack()
方法。
您可以使用其中一个,但不能同时使用两个
GridBoxPanel.java
导入java.awt.Color;
导入java.awt.GridLayout;
导入javax.swing.JPanel;
导入javax.swing.border.border;
导入javax.swing.border.MatteBorder;
公共类GridBoxPanel扩展了JPanel{
公共GridBoxPanel(){
setLayout(新的GridLayout(32,32,1,1));
用于(int行=0;行<32;行++){
for(int col=0;col<32;col++){
GridCell GridCell=新GridCell();
Border=null;
如果(第4行){
if(col<4){
边框=新的蒙版边框(1,1,0,0,颜色为灰色);
}否则{
边框=新的蒙版边框(1,1,0,1,颜色为灰色);
}
}否则{
if(col<4){
边框=新的蒙版边框(1,1,1,0,颜色为灰色);
}否则{
边框=新的蒙版边框(1,1,1,1,颜色为灰色);
}
}
gridCell.setboorder(边框);
添加(网格单元);
}
}
}
}
这里我使用了GridLayout
管理器,而不是gridbagloayout
。(可能是
只有我在GridLayout
中找到的第三个示例有用。)
我做了这个修改,使事情变得更简单,但我个人不会使用GridLayout
使用GroupLayout
或migloayout
管理器创建完整的解决方案。
(GridLayout
不可移植,因为它以像素为单位设置边距。这是不可移植的
最佳,因为我们选择的固定空间并非在所有屏幕分辨率上都是正确的。
在小屏幕上正常,在大屏幕上不正常。一般来说,我们应该避免
以像素为单位设置尺寸。这也适用于重写的getPreferredSize()
方法。)
您不能手动使用GroupLayout。GroupLayout是为GUI生成器工具设计的。手动使用GroupLayout对任何人来说都是非常困难和容易出错的。如果你想使用GroupLayout,你可以使用任何GUI构建器。你的意思是,如果我从上面的代码中删除任何/所有GroupLayout依赖项并重新运行,我的大小调整问题就会消失吗?那肯定会起作用。是您的面板和组布局造成了问题,这是因为您试图手动实现组布局。如果您仍然想手动使用GroupLayout,那么请关闭所有
autoCreate…Gaps()
,并根据需要手动添加containerGap(…)。只有这样,才能调整GroupLayout面板的大小。要解决布局问题,使用BorderLayout是最简单的方法。一个面板“中间”,另一个面板“右边”。(如果我理解你的布局正确的话)谢谢你的评论!我不打算回答这个问题,因为我自己还没有找到它,但发现了一个bug:在GridCell中,我将首选大小设置为50x50。对于32x32的网格,沿一维方向为1600。但在MazeSolverInterface中,单面只有700!这就是为什么迷宫这么小,而且在中心。我将getPreferredSize改为15x15,现在看起来好多了。调整尺寸的问题似乎也因此消失了。我还要补充一点