JavaGridLayout不考虑给定的行数和列数
我试图在JPanel中显示彩色JLabel的网格。我创建了一个扩展JPanel的自定义类PixelMatrix,并用扩展JLabel的自定义类Pixel填充它。 问题是:当我在PixelMatrix对象的GridLayout中放置像素对象时,我没有得到我想要的行数和列数
这是我的像素类:
public class Pixel extends JLabel{
private Color color = null;
private int dimension;
public Pixel(Color c, int dim) {
this.setPreferredSize(new Dimension(dim, dim));
this.dimension = dim;
this.color = c;
this.setBackground(color);
this.setOpaque(true);
}
public Pixel(int dim) {
this(new Color(0x000000), dim);
}
public Color getColor() {
return color;
}
public void setColor(Color c) {
color = c;
}
}
这是我的PixelMatrix类:
public class PixelMatrix extends JPanel{
private int resolution;
private Pixel[][] pixels = null;
private GridLayout layout;
public PixelMatrix(int res) {
resolution = res;
layout = new GridLayout(0, res);
pixels = new Pixel[res][res];
for(int x = 0; x < res; x++) {
for(int y = 0; y < res; y++) {
pixels[x][y] = new Pixel(50);
this.add(pixels[x][y]);
}
}
}
}
这是用来显示所有内容的类:
public class EditorPanel extends JPanel{
private BorderLayout layout = new BorderLayout();
private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu = new JMenu("File");
private JMenu settingsMenu = new JMenu("Settings");
private JMenu sizeSubMenu = new JMenu("Size");
private JMenuItem newItem = new JMenuItem("New");
private JMenuItem openItem = new JMenuItem("Open...");
private JMenuItem saveItem = new JMenuItem("Save");
private JRadioButtonMenuItem size6x6Item = new JRadioButtonMenuItem("6 x 6", true);
private JRadioButtonMenuItem size8x8Item = new JRadioButtonMenuItem("8 x 8");
private ButtonGroup sizeButtonGroup = new ButtonGroup();
private PixelMatrix matrix = new PixelMatrix(6);
public EditorPanel() {
setup();
}
private void setup() {
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
sizeButtonGroup.add(size6x6Item);
sizeSubMenu.add(size6x6Item);
sizeButtonGroup.add(size8x8Item);
sizeSubMenu.add(size8x8Item);
settingsMenu.add(sizeSubMenu);
menuBar.add(fileMenu);
menuBar.add(settingsMenu);
this.setLayout(layout);
this.add(menuBar, BorderLayout.NORTH);
this.setPreferredSize(new Dimension(600, 600));
this.add(matrix, BorderLayout.CENTER);
}
}
这就是我得到的。我不明白我做错了什么。 Result
# 1 楼答案
那没用。这就产生了一个变量
默认的布局管理器是
FlowLayout
,这一点尚未更改。组件一个接一个地流动,并包裹到下一行如果你想使用
GridLayout
,你需要设置面板的布局所以你可以做:
或者,更简单的是,不要费心使用变量:
还有,你为什么要称这个变量为“分辨率”。该术语通常用于“以像素为单位的屏幕分辨率”。布局与分辨率无关。如果您试图在网格中指定“列”,这将是一个更好的变量名