java - PaintComponent 方法混合不同的 JPanel 组件

标签 java jpanel jscrollpane paint paintcomponent

我正在开发一个软件,它可以为我的 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 会混合彼此绘制的组件。我想问一下,是否有人知道到底发生了什么?我认为:

  1. 这可能是因为我将绘画方法分开了,正如我们上面看到的:

    paintBackground();
    paintStave();
    paintNotes();
    

    然后,当软件开始绘制时,它会绘制第一个 JPanel 的某些部分(例如 paintBackground()),然后绘制桅杆吉他的某些部分( paintBackground()),然后它再次发生变化,结果是两者的混合。

    我认为这是因为它每次都会混合不同的部分,我的意思是它每次播放时的行为方式并不相同。

    我真的不希望这种情况发生,所以让我问你:我怎样才能制作原子方法来确保这不会成为问题?

  2. 我误解了滚动方法。我这样滚动:

    //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/

相关文章:

java - 如何在java中的泛型中给出And条件

java - 这个程序需要多个ArrayList吗?

Java - 创建 JPanel 数组会导致空指针异常

java - 将滚动条添加到 JList ,将 JList 添加到 JPanel

java - 如何通过两个帐户使用 AmazonSQS 监听器

java - Weblogic 中 2 只耳朵的 Log4j 日志记录问题

java - 如何让JPanel填满整个JFrame?

java - JTextArea 中是否可以具有非可变尺寸?

java - 打印 JscrollPane 对象

java jsscrollpane