java - 尝试在多个 JPanel 中显示图像

标签 java arrays swing jpanel imageicon

我正在创建一个具有 12 个 JPanels 网格的程序。当按下“添加图像”按钮时,网格中的第一个JPanel中会出现一个图像,并且计数器会加一。从那时起,每次再次单击“添加图像”时,图像都会添加到下一个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);
}
}

最佳答案

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

imageSpaces[imageCounter].add(lorryImage);
imageSpaces[imageCounter].revalidate();
imageSpaces[imageCounter].repaint();
<小时/>

免责声明:这可能是一个简单的修复,但还要注意组件(在本例中为您的 JLabel lorryImage)只能有一个父容器。上述修复仍然有效的原因是因为您没有重新验证并重新绘制添加了标签的前一个面板。因此,您可能需要考虑正确执行此操作,并向每个面板添加一个新 JLabel

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

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

<小时/>

旁注

  • Swing 应用程序应从事件调度线程 (EDT) 运行。您可以通过将 main 中的代码包装在 SwingUtilities.invokeLater(...) 中来实现此目的。查看更多Initial Threads

  • 您也可以只使用 JLabel 并调用 setIcon,而不是使用 JPanel

关于java - 尝试在多个 JPanel 中显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992318/

相关文章:

arrays - 如何在reactjs的新选项卡中打开pdf?

javascript - 从 JavaScript 中的输入文本框获取数组

Java Midi Sequencer - 使用播放头进行音符播放

java - 禁用 JFrame 的拖动

java - C#和Java的三元运算符的区别(?:)

java - 使用 while 循环报告进度和完成情况是否正确?

java - 有没有方法初始化之类的东西?

java - Vertx 将处理程序添加到 Spring 数据 API

javascript - 在 javascript 中使用数组从 JSON 获取元素

java - 在 Netbeans 7.4 中将 Java 应用程序转换为 JApplet