【问题标题】:GridLayout doesn't respect the given number of rows and columnsGridLayout 不尊重给定的行数和列数
【发布时间】:2021-03-08 15:06:09
【问题描述】:

我正在尝试在 JPanel 中显示彩色 JLabels 网格。我创建了一个扩展 JPanel 的自定义类 PixelMatrix,并使用扩展 JLabel 的自定义类 Pixel 填充它。 问题是:当我将 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

【问题讨论】:

    标签: java swing


    【解决方案1】:

    我创建了一个扩展 JPanel 的自定义类 PixelMatrix

    layout = new GridLayout(0, res);
    

    这没有任何作用。这只是创建了一个变量。

    默认布局管理器是FlowLayout,并没有改变。组件一个接一个地流动并换行到下一行。

    如果要使用GridLayout,则需要设置面板​​的布局。

    所以你可以这样做:

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

    或者,更容易不用费心使用变量:

    setLayout( new GridLayout(0, res) );
    

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

    【讨论】:

    • 我创建了布局但我忘了设置它,这太尴尬了:) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多