尝试在多个JPanel中显示图像

时间:2014-04-10 15:25:02

标签: java arrays swing jpanel imageicon

我正在创建一个网格为12 JPanels的程序。按下"add image"按钮时,图像将出现在网格的第一个JPanel中,计数器将加1。从那时起,每次再次点击"add image"时,图片都会添加到下一个JPanel。出于某种原因,该按钮仅将图像添加到第一个JPanel,然后停止工作。这是我到目前为止所获得的代码。

public class ImageGrid extends JFrame {

static JPanel[] imageSpaces = new JPanel[12];
int imageCounter = 0;

ImageGrid() {
    this.setTitle("Image Grid");
    setSize(750, 750);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    JPanel p3 = new JPanel();
    p3.setLayout(new GridLayout(3, 4, 10, 5));
    p3.setBackground(Color.WHITE);
    p3.setOpaque(true);
    p3.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));

    for (int j = 0; j < imageSpaces.length; j++) {
        imageSpaces[j] = setImageSpace();

        p3.add(imageSpaces[j]);
    }

    MyButtonPanel p1 = new MyButtonPanel();

    add(p1, BorderLayout.SOUTH);
    add(p3, BorderLayout.CENTER);

}

public JPanel setImageSpace() {

    JPanel test;
    test = new JPanel();
    test.setOpaque(true);
    test.setPreferredSize(new Dimension(100, 100));
    return test;
}

class MyButtonPanel extends JPanel implements ActionListener {

    final JButton addImage = new JButton("Add Image");

    ImageIcon lorryPicture = new ImageIcon(ImageGrid.class.getResource("/resources/lorry.png"));
    JLabel lorryImage = new JLabel(lorryPicture);

    MyButtonPanel() {
        add(addImage);
        addImage.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == addImage) {
            imageSpaces[imageCounter].add(lorryImage);
            revalidate();
            repaint();
            imageCounter++;
        }
    }
}
public static void main(String[] args) {

    ImageGrid test = new ImageGrid();
    test.setVisible(true);
}
}

1 个答案:

答案 0 :(得分:1)

您应该重新验证并重新绘制面板(这是受添加影响的容器),而不是框架

imageSpaces[imageCounter].add(lorryImage);
imageSpaces[imageCounter].revalidate();
imageSpaces[imageCounter].repaint();

Diclaimer :这可以作为一个简单的修复,但也要注意组件(在这种情况下是您的JLabel lorryImage)只能有一个父容器。上述修复仍然有效的原因是因为您没有重新验证并重新绘制上一个面板,标签已添加到。因此,您可能需要考虑正确执行此操作,并为每个面板添加new JLabel

if (e.getSource() == addImage) {
    JLabel lorryImage = new JLabel(lorryPicture);
    imageSpaces[imageCounter].add(lorryImage);
    imageSpaces[imageCounter].revalidate();
    imageSpaces[imageCounter].repaint();
    imageCounter++;
}

免责声明2:您应该添加一项检查,以便在计数小于数组长度时添加标签,以避免ArrayIndexOutOfBoundsException


附注

  • Swing应用程序应该从Event Dispatch Thread(EDT)运行。您可以通过将main中的代码包装在SwingUtilities.invokeLater(...)中来完成此操作。详情请见Initial Threads

  • 您也可以使用JLabel并致电setIcon,而不是使用JPanel