2012-04-10 114 views
1

我嘗試使chord鍵盤模擬。 我無法解決鍵盤中的KeyboardButtons沒有繪製的原因。我在Keyboard中有更多的KeyboardButtons。鼠標正確聽取,但多邊形不繪。java swing - paint jcomponent

當我調用鍵盤的paintComponent()中的每個KeyboardButton的繪畫時,多邊形都被繪製,但不會改變mousePressed上的顏色。

Keyboard.java

package keyboard; 


import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.Polygon; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import javax.swing.JComponent; 
import javax.swing.JPanel; 

public class Keyboard extends JPanel implements MouseListener{ 

    Point[] leftFingers; 
    Point leftCenter = new Point(300, 600); 
    KeyboardButton[] buttons; 

    public Keyboard(Point left1, Point left2, Point left3, Point left4, Point left5) { 
    leftFingers = new Point[5]; 
    leftFingers[0] = left1; 
    leftFingers[1] = left2; 
    leftFingers[2] = left3; 
    leftFingers[3] = left4; 
    leftFingers[4] = left5; 
    buttons = registerKeys(); 
    addMouseListener(this); 
    } 

    public KeyboardButton[] registerKeys() { 
    Polygon[] polygons = generateKeyPolygons(calculateBordersOfKeys(leftFingers)); 
    KeyboardButton[] buttons = new KeyboardButton[5]; 
    for (int i = 0; i < polygons.length; i++) { 
     buttons[i] = new KeyboardButton(polygons[i]); 

    } 
    return buttons; 
    } 

    private Point[] calculateBordersOfKeys(Point[] fingers) { 
    Point[] centers = calculateCentersBetweenEachTwoFingers(fingers); 
    Point[] result = new Point[6]; 

    result[0] = calculateCentralSymmetry(centers[0], fingers[0]); 
    System.arraycopy(centers, 0, result, 1, centers.length); 
    result[5] = calculateCentralSymmetry(centers[3], fingers[4]); 
    return result; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(Color.red); 
    g.drawOval(leftCenter.x - 25, leftCenter.y - 25, 50, 50); 

    for (int i = 0; i < leftFingers.length; i++) { 
     g.drawOval(leftFingers[i].x, leftFingers[i].y, 10, 10); 

    } 
    } 


    private Polygon[] generateKeyPolygons(Point[] borders) { 
    Polygon[] polygons = new Polygon[5]; 
    for (int i = 0; i < borders.length - 1; i++) { 
     Polygon p = new Polygon(); 
     p.addPoint(leftCenter.x, leftCenter.y); 
     p.addPoint(borders[i].x, borders[i].y); 
     p.addPoint(borders[i + 1].x, borders[i + 1].y); 
     polygons[i] = p; 
    } 

    return polygons; 
    } 

    private Point[] calculateCentersBetweenEachTwoFingers(Point[] fingers) { 
    Point[] centers = new Point[4]; 
    for (int i = 0; i < fingers.length - 1; i++) { 
     centers[i] = new Point(((fingers[i].x + fingers[i + 1].x)/2), ((fingers[i].y + fingers[i + 1].y)/2)); 
    } 
    return centers; 
    } 

    private Point calculateCentralSymmetry(Point toReflected, Point center) { 
    Point reflection = new Point(); 

    if (toReflected.x > center.x) { 
     reflection.x = center.x - Math.abs(center.x - toReflected.x); 
    } else { 
     reflection.x = center.x + Math.abs(center.x - toReflected.x); 
    } 

    if (toReflected.y > center.y) { 
     reflection.y = center.y - Math.abs(center.y - toReflected.y); 
    } else { 
     reflection.y = center.y + Math.abs(center.y - toReflected.y); 
    } 

    return reflection; 
    } 

    public void mouseClicked(MouseEvent e) { 

    } 

    public void mousePressed(MouseEvent e) { 
    for (KeyboardButton button : buttons) { 
     button.checkMousePosition(e); 
    } 
    } 

    public void mouseReleased(MouseEvent e) { 
    for (KeyboardButton button : buttons) { 
     button.checkMousePosition(e); 
    } 
    } 

    public void mouseEntered(MouseEvent e) { 

    } 

    public void mouseExited(MouseEvent e) { 

    } 


} 

KeyboardButton.java

package keyboard; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Polygon; 
import java.awt.event.*; 
import javax.swing.JComponent; 
import javax.swing.JPanel; 

public class KeyboardButton extends JComponent { 

    Polygon polygon; 
    boolean isActive; 
    final Color ACTIVE_COLOR = Color.red; 
    final Color INACTIVE_COLOR = Color.blue; 

    public KeyboardButton(Polygon p) { 
    polygon = p; 
    } 

    public void checkMousePosition(MouseEvent e) { 
    if (polygon.contains(e.getX(), e.getY())) { 
     setState(true); 
    } 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(isActive ? ACTIVE_COLOR : INACTIVE_COLOR); 
    g.drawPolygon(polygon); 
    } 

    void setState(boolean state) { 
    isActive = state; 
    System.out.println(this.hashCode()); 
    repaint(); 

    } 
} 

回答

3

據我所知道的,KeyboardButton組件沒有被加入到Keyboard。所以,當他們調用repaint()時,它不起作用,因爲它們不是視圖層次結構的一部分。

+0

我該如何添加它?我曾嘗試在Keyboard構造器(或其他方法)中調用add(KeyboardButton a),但沒有任何效果... – 2012-04-10 19:13:21

+0

如果您需要按鈕是組件,則必須將它們添加到鍵盤並以某種方式設置它們的邊界佈局經理或絕對定位),以便他們在適當的地方畫畫。但是看看你的代碼,看起來只要按鈕不是組件就可以更簡單,只需要簡單的Java對象,它們可以繪製到「鍵盤」組件中,並在修改它時重新繪製它。 – 2012-04-10 19:32:45