Anzeige:
Ergebnis 1 bis 10 von 10

Thema: JFrame->KeyEvent + MousePosition Abfragen?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112

    JFrame->KeyEvent + MousePosition Abfragen?

    Hi.

    kaum ist das erste Problem behoben, ist schon das nächste da.

    Ich habe einen JFrame/JDialog. Ich will nun beim drücken von z.B. STRG+F9, dass ich dann mit getComponentAt(int x, int y) die Component abfragen kann. Im prinzip recht simpel.

    Erstes Problem ist nur, dass der KeyListener nicht wirklich so funktioniert, wie ich es mir gedacht habe. Wenn ich über dem LayeredPane vom JFrame bin, dann registriert er den Tastendruck ja wohl, sobald ich aber über der Table bin, macht er das nichtmehr.
    Ich will aber nicht jede Component mit einem Listener belegen, dann bring mit das getComponentAt(x,y) ja auch nix mehr.
    Was ich möchte ist eigentlich, dass ich, egal wo im JFrame (also von der MausPosition her gesehen), solange der Frame aktiv ist, die TastenKombi drücken kann und dann möchte ich halt abfragen, ob Control-down ist, ob F9 gedrückt wurde und dann die X/Y-Position von der Maus. Damit möchte ich dann getComponentAt(x,y) aufrufen und diese in dem Component-Tree (Thread weiter unten) dann selektieren. Das Selektieren etc ist kein Problem. Nur die TastenKombi zu prüfen und gleichzeitig die MausPosition zu bekommen, das ist mein Problem.

    Ansatzweise habe ich folgendes:

    Code:
    final ActionListener listener = new ActionListener() {
      public final void actionPerformed(final ActionEvent event) {
        System.out.println("Key typed.. " + "   " + getX() + "x" + getY());
      }
    };
    
    final KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F9, 0, true);
    
    getRootPane().registerKeyboardAction(listener, keyStroke, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    Wenn ich nun F9 drücke, dann wird das, was in der ActionPerformed-Methode steht, ausgeführt. getX() und getY() sind allerdings nicht die Maus-Werte, denn diese sind immer gleich. Ausserdem ist es ja im moment nur F9, ohne Control.

    Kann mir da jemand helfen?

    TIA && Mfg, Matflasch
    Verteilt die Macht, dass sie keinen mächtig macht!

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.02.2002
    Beiträge
    41
    Hi,

    was ist denn, wenn der ActionListener gleichzeitig MouseMotionListener des JFrames wäre und so permanent mit der aktuellen Position der Maus versorgt wird. Wenn dann die Taste gedrückt werden würde, wüsste der ActionListener die aktuelle Position der Maus.

    Denke, dass es so klappen könnte.

    Gruss
    Sebastian

  3. #3
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Hi,

    getX(), bzw. getY() gibt die Fenster-Werte zurück. Du muss schon die Werte, die Dir das Event zurückgibt nutzen.

    Dann solltest Du auch ein MouseEvent nutzen und nicht nur das ActionEvent. Da gibt es dann auch die richtigen Funktionen.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  4. #4
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112
    Kann man den ActionListener denn gleichzeitig mit dem MouseMotionListener 'belegen'? Habe beim stöbern gelesen, dass das nicht gehen soll...?

    Dass getX() und getY() einfach so verwendet die Fensterposition zurück liefert, habe ich auch noch rausgefunden
    Das Problem ist nur, dass mir das KeyEvent die X und Y-Position der Maus ja leider nicht zurück liefern, daher bräuchte ich eine Kombination aus KeyEvent und MouseListener, damit ich beides kombiniert nutzen kann, nur wie gesagt habe ich gelesen, dass das nicht so einfach gehen soll. Bei der Suche bin ich dann auch auf die Lösung gefunden, die ich gepostet habe, allerdings bin ich damit nicht glücklich, da mir die X/Y-Position der Maus fehlt, um getComponentAt(x,y) anwenden zu können :/

    Ich werde morgen mal versuchen, die beiden irgendwie zu kombinieren...

    Falls jemand sowas schonmal gemacht hat und mir direkt ne Lösung sagen kann, wäre das nicht schlecht

    Mfg, Matflasch
    Verteilt die Macht, dass sie keinen mächtig macht!

  5. #5
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Hi,

    Du musst einen MouseListener (oder MouseAdapter) implementieren. Dort kannst Du das MouseEvent abfangen. So sollte das klappen.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  6. #6
    Registrierter Benutzer
    Registriert seit
    03.04.2002
    Beiträge
    112
    Jo das hatte ich auch gemacht bei dem JFrame, allerdings brauche ich ja die Kombination aus KeyEvent und MouseListener :/

    Beim drücken von STRG+F9 will ich ja die Mouse-Position abfragen, das geht ja auch nicht mit dem MouseListener alleine.
    Ausgelöst werden soll das Event eigentlich nur durch drücken von STRG+F9. Dann will ich halt die Component haben, die gerade unter der Maus liegt.
    Die Component selbst soll nicht angeklickt werden oder so, das macht mir das ganze Problem eigentlich nur.

    Kann man in einem solchen Listener denn beides Kombinieren?
    Weil das Problem mit dem KeyEvent ist ja auch, dass dann der Focus auf dem JFrame sein muss, und wenn der Focus grad bei der Table ist, dann registriert er das KeyEvent ja nicht wirklich. Habe da heut schon voll viel mit rumprobiert, ohne erfolg..

    Das einzige, was geklappt hat bisher, war mit dem KeyStroke. Den müsste ich irgendwie mit dem MouseListener verbinden.

    Ich werde das morgen früh einfach nochmal ausprobieren, irgendwie muss das ja gehen
    Verteilt die Macht, dass sie keinen mächtig macht!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •