Wenn Mauszeiger in der Nähe vom Kreis, soll Kreis an eine andere Stelle springen

Status
Nicht offen für weitere Antworten.

kenux

Mitglied
Hallo,

in meinem AWT/Swing-Programm soll beim Start ein Kreis sein. Wenn man mit dem Mauszeiger sich dem Kreis bis auf wenige Pixel nähert, soll der Kreis an eine zufällig generierte Stelle springen.
Ich habe schonmal folgenden Code geschrieben, aber leider weiß ich jetzt nicht wie ich das alles weiterführen kann:

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;


// Klasse MausPunktFarbe
class Kreis2 extends JFrame {
	
	// Konstruktor
	public Kreis2() 
	{
		// setzt Fenstertitel
		super("Kreis2");
		// Hintergrundfarbe
		setBackground(Color.white);
		// Groesse Panel
		setSize(new Dimension(300, 300));
		// Fenstergroesse nicht veraenderbar
		setResizable(false);
		// Reaktion auf Programm beenden
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// Instanz von Panel
		Panel malen = new Panel();
		// Panel ins Zentrum setzen
		add(malen, BorderLayout.CENTER);
		// den Frame anzeigen
		setVisible(true);
	}

public static void main(String[] args) {
	// erzeuge eine neue Instanz des MausPunktFarbe-JFrames
	new Kreis2();	
	}
}// Ende Klasse;


// Klasse Panel
class Panel extends JPanel implements MouseListener {
	
	private int z_x;
	private int z_y;
	
	// Konstruktor
	public Panel() 
	{
		// MouseListener hinzufuegen
		addMouseListener(this);
	}
	
	public void paint(Graphics g) {
    setBackground(Color.white);

    // Kreis zeichnen
    //g.setColor(Color.black);
    //g.fillOval(60,60,20,20);
	
	
	// Zufallsstelle
	z_x = (int) (Math.random()*30);
	z_y = (int) (Math.random()*30);
	g.fillOval(z_x,z_y,20,20);
	
  }
	
	// Maus-Klick-Event
	public void mouseEntered(MouseEvent me) 
	{
		int mx = me.getX();
		int my = me.getY();
		
		// Maustaste links
		if (z_x == MouseEvent.BUTTON1 && z_y == MouseEvent.BUTTON1) {
			
			//repaint();
			System.out.println("Hallo");
		}
	
	}
	
// Dummies
public void mousePressed(MouseEvent me) {}
public void mouseReleased(MouseEvent me) {}
public void mouseClicked(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
}//Ende Klasse;
 

manunana89

Mitglied
Theoretisch könntest du nach Berührung des Kreises oder Balles doch einfach die Variablen z_x und z_y per random neu bestimmen lassen und den Ball neu zeichen lassen.
 

Ebenius

Top Contributor
Anmerkungen zu Deinem Beispiel oben:
  • Dein Panel ist ein JComponent-Derivat. Überschreib nicht paint sondern paintComponent zum Zeichnen.
  • Zeile 52 ist unsinn. Die Hintergrundfarbe einer Komponente setzt man nicht in der paint/paintComponent-Methode. Außerdem zeichnet die Komponente überhaupt keinen Hintergrund, weil Du die super-paint-Methode nicht aufrufst (und den Hintergrund auch nicht selbst zeichnest). So in etwa sollte die paint-Methode aussehen:
    [java=51]protected void paintComponent(Graphics g) {
    super.paintComponent(g); // paints the background

    // Kreis zeichnen
    //g.setColor(Color.black);
    //g.fillOval(60,60,20,20);


    // Zufallsstelle
    z_x = (int) (Math.random()*30);
    z_y = (int) (Math.random()*30);
    g.fillOval(z_x,z_y,20,20);

    }[/code]
    Die Farbe kann man dann im Konstruktor setzen:
    [java=44]// Konstruktor
    public Panel()
    {
    // MouseListener hinzufuegen
    addMouseListener(this);
    setBackground(Color.WHITE);
    }[/code]
  • Zeile 73 funktioniert so auch nicht. So prüft man, ob die linke Maustaste gedrückt wurde: [java=72]// Maustaste links
    if (SwingUtilities.isLeftMouseButton(me)) {[/code]
    Alternativ kann man auch ohne die Utilities-Klasse prüfen (sollte man sich aber sparen): [java=72]// Maustaste links
    if ((anEvent.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {[/code]

wie kann ich denn z.b. abfragen ob mit dem Mauszeiger genau auf den Kreis geklickt wurde?
Ich würde dazu das Paket java.awt.geom benutzen. Dieses Paket bietet Dir einfache graphische Objekte. Die Objekte lassen sich zeichnen, können aber auch überprüfen, ob sie sich mit anderen Objekten schneiden, ob ein Punkt im inneren des Objektes liegt, usw. Dazu würdest Du die Member-Variablen z_x und z_y durch ein Arc2D.Float ersetzen. Hier mal ein Beispiel mit einem zentrierten Kreis in einem Frame. Wenn die Maus gedrückt, bewegt, ... wird, gibt's auf der Konsole die Information, ob der Zeiger sich im Kreis oder außerhalb befindet:
Java:
/* (@)CirclePaint.java */

/* Copyright 2009 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Arc2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class CirclePaint extends JPanel
  implements MouseListener, MouseMotionListener {

  private Arc2D.Float circle;

  /** Creates a new {@code CirclePaint}. */
  public CirclePaint() {
    circle = new Arc2D.Float(0, 0, 20, 20, 0, 360, Arc2D.CHORD);
    addMouseListener(this);
    addMouseMotionListener(this);
  }

  @Override
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    circle.x = (getWidth() - circle.width) / 2;
    circle.y = (getHeight() - circle.height) / 2;

    final Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(getForeground());
    g2d.fill(circle);
  }

  // -------------------------------------------------------------------------
  // Implementing MouseListener
  // -------------------------------------------------------------------------

  public void mouseClicked(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Clicked: " + inOrOut);
  }

  public void mouseEntered(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Entered: " + inOrOut);
  }

  public void mouseExited(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Exited: " + inOrOut);
  }

  public void mousePressed(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Pressed: " + inOrOut);
  }

  public void mouseReleased(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Released: " + inOrOut);
  }

  // -------------------------------------------------------------------------
  // Implementing MouseMotionListener
  // -------------------------------------------------------------------------

  public void mouseDragged(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Dragged: " + inOrOut);
  }

  public void mouseMoved(MouseEvent e) {
    final String inOrOut =
          circle.contains(e.getPoint()) ? "Inside" : "Outside";
    System.out.println("Moved: " + inOrOut);
  }

  // -------------------------------------------------------------------------
  // Program Entry Point
  // -------------------------------------------------------------------------

  /**
   * Test main method.
   * 
   * @param args ignored
   */
  public static void main(String[] args) {
    final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
    contentPane.add(new CirclePaint());

    final JFrame f = new JFrame("Test Frame: CirclePaint"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }
}
Ich hoffe, das hilft Dir weiter.

Ebenius
 

kenux

Mitglied
Vielen Dank, jetzt weiß ich zumindestens wie es funktioniert.

Noch eine Frage, wie kann mi Hilfe "mouseEntered" den Kreis an eine andere Stelle springen lassen, wenn sich der Mauszeiger dem Kreis nähert (nicht berührt) ?
 

Ebenius

Top Contributor
mouseEntered ist dabei wohl der falsche Event. mouseEntered bedeutet, dass der Mauszeiger die Komponente (also die Panel-Instanz) betritt. Du willst sicher mouseMoved (aus dem MouseMotionListener) verwenden.

Was bedeutet denn "nähern"? Meinst Du, wenn der Mauszeiger genau fünf Pixel vom Rand des Kreises weg ist? Mach Dir doch einfach einen zweiten Kreis mit dem selben Zentrum und größerer Ausdehnung und frag dann diesen zweiten Kreis, ob der Mauspunkt innerhalb dessen liegt.

Ebenius
 

kenux

Mitglied
ja genau, also sagen wir mal der Mauszeiger nähert sich dem Kreisrand um 5 pixel zu, dann soll der Kreis an eine andere Stelle springen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
N JFrame löscht alles, wenn groß gemacht AWT, Swing, JavaFX & SWT 9
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
CptK windowClosed() nur aufrufen, wenn Fenster nicht über Button geschlossen wird AWT, Swing, JavaFX & SWT 1
VPChief Buttons Reagieren erst wenn ich Fenster minimiere AWT, Swing, JavaFX & SWT 4
Cromewell JavaFX ImageView vergößern wenn hovered AWT, Swing, JavaFX & SWT 2
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
ralfb1105 JavaFX ProgressIndicator Meldung wenn Task failed AWT, Swing, JavaFX & SWT 5
C JTextField Inhalt mit Maus selektieren wenn disabled AWT, Swing, JavaFX & SWT 2
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
K Swing JScrollPane wird nicht angezeigt wenn man Components darstellt. AWT, Swing, JavaFX & SWT 2
S JavaFX Fenster aufkommen lassen, wenn mit der Maus über bestimmten Bereich fahren AWT, Swing, JavaFX & SWT 1
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
J Event Handling Button "enablen" wenn Eingaben in Textfeldern korrekt sind AWT, Swing, JavaFX & SWT 1
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
E [JavaFX]Wenn felder belegt dann Meldung Verwerfen? AWT, Swing, JavaFX & SWT 2
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
Thallius Wer oder was bestimmt welches Frame toFront kommt wenn ein anderes geschlossen wird? AWT, Swing, JavaFX & SWT 8
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
C SWT MenuBar & MenuItems Fokus wenn F10 unterdrücken/entfernen AWT, Swing, JavaFX & SWT 9
J JTabbedPane Vollbild wenn Tabwechsel AWT, Swing, JavaFX & SWT 1
V JScrollBar soll weiterscrollen, wenn Inhalt von JTextArea erweitert wird AWT, Swing, JavaFX & SWT 7
K Swing JScrollPane - JScrollBar anzeigen, wenn Frame verkleinert wird AWT, Swing, JavaFX & SWT 3
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
Z Fenster leer, wenn ich ein JTextField erzeuge AWT, Swing, JavaFX & SWT 3
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
A Swing " comboboxes vergl. wenn aus der 1. etwas gewählt wurde ist, es in der 2. nicht mehr sichtbar AWT, Swing, JavaFX & SWT 9
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
A Swing GUI mit ComboBox, wenn Item ausgewählt wurde neues GUI AWT, Swing, JavaFX & SWT 7
R Swing getContentPane maximiert sich nicht mit, wenn man das JFrame maxmiert AWT, Swing, JavaFX & SWT 8
V GUI mit Swing -> Wenn IP eingegeben Domain ausgeben AWT, Swing, JavaFX & SWT 15
K JMenuItem-Shortcut WENN Menüleiste verborgen ist AWT, Swing, JavaFX & SWT 4
C Swing MenuItem feuert Action nur wenn disabled AWT, Swing, JavaFX & SWT 2
D 2 GUI-Fenster. 2.Fenster wird nicht aufgebaut, wenn erstes beschäftigt ist. AWT, Swing, JavaFX & SWT 4
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
C JButton umbennen wenn gedrückt AWT, Swing, JavaFX & SWT 9
Z Swing Wenn JFrame inaktiv - Soundbenachrichtigung bei Aktion AWT, Swing, JavaFX & SWT 2
I swing fenster neu zeichnen, wenn überdeckt AWT, Swing, JavaFX & SWT 8
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
C AWT Buttons verschwinden, wenn Fenster Vollbild gesetzt wird AWT, Swing, JavaFX & SWT 38
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
R Fensterinhalt erscheint erst, wenn das Fenster verändert wird AWT, Swing, JavaFX & SWT 7
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
K JButton nur dann aktivieren, wenn die Mouse 3 Sek. über dem Button bleibt AWT, Swing, JavaFX & SWT 2
N Button akivieren, wenn Tabelle verändert worden ist AWT, Swing, JavaFX & SWT 2
W Swing Bild zeichnen wenn Maus an bestimmter Position ist AWT, Swing, JavaFX & SWT 4
GianaSisters JTable erkennung wenn Text eingefügt AWT, Swing, JavaFX & SWT 3
H Puzzle - Erkennen wenn gelöst (array vergleichen) AWT, Swing, JavaFX & SWT 10
alex_fairytail Swing Textfeld Action wenn geschrieben wird? AWT, Swing, JavaFX & SWT 6
S Swing Panelgröße anpassen wenn Frame maximiert wird AWT, Swing, JavaFX & SWT 2
R JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern AWT, Swing, JavaFX & SWT 8
J Swing Cursor von Child falsch, wenn Parant disabled AWT, Swing, JavaFX & SWT 2
xehpuk Swing JScrollBar wird nicht eingeblendet, wenn JTable befüllt wird AWT, Swing, JavaFX & SWT 4
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
K JTable wird nicht aktualisiert, wenn Filter gesetzt ist AWT, Swing, JavaFX & SWT 9
M Menübar soll bestehen bleiben, wenn andere Masken geöffnet werden AWT, Swing, JavaFX & SWT 4
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
Dit_ Wenn viele NebenFenster zum Locationsetzen das HauptFenster brauchen AWT, Swing, JavaFX & SWT 2
H Funktion ausführen wenn Button gedrückt wird. AWT, Swing, JavaFX & SWT 2
T Swing JTable - true zurückbekommen, wenn der Cursor in einer Zelle blinkt AWT, Swing, JavaFX & SWT 7
T neuer JFrame öffnet sich erst wenn Methode die dahinerliegt abgeschlossen ist. BUG? AWT, Swing, JavaFX & SWT 4
M JWindow schließen wenn Frame sich ändert AWT, Swing, JavaFX & SWT 2
data89 Komponenten verschwinden von JPanel, wenn ich den HG selbst male - Hilfeeee AWT, Swing, JavaFX & SWT 16
D Swing Spaltenköpfe verschieben sich nicht mit, wenn man an horizontaler Scrollbar zieht AWT, Swing, JavaFX & SWT 9
aze JTable automatisch vergrößern wenn das zugehörige JFrame vergrößert wird AWT, Swing, JavaFX & SWT 13
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
S Swing [gelöst] GUI-Befehle bleiben wirkungslos, wenn danach was großes gemacht wird. AWT, Swing, JavaFX & SWT 5
B JTable getselectedrow liefert -1 wenn Focus verloren AWT, Swing, JavaFX & SWT 4
S JTable Float Column fuegt automatisch Punkt hinzu wenn man Zahlen eingibt. AWT, Swing, JavaFX & SWT 21
Spot84 scrollbar die linksbündig angezeigt wird nur anzeigen wenn sie gebraucht wird AWT, Swing, JavaFX & SWT 5
K JDialog zeigt keine Komponenten wenn es modal ist AWT, Swing, JavaFX & SWT 2
S JTable Probleme wenn ich Zelle verlasse AWT, Swing, JavaFX & SWT 4
S Funktion nur ausführen, wenn Maus über Componente ist AWT, Swing, JavaFX & SWT 2
G JTabbedPane wird groesser wenn man anderen Tab auswaehlt. AWT, Swing, JavaFX & SWT 2
N JFormattedTextField erst Verlassen, wenn Eingabe korrekt AWT, Swing, JavaFX & SWT 6
O JDialog minimieren, wenn Hauptframe minimiert wird AWT, Swing, JavaFX & SWT 4
M Button funktioniert nicht mehr wenn Schleife läuft AWT, Swing, JavaFX & SWT 3
P SWT: KeyEvents abfangen, wenn Programm minimiert ist? AWT, Swing, JavaFX & SWT 5
G MouseWheel nur wenn MouseOver! AWT, Swing, JavaFX & SWT 5
S Listener fuer JPanel der merkt wenn sich was geaendert hat? AWT, Swing, JavaFX & SWT 5
P System.exit(0); ausführen, wenn letztes Fenster geschlossen AWT, Swing, JavaFX & SWT 10
O JTable + event wenn andere Zeile selektiert ist AWT, Swing, JavaFX & SWT 5
R JPanel verkleinert sich, wenn man das Fenster vergrößert AWT, Swing, JavaFX & SWT 7
I JScrollPane, wenn JLabels x Pixel erreichen AWT, Swing, JavaFX & SWT 3
S Thread beenden, wenn Component nicht mehr benötigt wird AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben