第二个JPanel涵盖第一个

时间:2016-01-14 17:14:38

标签: java swing

我是编程的初学者,我一直在努力解决以下问题。

我有一个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,那么我只能从第二个图像中获得输出。

2 个答案:

答案 0 :(得分:1)

首先突然出现的事实是你违反了绘画过程......

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

首先,假设您从JPanel延伸,您应该覆盖paintComponent方法,其次,您应该调用方法{{1}方法

super

有关绘画在Swing中的工作原理的详细信息,请参阅Painting in AWT and SwingPerforming 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方法