我有一個JPanel與JScrollPane sorounding它,問題是,當我使用JScrollPane的JPanels重繪方法被調用。我想禁用它,因爲我的JPanel在正確的時間通過自己重繪。停止JScrollPane從重繪JPanel
我想要它,所以它只是更新了paint方法的getClipBounds(),但是調用了paint方法。
我有一個JPanel與JScrollPane sorounding它,問題是,當我使用JScrollPane的JPanels重繪方法被調用。我想禁用它,因爲我的JPanel在正確的時間通過自己重繪。停止JScrollPane從重繪JPanel
我想要它,所以它只是更新了paint方法的getClipBounds(),但是調用了paint方法。
你不能那麼做 - 因爲視口顯示包含的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);
}
您應該將'this'作爲'imageObserver'參數傳遞給'drawImage' - 純粹按照慣例 – MadProgrammer
是的,好點 - 謝謝。我會相應地編輯答案。 –
這可能幫助,林不知道, https://stackoverflow.com/questions/1249278/how-to-disable-the-default-painting-behaviour-of-wheel-scroll-event-on-jscrollpa – Blasanka
我也發現,但它劑量幫助,因爲該方法不要禁用它。 – TheSorm
不是API如何工作 - 相反,當面板內容發生變化時,將面板的內容繪製到「BufferedImage」,並在paintComponent被調用時簡單地繪製該面板。 – MadProgrammer