java - 在 JScrollPane 中重新绘制 JPanel 时闪烁

标签 java graphics

我在重新绘制 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/

相关文章:

java - AttributedString的 "content"可以保存在文件中吗?

java - 如何将 2 个 Point3f 数组连接在一起?

java - 为什么以下代码仅适用于 GridLayout?

java - XAMPP Tomcat/启动 Tomcat 时出错

java - 如果它已经在客户端类路径中,为什么我必须为每个 JNDI 查找 EJB stub ?

java - 如何在一个方法(函数A)中编写对另一个不接收参数的类(类别1)中的方法(函数)的调用?

algorithm - 如何可视化音频数据?

java - 使用 GROOVY SQL 从 SQL SERVER 存储过程获取结果集

java - 转换为父对象会更改对象引用?

WPF/XAML - 文本可以自动调整大小吗?