我對我而言似乎應該是一個非常簡單的問題。在我看來,這只是對GridBagLayout
...GridBagLayout不會正確地在組件之間分配尺寸
的人的大規模監督。我正在使用GridBagLayout
爲我正在製作的遊戲顯示27x13的網格。我使用這種佈局是因爲它能夠調整組件的大小,並且因爲配置有多容易,但這只是一個小問題。如果寬度不是27的倍數,或者如果高度不是13的倍數,則會在邊界周圍放置空白區域。
爲了說明我的意思:
Here是個什麼樣子,當我調整框架等,以使該JPanel
內的大小864x416,27完美的倍數和13
Here是個什麼樣子就像當我調整框架的大小,使JPanel
大小爲863x415,只是幾乎不是27或13的倍數。
它只是不在瓦片中分配額外的像素。我不知道爲什麼。當我用他們各自的方法擺弄最小/最大/首選大小,或者甚至使用GridBagLayout
的ipadx
和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());
}
}
我的問題是,如何才能讓佈局不斷看起來像第一個形象呢?我需要不同的佈局嗎?我很迷茫。
有點偏離主題,但我會建議不要使用'GridBagLayout',除非你絕對必須。這只是市長頭痛的IMO - 大部分相同的功能可以通過BoxLayout實現。 –
由於每個瓷磚的重量與其他瓷磚的重量完全相同,並且由於像素不能在亞像素中切割,所以佈局應如何平均分配27個部件中的像素? –
@JBNizet - 我希望它會在行中增加一個像素的寬度,直到它沒有更多的可用空間。它看起來非常基本,不會影響它的外觀。假設它有25個免費像素,它向左推到右邊。爲什麼不能在該行中添加一個像素寬度爲25個圖塊? – Keter