2016-06-14 10 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

私は、あなたのポストを編集した無関係な情報を削除したとSwingタグを追加しました。各キーを表すためにJLayeredPaneを使用するべきではないことに注意してください。代わりに、1つ1つのJLayeredPaneを使用してコンポーネントを追加することを検討してください。また、JLayerdPaneのpaintComponentをオーバーライドしないでください。また、他のコンポーネントでpaintComponentをオーバーライドする場合は、常にsuperのメソッドを呼び出し、** never **その内部から '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

関連する問題