我在重新绘制 JScrollPane 内的 JPanel 时遇到问题。
基本上,我只是想将现有的 EditPanel(它最初扩展为 JPanel)“包装”到 JScrollPane 中。
似乎 JPanel 更新过于频繁(大量闪烁)。我将如何阻止这种情况发生?我尝试使用 setIgnoreRepaint() 但它似乎没有做任何事情。
当前的实现是否有效,或者我是否需要创建另一个内部类来微调我用来显示图形的 JPanel?
骨架代码:
public class MyProgram extends JFrame{
public MyProgram(){
super();
add(new EditPanel());
pack();
}
private class EditPanel extends JScrollPane{
private JPanel graphicsPanel;
public EditPanel(){
///EDIT, sorry, should have mentioned this was here before
super();
graphicsPanel = new JPanel();
this.setViewportView(graphicsPanel);
//END EDIT
}
public void paintComponent(Graphics g){
graphicsPanel.revalidate(); //update the scrollpane to current panel size
repaint();
Graphics g2 = graphicsPanel.getGraphics();
g2.drawImage(imageToDraw, 0, 0, null);
}
}
}
最佳答案
切勿在绘画方法中调用 revalidate() 或 repaint()。您正在导致无限重绘循环。
根本不需要扩展 JScrollPane。你永远不应该仅仅为了向它添加一个组件而扩展这个类。这就是 setViewportView(...) 方法的用途。
如果您确实有自定义绘画,那么您可以扩展 JPanel 并覆盖面板的 paintComponent() 方法。
然后,如果您需要重新绘制面板,您只需调用 panel.repaint()。
关于java - 在 JScrollPane 中重新绘制 JPanel 时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572459/