Java 在JScrollPane内重新绘制JPanel时闪烁

Java 在JScrollPane内重新绘制JPanel时闪烁,java,graphics,Java,Graphics,我在JScrollPane中重新绘制JPanel时遇到问题 基本上,我只是尝试将我现有的EditPanel(它最初扩展了JPanel)包装到一个JScrollPane中 JPanel似乎更新太频繁(大量闪烁)。我怎样才能阻止这一切的发生?我尝试使用setIgnoreRepaint(),但它似乎没有任何作用 这个当前的实现是否有效,或者我是否需要创建另一个内部类来微调我用来显示图形的JPanel 骨架代码: public class MyProgram extends JFrame{ p

我在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);
        }
    }
}

如果您试图实现可滚动区域,我怀疑子类化
JScrollPane
和重写
paintComponent()
可能是导致问题的原因。为了检查,我假设您知道,为了向滚动窗格添加内容,您可以:

Scrollpane.getViewPort().add(JComponent);
如果没有,请查看和JScrollPane。我以前从未见过任何人将JScrollPane子类化

当然,我可能错了。我很快就会知道的


我个人发现,当事情变得复杂时,Swing在重新绘制时总是稍微滞后,但从不“大量闪烁”。

嗯。为什么要将JScrollPane子类化?如果我这样做,我会将JPanel或JTable子类化,并将我的类包装在JScrollPane中:

JTable table = new MySpecialJTable();
JScrollPane scrollPane = new JScrollPane(table);
Component container = /* scrollPane goes in here, set the size of scrollPane
       yourself or let a layout manager do that for you */
container.add(scrollPane);
切勿在绘制方法内调用revalidate()或repaint()。您正在导致无限重绘循环

根本不需要扩展JScrollPane。绝不能仅仅为了向类添加组件而扩展类。这就是setViewportView(…)方法的用途

如果您有自定义绘制,那么可以扩展JPanel并覆盖面板的paintComponent()方法


然后,如果需要重新绘制面板,只需调用panel.repaint()。

感谢您解释为什么它不起作用。最初我让EditPanel扩展JFrame,但因为我创建了多个实例,并且每个实例都在一个JScrollPane中,所以我认为将JScrollPane集成到对象中会更紧凑。我将回到扩展JFrame。