带有BufferedImage的ScrollPane不滚动

时间:2016-03-03 18:29:07

标签: java swing bufferedimage scrollpane

我正在制作程序,它将在滚动的框架中显示放大的图片,并允许用户更改缓冲图像的单个像素。我正在尝试将带有缓冲图像的面板添加到scrolledPane但滚动条不会出现。 这是我的小组:

package biometria1;

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class noobPanel extends JPanel implements MouseListener{
     private BufferedImage background;
     int scale = 8;
     noobPanel  self;

   public noobPanel(File file){
       self = this;
         try {
             background = ImageIO.read(file);
         } catch (IOException ex) {
             Logger.getLogger(noobPanel.class.getName()).log(Level.SEVERE, null, ex);
         }

         addMouseListener(this);
   }

   public BufferedImage getImage(){
       return this.background;
   }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(background, 0, 0, background.getWidth()*8, background.getHeight()*8, 0, 0, background.getWidth(), background.getHeight(), this);  
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX()/scale;
        int y = e.getY()/scale;
        System.out.println("before:"+background.getRGB(x, y));
        background.setRGB(x, y, 100);
        System.out.println("after:"+background.getRGB(x, y));

        self.repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    //    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void mouseExited(MouseEvent e) {
      //  throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

那就是我如何在框架中添加这个面板:

                File image = chooser.getSelectedFile();
                obraz = new noobPanel(image);

                scrollPanel= new JScrollPane(obraz);
                // 8 because i scale its 8 times bigger
                obraz.setPreferredSize(new Dimension(obraz.getWidth()*8, obraz.getHeight()*8));

                self.setSize(860, 640);
                self.add(scrollPanel);
                self.pack();
                self.revalidate();
                self.repaint();
你可以告诉我我做错了什么吗?感谢您的任何建议

1 个答案:

答案 0 :(得分:1)

您永远不会设置面板的大小(首选或其他)。所以新的Dimension(宽度* 8,高度* 8)仍然是0,0。

因此,您可以执行Andrew Thompson建议并覆盖getPreferredSize()或仅在面板构造函数中设置首选大小,可能是在加载图像后,因为这实际上很重要?

哦,为什么要定义比例然后不使用它?我说的是* 8而不是* scale。

另外:这有点偏离主题,但为什么要保留一个额外的参考“自我”?看起来像是不必要的开销......你可以在没有“自我”的情况下调用所有这些方法。在他们面前,即使你不能在那里已经有“this”关键字。我的意思是,它只有大约4个字节或者其他东西,但看起来很奇怪。