Swing Immer aktuelle Mausposition anzeigen lassen

Alex2013

Bekanntes Mitglied
Hallo Leute,

ich wollte heut ein Programm erstellen, mit dem ich zum Einen "malen" kann.
Das funktioniert soweit auch. Zusätzlich wollte ich eine weitere Komponente einfügen, welche, wenn die Maus "gemoved" oder geklickt wird, die aktuelle Position anzeigt.
Hierzu hatte ich zunächst ein JLabel versucht und hierauf einfach die jeweilige x und y Koordinate geaddet. Dies funktioniert leider nicht. Bzw. es reagiert nur, wenn der "löschen" button gedrückt wird. Dann wird das ganze ContentPane gelöscht und die letzte x,y Koordinate angezeigt. Dies soll aber immer beim bewegen und beim klicken passieren.
Genauso, als wenn die Ausgabe über System.out.println ausgegeben werden würde.
Hat hier jemand einen Tipp?

Mein aktueller Code:

Java:
public class MitMausZeichnen extends JFrame{
    public int xval=0,yval=0;
    JButton loeschen=new JButton("löschen");
    JLabel anzeige=new JLabel();
  
    public MitMausZeichnen() {
        setSize(500, 500);
        getContentPane().add(loeschen,BorderLayout.NORTH);
        getContentPane().add(anzeige,BorderLayout.SOUTH);
        loeschen.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getContentPane().repaint();
            }
        });
        addMouseListener(new MouseListener() {
          
            @Override
            public void mouseReleased(MouseEvent e) {
            }
            @Override
            public void mousePressed(MouseEvent e) {
            }
            @Override
            public void mouseExited(MouseEvent e) {
            }
            @Override
            public void mouseEntered(MouseEvent e) {
            }
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                xval=e.getX();yval=e.getY();
                anzeige.setText(""+xval+" "+yval);
              
                repaint();
                revalidate();
            }
        });
        addMouseMotionListener(new MouseMotionListener() {
          
            @Override
            public void mouseMoved(MouseEvent e) {
            }
            @Override
            public void mouseDragged(MouseEvent e) {
                // TODO Auto-generated method stub
                xval=e.getX();yval=e.getY();
                repaint();
            }
        });
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
  
  
    public void paint(Graphics g)
    {
        g.fillOval(xval, yval, 3, 3);
    }

    public static void main(String[] args) {
        new MitMausZeichnen();
    }
}

Ich würde mich über einen Tipp oder eine Lösung freuen 🙂

Lg
 
Zuletzt bearbeitet von einem Moderator:
Ich hatte auch schon bei google oder Youtube gesucht. Aber zu dieser Fragestellung habe ich bisher leider noch nichts gefunden.
Auch weitere Versuche brachten keine Verbesserung :-(
 
Wenn du implementieren Willst, dass du Immer die aktuelle Mausposition anzeigen lassen will wenn Sie bewegt wird dann solltest du einen MouseMotionListener implementieren

Java:
public class MyClass implements MouseMotionListener{

    public void mouseMoved(MouseEvent e){
       System.out.println("X : "+ e.getX());
       System.out.println("Y : "+ e.getY());
    }

    public void mouseDragged(MouseEvent e){
       //do something
    }

}
 
@Robat: Das hatte ich auch schon versucht (siehe Code weiter unten). Mir wird auch jede beliebige Position in der "Konsole" per System.out. angezeigt. Das ist überhaupt kein Problem. Nur wenn ich die Koordinaten, sei es direkt nach einem Klick oder permanent, also immer, in einem JLabel anzeigen lassen möchte (auch schon mit JTextfield versucht), funktioniert dies nur, wenn ich einen einzelnen Klick durchführe und anschließend auf "löschen" gehe. Vorher nicht.
Ich hatte es auch schon in einigen Methoden die im Code stehen mit revalidate und getContentPane.repaint etc. versucht. Dies brachte auch nichts.
Die Point Klasse hat mir hier auch noch nicht weitergeholfen... :-(
Daher frage ich mich, was ich noch versuchen kann...

Hat sonst noch jemand einen Tipp?
 
Du brauchst keine anderen Tipp - du musst nur den MouseMotionListener richtig implementieren 😛

Java:
private JFrame frame;
private JPanel panel;
privatee JLabel label;

public static void main(String agrs[])
{
     initWindow();
}

private void initWindow()
{ 
        // Initialize the JFrame
         frame = new JFrame();
         frame.setTitle("Mein Super Schönes Programm");
         frame.setSize(500, 500);
         frame.setLocationRelativeTo(null);
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
         // Initialize the Panel
         panel = new JPanel();
         panel.setSize(500, 500);
         panel.setLayout(new BorderLayout());

         // Initialize the Label
         label = new JLabel();
         label.setSize(100, 100);
         label.setText("X:    Y:   ");
         
         // add MouseMotionListener to the Panel
         panel.addMouseMotionListener(new MouseMotionListener() {
             @Override
             public void mouseDragged(MouseEvent e) {
                 label.setText("X: " + String.valueOf(e.getX() + "    Y: " + String.valueOf(e.getY())));
             }

             @Override
             public void mouseMoved(MouseEvent e) {
                 label.setText("X: " + String.valueOf(e.getX() + "    Y: " + String.valueOf(e.getY())));
             }
         });

         panel.add(label, BorderLayout.NORTH);
         
         
        frame.add(panel);
        frame.setVisible(true);
}

Ist nur fix mal geschrieben, sollte aber funktionieren. Ich würde dir raten, nicht alles in dein JFrame zu klatschen, sondern noch ein JPanel dazwischen zu legen. Falls du dein Programm mal erweitern möchtest mit versch. Layouts macht es das JPanel etwas leichter.

Ausserdem würde ich dir raten nicht von JFrame zu erben, da es dich in deiner Funktionalität einschränkt. (Du kannst du von einer Klasse erben). Da du aber die Funktionalität von deinem Frame nicht erweitern willst, sondern nur die Methoden benutzt, brauchst du auch nicht davon zu erben 🙂

Gruß
Robert
 
Jupp das mit den static kannst du verhindern, indem du den Konstruktor in der main-Methode aufrufst und der Konstruktor wie folgt aussieht:

Java:
public ClassName()
{
     initWindow();
}

public static void main(String[] args)
{
     ClassName classNameInstanze = new ClassName();
     // bzw einfach nur new ClassName();
}
 

Neue Themen


Zurück
Oben