java - JScrollPane 为空白,直到您滚动。

标签 java swing scroll pane

我在框架中实现了像这样的 JScrollPane:

public ImagePanel imgPane = new ImagePanel();    
JScrollPane scrollPane = new JScrollPane(imgPane);

ImagePanel 是 JPanel 的扩展:

public class ImagePanel extends JPanel {

private BufferedImage img;

public ImagePanel(BufferedImage img) {
    this.img = img;
}
public ImagePanel() {

}

@Override
public Dimension getPreferredSize() {
    return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
}

protected Point getImageLocation() {

    Point p = null;
    if (img != null) {
        int x = (getWidth() - img.getWidth()) / 2;
        int y = (getHeight() - img.getHeight()) / 2;
        p = new Point(x, y);
    }
    return p;

}
public void setImage(BufferedImage bi) {
    img = bi; 
}
public Point toImageContext(Point p) {
    Point imgLocation = getImageLocation();
    Point relative = new Point(p);
    relative.x -= imgLocation.x;
    relative.y -= imgLocation.y;
    return relative;
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (img != null) {
        Point p = getImageLocation();
        g.drawImage(img, p.x, p.y, this);
    }
}

我遇到的问题是,当我将图像加载到 Pane 中时:

frame.imgPane.setImage(img);

除非前一个图像大小相同,否则该 Pane 将显示为空白,没有图像,直到您滚动为止。 imgPane.repaint() 对此没有影响。有没有办法让 JScrollPane 调整到新图像而无需用户滚动?

谢谢

最佳答案

setImage(...) 方法还应该调用:

img = bi; 
revalidate(); // to invoke the layout manager
repaint();  // paint itself

关于java - JScrollPane 为空白,直到您滚动。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32813482/

相关文章:

java - 为什么 Java 使用的内核比我要求的多?

Java Swing - 可滚动面板

java - Swing JButton 的圆角 Swing 没有实际 JButton 的功能

javascript - 检测固定位置的 div 是否在特定的 div 上滚动

html - 具有固定标题和动态高度的表格

android - 以编程方式流畅地滚动 ListView

java - 如何删除包含Java中其他文件夹的文件夹?

java - 在 Jetty 中部署 jar

java - Jersey:禁用默认的 JSON 提供程序

Java GUI 和 SwingWorker 类的多个实例