有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    I created a custom class PixelMatrix which extends JPanel

    layout = new GridLayout(0, res);
    

    那没用。这就产生了一个变量

    默认的布局管理器是FlowLayout,这一点尚未更改。组件一个接一个地流动,并包裹到下一行

    如果你想使用GridLayout,你需要设置面板的布局

    所以你可以做:

    layout = new GridLayout(0, res);
    setLayout( layout );
    

    或者,更简单的是,不要费心使用变量:

    setLayout( new GridLayout(0, res) );
    

    还有,你为什么要称这个变量为“分辨率”。该术语通常用于“以像素为单位的屏幕分辨率”。布局与分辨率无关。如果您试图在网格中指定“列”,这将是一个更好的变量名