gpt4 book ai didi

java - 第二个 JPanel 覆盖第一个 JPanel

转载 作者:行者123 更新时间:2023-12-01 10:35:10 25 4
gpt4 key购买 nike

我是一名编程初学者,一段时间以来我一直在努力解决以下问题。

我有一个 BufferedImage 列表 (this.docList)。此刻我正在努力将图像放入 JPanel 并将该面板放入 JScrollPane 中。

如果我有多个图像,第二个图像似乎会覆盖第一个图像。使用以下代码,我制作了 ScrollPane 并将其发送到方法 getPanel,该方法完成后返回一个包含 ScrollPane 的 JPanel 其中包含包含 BufferedImagePanel。然后将其添加到 JFrame 中。

public void processView(SecondaryProcessPanel secondary){
this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS));

JScrollPane imageHolder = new JScrollPane();
//imageHolder.setLayout(new BoxLayout(imageHolder BoxLayout.Y_AXIS));
JScrollPane panelBack = secondary.getPanel(imageHolder);
panelBack.setPreferredSize(new Dimension(800,800));
this.add(panelBack, 0);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(600, 800);
this.pack();

}

方法getPanel 遍历BufferedImage 列表。完成后,扩展该类的 JPanel 将添加到 JScrollPane 中,并发送回 processView 方法。

public JScrollPane getPanel(JScrollPane imageHolder) {      
for (int j = 0; j< this.docList.size(); j++){
image = this.docList.get(j);
}
imageHolder = new JScrollPane(this);

return imageHolder;
}

@Override
public void paint(Graphics g) {
g.drawImage(image, 0,0, null);
}

不管怎样,我从两个图像的列表中得到的都是第二个图像。

非常感谢任何帮助。

在您的友好回答后,我已将代码更改回原来的代码!

 public void processView(SecondaryProcessPanel secondary){
this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS));
for (int i = 0; i < this.docList.size(); i++){
System.out.println("i = " + i);
JScrollPane imageHolder = new JScrollPane();

JScrollPane panelBack = secondary.getPanel(this.docList.get(i), imageHolder);
panelBack.setPreferredSize(new Dimension(800,800));
this.add(panelBack, i);
}


this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(600, 800);
this.pack();

}

public JScrollPane getPanel(BufferedImage image, JScrollPane imageHolder){

this.image = image;


imageHolder = new JScrollPane(this);

return imageHolder;
}

@Override
public void paint(Graphics g){


g.drawImage(image, 0,0, null);
}

我的问题仍然是,如果 docList ArrayList 包含多个 BufferedImage,那么我只能从第二个图像获得输出。

最佳答案

首先让我惊讶的是你违反了绘画流程......

@Override
public void paint(Graphics g) {
g.drawImage(image, 0,0, null);
}

首先,假设您是从 JPanel 扩展的,您应该重写 paintComponent 方法,其次,您应该调用这些方法 super 方法

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0,0, this);
}

参见Painting in AWT and SwingPerforming Custom Painting有关 Swing 中绘画工作原理的更多详细信息。

第二个问题是,为什么? JLabel 可以很好地显示图像。看看How to Use Labels了解更多详情...

最后...

public void processView(SecondaryProcessPanel secondary){
this.setLayout(new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS));
for (int i = 0; i < this.docList.size(); i++){
System.out.println("i = " + i);
JScrollPane imageHolder = new JScrollPane();

JScrollPane panelBack = secondary.getPanel(this.docList.get(i), imageHolder);
panelBack.setPreferredSize(new Dimension(800,800));
this.add(panelBack, i);
}


this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(600, 800);
this.pack();

}

public JScrollPane getPanel(BufferedImage image, JScrollPane imageHolder){

this.image = image;
imageHolder = new JScrollPane(this);

return imageHolder;
}

这一切看起来非常可疑,看起来您正在尝试将组件的同一实例添加到多个 JScrollPane 中,每次都为单个实例分配不同的图像。 .

因此,这基本上将从其先前的父级中删除组件的实例,然后将其添加到新容器 (JScrollPane) 并提供 BufferedImage 的新实例> 为了绘制它,基本上忽略它之前的所有内容。

将来,考虑提供 runnable example这说明了你的问题。这不是代码转储,而是您正在执行的操作的示例,它突出显示了您遇到的问题。这将减少困惑并获得更好的响应

因此,您最终会得到很多空的 JScrollPane,但其中一个显示列表中的最后一张图像...

关于java - 第二个 JPanel 覆盖第一个 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795667/

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