Swing struktur und nahester Punkt

  • Themenstarter Themenstarter Lopsided
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
L

Lopsided

Gast
Hallo,

habe n kleines Programm geschrieben, bei dem mehrere Bälle in einem fenster erstellt und jeweils bewegt werden koennen.

Jframe(fenster)->JPanel(bereich in dem die Bälle gezeichnet werden) -> JComponent(jeder Ball ist ein JCom.)

Bälle werden auf linksClick gezeichnet und mit rechts bewegt.
Später soll die bälle auf anfrage auch ein kleines menue aufpoppen lassen(jeweils am ball) wo die farbe und der radius eingestellt werden kann)

1. Frage: Ist das sinnig das fenster so aufzubauen. soll ball wirklich eine Jcomponente sein und nicht eher panel ? Bin da nicht so fit wenns um Gui geht!
2. Frage: Hab n kleinen alg. geschrieben um den richtigen Ball zu bekommen (aus nem Vector) sobald die mouse drüber ist. Gibts da vieleicht ne bessere lösung....focus oder so bzw. kennt jemand einen saueberen algorithmus?

DAnke
 
Ich bin ja ein Verfechter der "Nicht-Jeder-Sprite-Muss-Eine-JComponent-Sein"-Philosophie (siehe auch die Diskussion und speziell den verlinkten Beitrag: http://www.java-forum.org/java-basi...694-pingpong-selber-schreiben.html#post394005 )

Die Überprüfung, welcher Ball von einem Mausklick getroffen wird, wäre aber im einfachsten Fall unabhängig von der Implementierung eine einfache Suche in der Liste (oder, wenn du's für nötig hältst, dem Vector) der alle Bälle enthält. Bei jedem Ball macht man dann eine Abfrage im Sinne von [c]ball.enthält(mausposition)[/c]...
 
Java:
public class Ball { 
    private Point center;
    private int radius;
   
    public Ball(Point center, int radius) {
        this.center = center;
        this.radius = radius;
    }

    public void move(int dx, int dy){ 
        center.x += dx;
        center.y += dy;
    }

    public boolean contains(Point p) {  return p.distanceTo(center) <= radius; }

    public boolean intersects(Ball b) {
        return center.distanceTo(b.center) <= radius + b.radius;
    }

    public void paint(Graphics g){
         g.fillOval(center.x - radius/2, center.y - radius/2, 2*radius, 2*radius);
    }
}
 
Zuletzt bearbeitet:
1. Frage: Ist das sinnig das fenster so aufzubauen. soll ball wirklich eine Jcomponente sein und nicht eher panel ? Bin da nicht so fit wenns um Gui geht!
2. Frage: Hab n kleinen alg. geschrieben um den richtigen Ball zu bekommen (aus nem Vector) sobald die mouse drüber ist. Gibts da vieleicht ne bessere lösung....focus oder so bzw. kennt jemand einen saueberen algorithmus?
JPanel bietet für deinen Zweck kaum mehr als JComponent. Interessanter könnte ein JLabel sein: es beinhaltet z.B. die Methode "setIcon" (für den Fall wo der Ball durch ein Bild dargestellt werden soll). Ein JPopupMenu kannst du einfach mit setComponentPopupMenu setzen. Es erscheint gewöhnlich auf Rechtsklick. Die Bälle können wir auch mit Linksklick bewegen (eigener MouseListener, dann erübrigt sich auch ein Algorithmus um den richtigen Ball zu bekommen). Ein eigener FocusListener ist auch interessant: wir können dann den Ball, der den Fokus hat, optisch hervorheben. Mit [c]ball.requestFocusInWindow();[/c] können wir dem Ball, der gerade erzeugt wurde, den Fokus geben. Und bei "mousePressed" geben wir dann dem Ball den Fokus, der gerade angeklickt wurde. Ein FokusListener könnte so aussehen:
Java:
ball.addFocusListener(new FocusListener() {
    public void focusGained(final FocusEvent e) {
        currentBall = ball;
        ball.setForeground(Color.RED);
    }
    public void focusLost(final FocusEvent e) {
        ball.setForeground(Color.BLACK);
    }
});
Ein Mousehandler für den Ball:
Java:
MouseAdapter mouseHandler = new MouseAdapter() {
    private Point pressedPoint;
    @Override
    public void mouseDragged(final MouseEvent e) {
        Point draggedPoint = e.getPoint();
        Point loc = ball.getLocation();
        loc.translate(draggedPoint.x - pressedPoint.x, draggedPoint.y - pressedPoint.y);
        ball.setLocation(loc);
    }
    @Override
    public void mousePressed(final MouseEvent e) {
        ball.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
        pressedPoint = e.getPoint();
        ball.requestFocusInWindow();
    }
    @Override
    public void mouseReleased(final MouseEvent e) {
        ball.setCursor(Cursor.getDefaultCursor());
    }
};
 
ihr seit krass.....
vielen dank erstmal , werd jetzt erstmal drüber nachdenken🙂
thx
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben