内部内容显示然后在JScrollPane中消失

时间:2018-07-07 12:04:35

标签: java swing jpanel jscrollpane

我的问题与一个带有内部JScrollPane的{​​{1}}有关。我尝试在JPanel上绘画,但是它会短暂出现,然后消失,直到我手动移动JPanel,然后再次出现并保持稳定。为避免手动干预(或在实际代码中难以管理的HorizontalScrollBar),我在HorizontalScrollBar.setValuevalidate/revalidate上尝试了JPanel(及更多), ViewportJScrollPane

下面的(非常)简化的代码重现了该问题。可能很明显,但我看不到。

JFrame

1 个答案:

答案 0 :(得分:1)

代码有些错误,这里是固定代码。有关说明,请参见代码下面的要点。

public class RenderZone extends JPanel {

    private static final long serialVersionUID = -8240875812801921009L;

    private BufferedImage image = null;
    private BufferedImage sub = null;

    public RenderZone() {
        this.setBackground(Color.WHITE);
        this.setPreferredSize(new Dimension(1124, 768));// added 100 for test purpose
        image = new BufferedImage(2000, 1000, BufferedImage.TYPE_INT_RGB);
        sub = image.getSubimage(0, 0, 1024, 768);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);// pour repeindre la panel à chaque fois
        if (sub != null) {
            g.drawImage(sub, 0, 0, this);
        }
    }
}

好..

  1. Graphics2D g2 = (Graphics2D)this.getGraphics();当您已经有一个有效的Graphics实例时,很难确定为什么认为这是一个好主意。但基本上,请使用提供的Graphics实例。
  2. ImageIO.read(..);读图像不是不是,任何绘画方法都应该这样做。应该将它一次加载到类的构造函数中。
  3. sub = image.getSubimage(0, 0, 1024, 768);同样,并不是每次调用画图时您都想做的事情,实际上,最好在照片编辑软件中以合适的尺寸创建图像,然后加载裁剪后的图片。
  4. } catch (IOException e) {}不要忽略异常!他们确切地告诉我们出了什么问题。除非实施了日志记录,否则至少调用Throwable.printStackTrace()
  5. if( sub!=null)g2.drawImage(sub, 0, 0, null);由于每个JComponent 都是 ImageObserver,因此应该为
    if( sub!=null)g2.drawImage(sub, 0, 0, this);

还有一些可疑但不是眼前问题的东西,所以它们没有改变:

  1. // pour repeindre la panel à chaque fois用..法语编写该代码注释(仅供人类食用)的目的是什么?请用英语输入针对此站点的代码注释。否则它们就是噪音。
  2. this.setPreferredSize(new Dimension(1124, 768));最好是重写getPreferredSize()并根据sub图片的大小(如直接从中获取的数字)返回一个值。
  3. mainPane.setPreferredSize(new Dimension(1024, 768));mainPane.pack();更好。后者不是猜测,将说明子组件的首选大小。