2017-09-14 155 views
0

我有一个JPanel与JScrollPane sorounding它,问题是,当我使用JScrollPane的JPanels重绘方法被调用。我想禁用它,因为我的JPanel在正确的时间通过自己重绘。停止JScrollPane从重绘JPanel

我想要它,所以它只是更新了paint方法的getClipBounds(),但是调用了paint方法。

+0

这可能帮助,林不知道, https://stackoverflow.com/questions/1249278/how-to-disable-the-default-painting-behaviour-of-wheel-scroll-event-on-jscrollpa – Blasanka

+0

我也发现,但它剂量帮助,因为该方法不要禁用它。 – TheSorm

+0

不是API如何工作 - 相反,当面板内容发生变化时,将面板的内容绘制到“BufferedImage”,并在paintComponent被调用时简单地绘制该面板。 – MadProgrammer

回答

0

你不能那么做 - 因为视口显示包含的JPanel的不同部分,这取决于滚动条的位置,所以必须重新绘制的区域实际上可能是新显示的,并且可能以前没有绘制过。

由于JScrollPane不知道如何所含Component实施,以及它是否重绘其整个区域或只需要重新绘制的区域,它迫使包含Component重绘自身在滚动。

但是,您可以改为将要显示的内容呈现为位图,然后在paintComponent(Graphics)方法中绘制位图。因此,您可以有效地缓存绘制的内容,并可以在适合您时启动对缓冲位图的更新。

为了绘制到一个位图,你可以这样做:

BufferedImage buffer; // this is an instance variable 

private void updateBuffer(){ 
    // Assuming this happens in a subclass of JPanel, where you can access 
    // getWidth() and getHeight() 
    buffer=new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics g=buffer.getGraphics(); 
    // Draw into the graphic context g... 
    g.dispose(); 
} 

然后,在你的JPanel,你覆盖paintComponent方法:

public void paintComponent(Graphics g){ 
    g.drawImage(buffer, 0, 0, this); 
} 
+0

您应该将'this'作为'imageObserver'参数传递给'drawImage' - 纯粹按照惯例 – MadProgrammer

+0

是的,好点 - 谢谢。我会相应地编辑答案。 –