2017-09-14 116 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

是的,好點 - 謝謝。我會相應地編輯答案。 –