我有什么似乎应该是一个非常简单的问题。在我看来,这只是对GridBagLayout
...
反正。我正在使用GridBagLayout
来显示我正在制作的游戏的27x13网格。我使用这种布局是因为它能够调整组件的大小,并且因为配置起来很容易,但只有一个小问题。在调整图块大小时,如果宽度不是27的倍数,或者如果高度不是13的倍数,则边框周围会有空白区域。
显示我的意思:
Here是我调整帧大小时的样子,因此JPanel
内的大小为864x416,是27和13的完美倍数。
Here是我调整框架大小时的样子,以便JPanel
内部的大小为863x415,几乎不是27或13的倍数。
它不是在瓦片之间分配额外的像素。我不知道为什么。当我使用各自的方法调整最小/最大/首选大小或覆盖它们,甚至使用GridBagLayout
的{{1}}和ipadx
约束时,我可以删除空格 - 但是它所做的只是挤压最外面的瓷砖以适应其余部分。您可以在下面的示例代码中看到这一点。
这是一个SSCCE:
ipady
我的问题是,如何让布局不断看起来像第一张图片?我需要不同的布局吗?我在这里很失落。
答案 0 :(得分:2)
我会使用GridLayout作为方形图块的面板,并将其嵌套在窗口其余部分的另一个布局(GridBagLayout,BorderLayout,BoxLayout或某些布局组合)中。
也就是说,在这种情况下,GridLayout和GridBagLayout将均匀分布像素。由于您只能使用整个像素,因此在划分空格后,您将留下余数,并将其用作填充。这在很大程度上是不可避免的,尽管有一些潜在的解决方法:
如果您对第一个选项没有问题,可以稍作修改,将窗口捕捉到兼容的大小,这样就没有剩余部分了(注意:我还更改了几个硬编码的整数常数):
package com.example.game;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
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() {
final JFrame frame = new JFrame("Game");
JPanel newFrame = new MainGameScreen();
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
int h = frame.getContentPane().getHeight() % MainGameScreen.ROWS;
int w = frame.getContentPane().getWidth() % MainGameScreen.COLS;
// Subtract the remainder pixels from the size.
frame.setSize(frame.getWidth() - w, frame.getHeight() - h);
}
});
frame.getContentPane().add(newFrame);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
class MainGameScreen extends JPanel {
static final int ROWS = 13;
static final int COLS = 27;
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<ROWS;i++) {
for (int j=0;j<COLS;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());
}
}