将JLabel数组添加到JPanel



我创建了一个JPanel网格,现在我想通过循环将图像切片数组添加到网格中最后一行我有错误。

public static final int WIDTH = 1024;
public static final int HEIGHT = 640;
private static final int GRID_ROWS = 20;
private static final int GRID_COLS = 20;
private static final int GAP = 1;
private static final Dimension LAYERED_PANE_SIZE = new Dimension(WIDTH, HEIGHT);
private static final Dimension LABEL_SIZE = new Dimension(60, 40);
private GridLayout gridlayout = new GridLayout(GRID_ROWS, GRID_COLS, GAP, GAP);
private JPanel backingPanel = new JPanel(gridlayout);
private JPanel[][] panelGrid = new JPanel[GRID_ROWS][GRID_COLS];
private JLabel redLabel = new JLabel("Red", SwingConstants.CENTER);
private JLabel blueLabel = new JLabel("Blue", SwingConstants.CENTER);
// code in constructor
backingPanel.setSize(LAYERED_PANE_SIZE);
backingPanel.setLocation(2 * GAP, 2 * GAP);
backingPanel.setBackground(Color.black);
for (int row = 0; row < GRID_ROWS; row++) {
    for (int col = 0; col < GRID_COLS; col++) {
        panelGrid[row][col] = new JPanel(new GridBagLayout());
        backingPanel.add(panelGrid[row][col]);
    }
}
setLayout(new GridLayout(GRID_ROWS, GRID_COLS));
BufferedImage bi = null;
try {
    bi = ImageIO.read(new File("assets/image.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}
for (int r = 0; r < GRID_ROWS; r++) {
    for (int c = 0; c < GRID_COLS; c++) {
        int w = bi.getWidth() / GRID_ROWS;
        int h = bi.getHeight() / GRID_COLS;
        BufferedImage b = bi.getSubimage(c * w, r * h, w, h);
        list.add(new JLabel(new ImageIcon(b))); 
        panelGrid[r][c] = new JPanel(new GridBagLayout());
        backingPanel.add(panelGrid[r][c]); 
        panelGrid[r][c].add(list.get(r));
    }
}

由于listList的一个实例,而Java不是C++,因此不能指定类似operator[]的方法。您需要使用list.get(),如下所示:

panelGrid[r][c].add(list.get(r));

此外,您应该将GridBagLayoutGridBagConstraints一起使用。因此,调用

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();

并更改添加面板的行:

panelGrid[r][c] = new JPanel(new GridBagLayout());
panelGrid[r][c].add(list.get(r));
gbc.gridx = r; gbc.gridy = c;
backingPanel.add(panelGrid[r][c], gbc);

最新更新