gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:53 25 4
gpt4 key购买 nike

我正在创建一个具有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com