Zwei gleichzeitig gedrückte Steuertasten

kodela

Bekanntes Mitglied
Hallo,

habe wieder einmal ein Problem, diesmal mit der Tastaturabfrage. Wie muss eine Abfrage realisiert werden, über die festgestellt werden kann, ob neben einer Standardtaste, zum Beispiel einer Ziffer, auch die Control-Taste oder die Shift-Taste oder beide zusammen gedrückt sind?

Der KeyListener ist über folgenden Code eingebunden:

Java:
    addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent evt) {
            myKeyPressed(evt);
        }
    });


In myKeyPressed (KeyEvent evt) sieht dann eine Auswertung mit der Abfrage auf die K-Taste bei gleichzeitig gedrückter Strg-Taste dann zum Beispiel so aus:

Java:
        int code = evt.getKeyCode();
   
        if (evt.isControlDown()) {
            if (strApp.getKndModus() == KNDMODNOTIZ) {
                if (code == KeyEvent.VK_K) {
                    str.swapNotizen();
                } else if (code == KeyEvent.VK_0 || code == KeyEvent.VK_NUMPAD0) {
                    str.entferneNotizen();
                }
            }
            return;
        }


Wie müsste eine Abfrage aussehen, die eine Auswertung für den Fall ermöglicht, dass beide genannten Steuertasten gedrückt sind, ohne dass damit Abfragen für nur eine gedrückte Steuertaste beeinträchtigt werden.?

Danke schon einmal vorweg für jeden Tipp.

kodela
 
Zuletzt bearbeitet:

kodela

Bekanntes Mitglied
Danke @mihe7!

Leider hilft mir das nicht weiter. So wie in Deinem Link beschrieben, habe ich es bereits gemacht, wenn die Eingabe (es handelt sich immer um die Ziffern 1-9) über Buttons erfolgt. Hier der Code:

Java:
    private void kandidat_ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        int knd = Integer.parseInt(((JButton) evt.getSource()).getText());
        if ((evt.getModifiers() & (ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK))
                == (ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK)) {
            str.kndFilter(knd);
        } else if (evt.getModifiers() == 16){   // keine Steuertaste gedrückt
            bearbeiteKndButton(knd);
        }
    }


Wenn ich aber die Eingabe über die Tastatur realisieren will, dann funktioniert das bei mir mit diesem Code nicht, wenn die Eingabe über den Ziffernblock erfolgt:

Java:
    int code = evt.getKeyCode();

    if (evt.getModifiers() == SHCT_MASK && strApp.getKndModus() > 0) {
        if (code <= 16) {       // noch keine Wertetaste
            return;
        }
        int k;
        if (evt.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD) {
            k = getEingabewert(code, true, false);
        } else {
            k = getEingabewert(code, false, false);
        }    
        if (k >= 0 && k <=9) {
            str.kndFilter(k);
            evt.consume();
        }
        return;
    }


SHCT_MASK ist wie folgt definiert:

Java:
    private static final int SHIFT_MASK = ActionEvent.SHIFT_MASK;
    private static final int CTRL_MASK = ActionEvent.CTRL_MASK;
    private static final int SHCT_MASK = SHIFT_MASK | CTRL_MASK;


Ursächlich für das Problem ist, dass evt.getKeyLocation() zum einen nicht auf den Ziffernblock verweist und zum anderen evt.getKeyCode() nicht den Code für den ein eingegebenen Wert (vom Ziffernblock) liefert wenn Strg- und Shift-Taste gleichzeitig gedrückt sind.

Die Eingabe der Ziffern über die normalen Zifferntasten funktioniert dagegen mit den zwei Steuerungstasten.

Gibt es eine Möglichkeit, dieses Problem zu umschiffen?

Die Eingabe nur mit Shift oder Strg funktioniert mit beiden Zifferbereichen der Tastatur (und auch über die Buttons).

kodela
 

mihe7

Top Contributor
Im unteren Bild kommt oben noch was mit numpad... gibt es da evtl. noch einen Hinweis auf die gedrückte Taste?
 

kodela

Bekanntes Mitglied
Wie man an der Länge des Scrollbuttons erahnen kann, ist auf beiden Screenshots meines vorstehenden Beitrages nur ein sehr kleiner Prozentsatz der angefallenen Key-Ereignisse zu sehen. Das lag an meiner Texteingabe. Ich habe jetzt einmal das Frame etwas in die Länge gezogen und vor meiner Testeingabe (Strg+Shift+1 vom Ziffernblock) mit "Clear" alles gelöscht. Das Ergebnis ist hier zu sehen, links die Eingabe über den Ziffernblock, rechts die Standardtasten.

1597698179054.png

Auch wenn ein anderer Eindruck entstehen könnte, aber ich habe in beiden Fällen gefühlt gleichzeitig die beiden Steuertasten und dann die jeweilige Zifferntaste gedrückt und danach die Steuertasten losgelassen. Ich habe keinesfalls die Tasten noch einmal gedrückt.

Am fehlenden Scrollbalken sieht man auch, dass es keine weiteren Ereignisse gab.

kodela

PS: Mittlerweile habe ich die Absicht, die gewünschte Aktion über Strg+Shift zu starten, aufgegeben. Strg+Alt eignet sich übrigens auch nicht besonders, da hier Windows Menü-Aktivitäten damit verbindet.
 
Zuletzt bearbeitet:

kodela

Bekanntes Mitglied
Das Problem der Eingabe über den Ziffernblock besteht ja nicht nur mit den beiden Sondertasten Strg+Shift. Auch mit Shift alleine bekommt man nicht die gewünschten Ziffernwerte. Hier ein Screenshot für die Eingabe Shift+1 über den Ziffernblock:

1597736288809.png

Dagegen kann man aber etwas machen. Ich habe mir entsprechende "Umlenk-Konstante" definiert:

Java:
    private static final int VK_SHIFTNUM_0 = 155;
    private static final int VK_SHIFTNUM_1 = 35;
    private static final int VK_SHIFTNUM_2 = 40;
    private static final int VK_SHIFTNUM_3 = 34;
    private static final int VK_SHIFTNUM_4 = 37;
    private static final int VK_SHIFTNUM_5 = 12;
    private static final int VK_SHIFTNUM_6 = 39;
    private static final int VK_SHIFTNUM_7 = 36;
    private static final int VK_SHIFTNUM_8 = 38;
    private static final int VK_SHIFTNUM_9 = 33;


Über folgende Abfrage wird nun entschieden, wie der Code auszuwerten ist:

Code:
    if (evt.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD) {
        k = getEingabewert(code, true, true);
    } else {
        k = getEingabewert(code, false, false);
    }


In getEingabewert() wird dann der "falsche" Code zum richtigen Wert "umgebogen":

Java:
    private int getEingabewert(int code, boolean numblock, boolean shift) {
        int eWert = -1;
        if (numblock) {
            if (shift) {
                switch (code) {
                    case VK_SHIFTNUM_0:
                        eWert = 0;
                        break;
                    case VK_SHIFTNUM_1:
                        eWert = 1;
                        break;
                    case VK_SHIFTNUM_2:
                        eWert = 2;
                        break;
                    case VK_SHIFTNUM_3:
                        eWert = 3;
                        break;
                    case VK_SHIFTNUM_4:
                        eWert = 4;
                        break;
                    case VK_SHIFTNUM_5:
                        eWert = 5;
                        break;
                    case VK_SHIFTNUM_6:
                        eWert = 6;
                        break;
                    case VK_SHIFTNUM_7:
                        eWert = 7;
                        break;
                    case VK_SHIFTNUM_8:
                        eWert = 8;
                        break;
                    case VK_SHIFTNUM_9:
                        eWert = 9;
                        break;
                }
            } else {
            ...
        return eWert;


Mit Strg+Shift funktioniert das aber nicht.

Kennt jemand eine einfachere Methode für die Zifferneingabe über den Ziffernblock mit Shift+n ?

kodela[/CODE]
 
Zuletzt bearbeitet:

Neumi5694

Top Contributor
Du wirst deine Abfragen ändern müssen, wenn du NUR auf Control reagieren willst.
Java:
        if ((evt.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0) {
            //CTRL gedrückt, andere Tasten können AUCH gedrückt sein
        }
        if ((evt.getModifiersEx() & (InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)) != 0) {
            //CTRL+SHIFT gedrückt, andere Tasten können AUCH gedrückt sein
        }
        if (evt.getModifiersEx() == InputEvent.CTRL_DOWN_MASK) {
            //nur CTRL gedrückt, keine anderen
        }
        if (evt.getModifiersEx() == (InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK))  {
            //nur CTRL+SHIFT gedrückt, keine anderen
        }

Die Tasten auf dem Nummernblock fragst du mit evt.VK_NUMPAD0 usw. ab.
 

kodela

Bekanntes Mitglied
Danke @Neumi5694 für Deine Hinweise!
Du wirst deine Abfragen ändern müssen, wenn du NUR auf Control reagieren willst.
...
Die Tasten auf dem Nummernblock fragst du mit evt.VK_NUMPAD0 usw. ab.


Mit NUR auf Control habe ich keine Probleme. Meine Frage im Thread #1 war:

Wie müsste eine Abfrage aussehen, die eine Auswertung für den Fall ermöglicht, dass beide genannten Steuertasten gedrückt sind, ohne dass damit Abfragen für nur eine gedrückte Steuertaste beeinträchtigt werden?


Diese Abfrage hatte ich, wie im Thread #3 gezeigt, so formuliert:

Code:
evt.getModifiers() & (ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK)) == (ActionEvent.CTRL_MASK | ActionEvent.SHIFT_MASK)


Das sieht im Prinzip so aus, wie Dein zweites Beispiel und funktionierte im grunde ja auch, aber nicht gleichzeitig für Eingaben über Ziffernblock und Normaltastatur. Für auf dem Ziffernblock gedrückte Zifferntasten bekam ich, egal welche Taste gedrückt war, den Key-Code 16.

Mittlerweile habe ich die Ziffernabfrage so umgestellt, dass ich auf eine Abfrage mit CTRL+SHIFT verzichten konnte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Zwei Wavdateien gleichzeitig mit SourceDataLine abspielen Allgemeine Java-Themen 0
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
X Bedingung zwei mal überprüfen Allgemeine Java-Themen 4
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
Neoline Methoden Zwei Arrays abwechselnd zusammenführen Allgemeine Java-Themen 15
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Kollision von zwei Kreisen Allgemeine Java-Themen 15
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
S Variablen split-Funkton mit zwei Variabeln verwenden? Allgemeine Java-Themen 4
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
S Anwendung zum ausrechnen der Differenz von zwei Tagen Allgemeine Java-Themen 9
F Zwei LinkedHashMaps iterieren und vergleichen Allgemeine Java-Themen 2
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
F Webstart zwei Java Versionen / aktivieren bzw deaktivieren Allgemeine Java-Themen 2
S Zwei Comparable (compareTo) vergleichen Allgemeine Java-Themen 6
E zwei Gleitkommazahlen durcheinander dividieren Allgemeine Java-Themen 2
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
T Wie heißt ein Binärbaum, dessen Knoten immer zwei Kinder haben müssen? Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
1 zwei Strings vergleichen Allgemeine Java-Themen 16
C Buchstaben, die in zwei Wörtern vorkommen Allgemeine Java-Themen 13
J Gleiche Packagestruktur in zwei *.jar Dateien Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
B zwei-dimensionale Collections bzw. Array mit Indizes Allgemeine Java-Themen 3
C Zwei Arrays vereinen Allgemeine Java-Themen 3
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
N hashCode() für zwei ints Allgemeine Java-Themen 5
turmaline Gleichheit von zwei Maps Map <String, Map <String, String>> Allgemeine Java-Themen 30
N Wie Listenabgleich auf zwei CPU Cores auslagern? Allgemeine Java-Themen 6
D Zufall wahr bzw. falsch mit zwei Faktoren Allgemeine Java-Themen 10
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
H Ausgabe von zwei Textfeldern Allgemeine Java-Themen 3
H Zwei unabhängige Threads miteinander kommunizieren lassen Allgemeine Java-Themen 3
G zwei mal synchronized Allgemeine Java-Themen 5
Z zwei Daten vergleichen Allgemeine Java-Themen 4
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
T IText: Zwei A4 PDF´s auf ein A3 PDF´s Allgemeine Java-Themen 2
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
H Shortcut ruft zwei Menu-punkte auf Allgemeine Java-Themen 5
J Zwei konstruktoren? Allgemeine Java-Themen 8
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
J Zwei sortierte Listen zusammenfassen Allgemeine Java-Themen 8
G Linked List zwischen zwei Threds übergeben Allgemeine Java-Themen 11
J zwei HashMaps vereinen Allgemeine Java-Themen 3
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
G Jfreechart zwei charts Allgemeine Java-Themen 2
S Zwei Anwendungen unter Tomcat Allgemeine Java-Themen 4
T Anzahl Tage zwischen zwei Daten - Stunde fehlt? Allgemeine Java-Themen 2
V Zwei ArrayList(s) vergleichen Allgemeine Java-Themen 6
T Überprüfen ob zwei Farben ähnlich sind Allgemeine Java-Themen 14
M zwei main-Methoden Allgemeine Java-Themen 7
P zwei JFrames zusammenhängen Allgemeine Java-Themen 4
A Summe und Produkt von zwei Feldern ( arrays) Allgemeine Java-Themen 9
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
2 Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 2
G Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 3
J Zwei String auf ähnlichkeiten untersuchen? Allgemeine Java-Themen 3
C kürzester weg zwischen zwei Punkten, Koordinaten finden Allgemeine Java-Themen 15
B zwei Bilder miteinander vergleichen Allgemeine Java-Themen 25
L Anzahl Tage zwischen zwei Kalenderdaten Allgemeine Java-Themen 5
P Threadprogrammierung - zwei Threads parallel - einer beendet Allgemeine Java-Themen 3
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
S zwei Arrays zusammenfassen Allgemeine Java-Themen 14
L Zwei Hashtables statt einer? Allgemeine Java-Themen 6
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
G zwei Rückgabewerte gefordert. Was tun ? Allgemeine Java-Themen 10
Chucky Zwei Binärbäume vereinigen Allgemeine Java-Themen 7
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben