我是编程的初学者,我一直在努力解决以下问题。
我有一个BufferedImage
s(this.docList
)列表。目前我正在努力
将图片放到JPanel
上,然后将该面板放在JScrollPane
。
如果我有多个图像,第二个图像似乎覆盖了第一个图像。
使用以下代码,我将ScrollPane
发送到方法getPanel
,当它完成后,返回一个JPanel
,其中包含ScrollPane
,其中包含Panel
(s)包含BufferedImage
s。然后将其添加到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,那么我只能从第二个图像中获得输出。
答案 0 :(得分:1)
首先突然出现的事实是你违反了绘画过程......
@Override
public void paint(Graphics g) {
g.drawImage(image, 0,0, null);
}
首先,假设您从JPanel
延伸,您应该覆盖paintComponent
方法,其次,您应该调用方法{{1}方法
super
有关绘画在Swing中的工作原理的详细信息,请参阅Painting in AWT and Swing和Performing Custom Painting。
其次,为什么? @Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0,0, this);
}
可以很好地显示图像。有关更多详细信息,请查看How to Use Labels
最后......
JLabel
这一切看起来都很可疑,看起来你正在尝试将组件的同一个实例添加到多个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
的新实例它是绘制的,基本上忽略了它之前的所有内容。
将来,请考虑提供一个展示您问题的runnable example。这不是代码转储,而是您正在做的事情的一个示例,它突出了您遇到的问题。这将减少混淆和更好的响应
所以,你最终得到的是很多空的BufferedImage
,但有一个显示列表中的最后一个图像......
答案 1 :(得分:0)
这会占据列表中的最后一个图像 - 我不明白你想要实现什么逻辑但只保留最后一个图像是它的作用 - 也许你想要绘制每个图像(你有一个盒子布局将它们垂直添加到那里) )正在阅读
GridLayout gr=new GridLayout(0, 6);
gr.setRows(0); gr.setColumns(6);
JPanel cpanel=new JPanel();
cpanel.setLayout(gr);
for (int j = 0; j< this.docList.size(); j++){
image = this.docList.get(j);
JLabel jl=new JLabel(new ImageIcon(image));
cpanel.add(jl);
}
this.add(cpanel); // assuming 'this' is the scrollpane you want
-
我的建议如下
src/Template/Bookmarks/tags.ctp
并删除paint方法