참고 : 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 등을 시도했다.
아무에게도 도움이 될 수 있습니까?
나는 귀하의 게시물을 편집 한 관련이없는 정보를 제거하고 스윙 태그를 추가했습니다. JLayeredPane을 사용해 각 키를 나타내지 말아주세요. 역으로 동작합니다. 대신 하나의 JLayeredPane 하나를 사용하여 컴포넌트를 추가하는 것을 고려하십시오. 또, JLayerdPane의 paintComponent를 오버라이드 (override)하지 말아주세요. 또한 다른 구성 요소에서 paintComponent를 오버라이드 한 경우 항상 super 메소드를 호출하고 ** never ** 내부에서'repaint() '를 호출하십시오. Swing 튜토리얼을 읽어 보면 잘못하지 않을 것입니다. –