我有什么在我看来应该是一个非常简单的问题。GridBagLayout
在我看来,这只是对制造...的人的巨大疏忽。
反正。我正在GridBagLayout
为我正在制作的游戏显示一个 27x13 的瓷砖网格。我使用这种布局是因为它能够调整组件的大小并且配置起来非常容易,但只有一个小问题。在调整图块大小时,如果宽度不是 27 的倍数或高度不是 13 的倍数,则边框周围会有空白。
为了说明我的意思:
这是我调整框架大小以使JPanel
内部大小为 864x416 时的样子,即 27 和 13 的完美倍数。
这是我调整框架大小以使JPanel
内部大小为 863x415 时的样子,几乎不是 27 或 13 的倍数。
它根本没有在图块之间分配额外的像素。我不知道为什么。GridBagLayout
当我使用它们各自的方法或覆盖它们,甚至使用'sipadx
和约束来摆弄最小/最大/首选尺寸时ipady
,我可以删除空白 - 但它所做的只是挤压最外面的瓷砖以适应其余部分。您可以在下面的示例代码中看到这一点。
这是一个SSCCE:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JPanel {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
start();
}
});
}
static void start() {
JFrame frame = new JFrame("Game");
JPanel newFrame = new MainGameScreen();
frame.getContentPane().add(newFrame);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class MainGameScreen extends JPanel {
public MainGameScreen() {
setPreferredSize(new Dimension(864, 551));
setLayout(new GridBagLayout());
setBackground(Color.green);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.ipadx = 0; //Change to 64 to see undesired effects
gbc.ipady = 0; //^
for (int i=0;i<13;i++) {
for (int j=0;j<27;j++) {
gbc.gridx = j;
gbc.gridy = i;
add(new ImagePanel(), gbc);
}
}
}
}
class ImagePanel extends JComponent {
private int r,g,b;
public ImagePanel() {
Random generator = new Random();
r = generator.nextInt(100)+1;
g = generator.nextInt(100)+1;
b = generator.nextInt(100)+1;
}
@Override
public void paintComponent(Graphics gr) {
super.paintComponent(gr);
gr.setColor(new Color(r,g,b));
gr.fillRect(0, 0, getWidth(), getHeight());
}
}
我的问题是,如何使布局始终看起来像第一张图片?我需要不同的布局吗?我在这里很迷路。