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