我正在开发一个软件,它可以为我的 GUI 绘制 2 个不同的 JPanel
:乐谱和桅杆吉他。分数是一个扩展 JPanel
的类,并具有 paintComponent()
方法,如下所示:
public class PanelPartitura extends JPanel implements MouseListener{
public void paintComponent(Graphics comp){
super.paintComponent(comp);
comp2D = (Graphics2D)comp;
comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
paintBackground();
paintStave();
paintNotes();
[...]
}
}
桅杆吉他也是一类:
public class PanelGuitarra extends JPanel implements MouseListener
public void paintComponent(Graphics comp){
super.paintComponent(comp);
comp2D = (Graphics2D)comp;
comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//Then I call secondary methods to paint it:
paintBackground();
PaintPoints();
}
[...]
}
它仍然工作正常。我将 PanelPartitura
类添加到 JScrollPane
中,以便在播放时滚动:
partitura = new PanelPartitura();
JScrollPartitura = new JScrollPane(partitura, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
当软件播放和滚动时,两个 JPanel
会混合彼此绘制的组件。我想问一下,是否有人知道到底发生了什么?我认为:
这可能是因为我将绘画方法分开了,正如我们上面看到的:
paintBackground(); paintStave(); paintNotes();
然后,当软件开始绘制时,它会绘制第一个
JPanel
的某些部分(例如paintBackground()
),然后绘制桅杆吉他的某些部分(paintBackground()
),然后它再次发生变化,结果是两者的混合。我认为这是因为它每次都会混合不同的部分,我的意思是它每次播放时的行为方式并不相同。
我真的不希望这种情况发生,所以让我问你:我怎样才能制作原子方法来确保这不会成为问题?
我误解了滚动方法。我这样滚动:
//the note playing currently position is saved in positionBar positionBar = 150 + 50*PGuitarra.composicion.getAcordeSeleccionado().getPosicionXAcorde(); //horizontalScrollBar is moved to this position PGuitarra.JScrollPartitura.getHorizontalScrollBar().setValue(positionBar);
最佳答案
我发现您的绘制方法没有使用相同的 Graphics 对象(在 JPanel 范围内)。难道是这个原因吗?如果是,请尝试将 comp(Graphics 对象)作为参数传递给paintBackground、paintStave 和paintNotes。
关于java - PaintComponent 方法混合不同的 JPanel 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21268190/