停止JScrollPane从重绘JPanel
我有一个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