带有 BufferedImage 的 ScrollPane 不滚动

ScrollPane with BufferedImage is not scrolling

我正在制作程序,它将在滚动帧中显示放大的图片并允许用户更改缓冲图像的单个像素。我正在尝试将带有缓冲图像的面板添加到 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();

你能告诉我我做错了什么吗?感谢您的任何建议

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

因此,您可以按照 Andrew Thompson 的建议执行并覆盖 getPreferredSize(),或者只在面板构造函数中设置您的首选大小,可能是在加载图像之后,因为这才是真正重要的?

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

另外:这有点跑题了,但你为什么要保留额外的参考资料 "self"?似乎是不必要的开销......您可以在没有 "self." 的情况下调用所有这些方法,即使您不能调用它们,也已经有 "this" 关键字。我的意思是是的,它只有 4 个字节左右,但看起来很奇怪。