2016-06-14 13 views
-1

참고 : jFugue로 작업 중입니다. 첫 번째 흰색 키 프레임에 표시됩니다,하지만 다른 사람의 것도하지 않는다피아노 키 - 겹치지 않고 나타나지 않음

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; 
    } 
} 

:

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); 
    } 
} 

다음은 주요 클래스의 일부이다. 나는 JLayeredPane, OverlayLayout, GridLayout 등을 시도했다.

아무에게도 도움이 될 수 있습니까?

+1

나는 귀하의 게시물을 편집 한 관련이없는 정보를 제거하고 스윙 태그를 추가했습니다. JLayeredPane을 사용해 각 키를 나타내지 말아주세요. 역으로 동작합니다. 대신 하나의 JLayeredPane 하나를 사용하여 컴포넌트를 추가하는 것을 고려하십시오. 또, JLayerdPane의 paintComponent를 오버라이드 (override)하지 말아주세요. 또한 다른 구성 요소에서 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