2016-06-14 27 views
-1

注:我正在使用jFugue。鋼琴鍵 - 不重疊,現在不顯示

public class Piano extends JFrame implements KeyListener { 
    ArrayList<Keys> keys = new ArrayList<Keys>(); 
    Player playNote = new Player(); 

    public Piano() { 
     drawGrid(); 
     this.addKeyListener(this); 
     this.setVisible(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 
    } 
    public void drawGrid() { 
     pane = new JLayeredPane(); 
     this.setLayout(null); 

     keys.add(new Key(new Rectangle(0, 0, 50, 300), new Pattern("V0 I[Piano] C5q"), Color.white)); 
     keys.add(new Key(new Rectangle(25, 0, 25, 180), new Pattern("V0 I[Piano] C#5q"), Color.white)); 
     keys.add(new Key(new Rectangle(50, 0, 50, 300), new Pattern("V0 I[Piano] D5q"), Color.white)); 
     keys.add(new Key(new Rectangle(75, 0, 25, 180), new Pattern("V0 I[Piano] D#5q"), Color.white)); 
     keys.add(new Key(new Rectangle(100, 0, 50, 300), new Pattern("V0 I[Piano] E5q"), Color.white)); 
     keys.add(new Key(new Rectangle(150, 0, 50, 300), new Pattern("V0 I[Piano] F5q"), Color.white)); 
     keys.add(new Key(new Rectangle(175, 0, 25, 180), new Pattern("V0 I[Piano] F#5q"), Color.white)); 
     keys.add(new Key(new Rectangle(200, 0, 50, 300), new Pattern("V0 I[Piano] G5q"), Color.white)); 
     keys.add(new Key(new Rectangle(225, 0, 25, 180), new Pattern("V0 I[Piano] G#5q"), Color.white)); 
     keys.add(new Key(new Rectangle(250, 0, 50, 300), new Pattern("V0 I[Piano] A5q"), Color.white)); 
     keys.add(new Key(new Rectangle(275, 0, 25, 180), new Pattern("V0 I[Piano] A#5q"), Color.white)); 
     keys.add(new Key(new Rectangle(300, 0, 50, 300), new Pattern("V0 I[Piano] B5q"), Color.white)); 

     this.add(keys.get(0)); 

     for (Key w: keys) { 

      w.setBounds(w.getRectangle()); 
      this.getContentPane().add(w); 

      w.addMouseListener(w); 
      w.setPlayer(playNote); 

     } 

    } 

    public static void main(String[] args) { 
     Piano yamaha = new Piano(); 
     yamaha.setSize(1000, 500); 
    } 
} 

這裏的關鍵是類的一部分:

public class Key extends JLayeredPane implements MouseListener { 
    Player player; 
    Rectangle rectangle; 
    Pattern pattern; 
    Color color; 

    public Key(Rectangle r, Pattern p, Color c) { 
     rectangle = r; 
     pattern = p; 
     color = c; 
    } 

    public void paintComponent(Graphics g) { 
     g.setColor(color); 
     g.fillRect((int) rectangle.getX() - 1, (int) rectangle.getY() - 1, (int) rectangle.getWidth() - 1, (int) rectangle.getHeight() - 1); 
     g.setColor(Color.BLACK); 
     g.drawRect((int) rectangle.getX(), (int) rectangle.getY(), (int) rectangle.getWidth() - 1, (int) rectangle.getHeight() - 1); 
     repaint(); 
    } 

    public Rectangle getRectangle() { 
     return rectangle; 
    } 

    public void setRectangle(Rectangle rectangle) { 
     this.rectangle = rectangle; 
    } 
} 

第一個白鍵會在框架上顯示,但沒有其他人做。我試過JLayeredPane,OverlayLayout,GridLayout等等。

任何人都可以給我一些幫助嗎?

+1

我已經編輯好後,已經刪除了不相關的信息,並添加了吊牌。請注意,您不應該使用JLayeredPane來表示每個密鑰,因爲這是反向工作。請考慮使用One一個JLayeredPane並向其添加組件。也不要重寫JLayerdPane的paintComponent。此外,如果您曾在其他組件中重寫paintComponent,則始終調用super的方法,並且從不**從其中調用repaint()。閱讀Swing教程,因爲它們不會導致你錯誤。 –

回答

2

如果你要做自定義繪畫,那麼你只會覆蓋JPanel的paintComponent(...)方法。這個面板(不是JFrame)應該包含你的「keys」ArrayList。然後,paintComponent(...)方法會遍歷你的「keys」ArrayList,將每個鋼琴鍵畫在適當的位置。

查看Custom Painting Approaches中找到的DrawOnComponent示例,瞭解這種類型繪畫方法的示例。

然後,對於您的MouseListener代碼,您將通過反向遍歷「keys」ArrayList來查找包含鼠標點的鍵。所以你只需使用Rectangle.contains(...)方法來確定哪個鍵被點擊。

或者另一種方法是將真實的Swing組件添加到面板。然後,您不必執行任何自定義繪畫或搜索邏輯來確定哪個鍵被按下。所有你需要擔心的是每個組件的佈局。

對於這種方法的一個例子看看:How to create a Piano using JScrollPane and JLayeredPane