我在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);
}
}
}
答案 0 :(得分:3)
永远不要在绘画方法中调用revalidate()或repaint()。你正在造成一个无限重绘循环。
根本不需要扩展JScrollPane。你永远不应该扩展该类只是为了添加一个组件。这就是setViewportView(...)方法的用途。
如果你有自定义绘画,那么你扩展JPanel并覆盖面板的paintComponent()方法。
然后,如果您需要重新绘制面板,只需调用panel.repaint()。
答案 1 :(得分:1)
嗯。为什么要将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);
答案 2 :(得分:0)
如果您正在尝试实现可滚动区域,我怀疑继承JScrollPane
并覆盖paintComponent()
可能会导致问题。只是为了检查,我假设您知道为了向滚动窗格添加内容,您可以:
Scrollpane.getViewPort().add(JComponent);
如果没有,请查看JScrollPane和how to use JScrollPane。我以前从未见过任何人将JScrollPane子类化。
我当然错了。我很快就会发现。
我个人觉得当事情变得复杂时,Swing总是略微重新涂抹,但从不“大规模闪烁”。