Globale Variablen werden durch KeyListener nicht aktualisier

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
Hallo.
Ich habe einer Textbox zwei KeyListener hinzugefügt. Einer agiert wenn eine Taste gedrückt wird und der andere wenn die Taste losgelassen wird. Über den Sinn und Zweck lässt sich streiten, aber ich bin noch auf keine andere Lösung gekommen.
Ein KeyListener überprüft ob Eingaben korrekt sind während der andere dazu da ist, mit den Pfeiltasten über Textboxen zu navigieren. Problem ist jetzt allerdings volgendes:
Ich habe Klassenvariablen angelegt die mit den Pfeiltasten so verändert werden, dass man über die Textboxen navigieren kann. Im zweiten KeyListener, der die Tasten überprüft, sollen diese Klassenvariablen z.b. bei dem drücken von Tab auch verändert werden... Dies geschieht allerdings nur temporär bis ich wieder die Pfeiltasten benutze...

Code:
//Klassenvariablen row bzw column
        matrix[i][j].addKeyListener(new KeyAdapter() {
          public void keyPressed(KeyEvent evt) {
             if (evt.getKeyCode() == KeyEvent.VK_UP)
                row--;
             else if (evt.getKeyCode() == KeyEvent.VK_DOWN)
                row++;
             else if (evt.getKeyCode() == KeyEvent.VK_LEFT)
                column--;
             else if (evt.getKeyCode() == KeyEvent.VK_RIGHT)
                column++;
             else
              key = 1;

             if (row > 8)
                row = 0;
             else if (column < 0)
                row = 0;
             if (column > 8)
                column = 0;
             else if (column < 0)
                column = 0;

             matrix[row][column].requestFocus();
          }
        });
        matrix[i][j].addKeyListener(new KeyAdapter() {
          public void keyReleased(java.awt.event.KeyEvent evt) {
            if (key == 1){
              if ((evt.getKeyCode() == KeyEvent.VK_1 || evt.getKeyCode() == KeyEvent.VK_2 ||
                   evt.getKeyCode() == KeyEvent.VK_3 || evt.getKeyCode() == KeyEvent.VK_4 ||
                   evt.getKeyCode() == KeyEvent.VK_5 || evt.getKeyCode() == KeyEvent.VK_6 ||
                   evt.getKeyCode() == KeyEvent.VK_7 || evt.getKeyCode() == KeyEvent.VK_8 ||
                   evt.getKeyCode() == KeyEvent.VK_9) ||
                  (evt.getKeyCode() == KeyEvent.VK_NUMPAD1 || evt.getKeyCode() == KeyEvent.VK_NUMPAD2 ||
                   evt.getKeyCode() == KeyEvent.VK_NUMPAD3 || evt.getKeyCode() == KeyEvent.VK_NUMPAD4 ||
                   evt.getKeyCode() == KeyEvent.VK_NUMPAD5 || evt.getKeyCode() == KeyEvent.VK_NUMPAD6 ||
                   evt.getKeyCode() == KeyEvent.VK_NUMPAD7 || evt.getKeyCode() == KeyEvent.VK_NUMPAD8 ||
                   evt.getKeyCode() == KeyEvent.VK_NUMPAD9)){
                String input = ((TextField)evt.getSource()).getText();
                if (input.length() > 1){
                  ((TextField)evt.getSource()).setText(input.substring(0, 1));
                  ((TextField)evt.getSource()).setCaretPosition(1);
                  JOptionPane.showMessageDialog(null,
                  "Es ist nur eine maximale Zeichenlänge\nvon 1 erlaubt!");
                }
                try{
                    int zahl = Integer.parseInt(((TextField)evt.getSource()).getText());
                    if(zahl == 0){
                        ((TextField)evt.getSource()).setText("");
                    }
                }catch(NumberFormatException e) {
                    ((TextField)evt.getSource()).setText("");
                }
              }else if (evt.getKeyCode() == KeyEvent.VK_DELETE || evt.getKeyCode() == KeyEvent.VK_BACK_SPACE){
                ((TextField)evt.getSource()).setText("");
              }else if (evt.getKeyCode() == KeyEvent.VK_ENTER){
                lösen();
              }else if (evt.getKeyCode() == KeyEvent.VK_SPACE){
                inputtemp = ((TextField)evt.getSource()).getText();
                ((TextField)evt.getSource()).setText(inputtemp.substring(0, 1));
                ((TextField)evt.getSource()).setCaretPosition(1);
              }else if (evt.getKeyCode() == KeyEvent.VK_TAB){
                column++;
                matrix[row][column].requestFocus();
              }else if (evt.getKeyCode() == KeyEvent.VK_SHIFT){
                if (evt.getKeyCode() == KeyEvent.VK_SHIFT && evt.getKeyCode() == KeyEvent.VK_TAB){
                  column--;
                  matrix[row][column].requestFocus();
                }
              }else{
                JOptionPane.showMessageDialog(null,
                "Falsche Eingabe!\nEs sind nur Zahlen zwischen 1 und 9\nmit einer Zeihenlänge 
                 von einem Charakter\nerlaubt.");
                ((TextField)evt.getSource()).setText("");
              }
            }
            key = 0;
          }
        });

Um das ganze rekonsturieren zu können:
Wenn ich mit den Pfeiltasten navigiere funktioniert alles wunderbar. Wenn ich mit Tab ein Feld weiter springe funktioniert es auch so weit ganz gut. Wenn ich anschließend dann mit der Pfeiltaste eine Zeile nach unten bzw. oben gehe springt der column-Wert wieder zurück auf den Wert den er vor dem Tab drücken hatte....
 
S

SlaterB

Gast
ich sehe nicht ganz durch, was wann warum passiert,
deswegen würde ich an dieser Stelle das Logging anschmeißen:

zu Beginn als erste Zeile in jedem Listener
System.out.println( Listener xy, Event: Code);

und an jeder relevanten Stelle (vielleicht nur eine globale Variable genauer beobachten):
System.out.println( Listener xy, setze Variable a auf Wert b, weil cde);

so weißt du zu jedem Zeitpunkt, warum dein Programm was tut,
wer wann warum wo welche globale Variable ändert
 

manuche

Bekanntes Mitglied
Ok wie es mir scheint ist die TabTaste bzw Schift+Tab ein Standardcallback... Soll heissen er geht garnicht erst in den Listener rein! Wie könnte man denn dieses Standardcallback ausschalten, dass ich eigenständig die Prezdur bei der TabTaste programmieren kann?
 

manuche

Bekanntes Mitglied
Also ich finde nich wirklich was bzw das was ich finde is mir zu hoch ^^ treibe mich ja nicht umsonst im anfängerfragenforum durch.... ;)
Naja vllt hat ja noch wer anders ne idee!
habs bis jetzt halt damit probiert einfach mal "FocusManager.disableSwingFocusManager();" an diversen stellen im quellcode einzufügen (natürlich hab ich auch den benötigten import gemacht)!
gruß manuche
 
S

SlaterB

Gast
ein Tipp der von mir geposteten Seite scheint doch zu klappen,
kommen Subklassen nicht in Frage?
sind natürlich unsauber, aber wenn du nur eine Sorte JTextField hasts, dann gehts ja noch

Code:
public class TestGUI
    extends JFrame
{

    public TestGUI()
        throws Exception
    {

        setLayout(new FlowLayout());

        JTextField a = new JTextField(20)
            {
                public boolean isManagingFocus()
                {
                    return true;
                }
            };
        a.addKeyListener(new KeyListener()
            {
                public void keyPressed(KeyEvent e)
                {
                    System.out.println("keyPressed: " + e.getKeyCode());
                }

                public void keyReleased(KeyEvent e)
                {
                    System.out.println("keyReleased: " + e.getKeyCode());
                }

                public void keyTyped(KeyEvent e)
                {
                    System.out.println("keyTyped: " + e.getKeyCode());
                }
            });
        add(a);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 400);
        setVisible(true);

    }

    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }
}
 

manuche

Bekanntes Mitglied
Also ich kann dich leider nur bedingt nachvollziehen...
also subklasse dürfte klar sein aber was machst du in em code da? die keylistener hab ich doch schon bzw wozu tun die dann noch not???
und vor allen dingen wo wird da das tabcallback rausgenommen?
gruß manuche
 
S

SlaterB

Gast
die tun not, weil ich ein komplettes Programm posten mochte,
sie sind nur da, eigenene Zeichen auszugeben,

wo wird das callback rausgenommen?
in
public boolean isManagingFocus()
{
return true;
}
statt Standard false, welches zur automatischen Tab-Behandlung führt,
 

manuche

Bekanntes Mitglied
Alles klar! Du hast das ganze jetzt in mit JTextFields gemacht aber ich benutze ganz normal TextFields also AWT (glaub ich zumindest dass es dann so ist)...
Hab so jetzt erstmal das an meine Textbox dran gehängt was allerdings nicht funktioniert hat:
Code:
TextField[x][y] 
            { 
                public boolean isManagingFocus() 
                { 
                    return true; 
                } 
            };
mir leuchtet nicht so wirklich ein warum ich die ganze klasse nehemen muss bzw wüsste ich dann nicht wie ichs an meine Textbox hänge!
 
S

SlaterB

Gast
du musst die Klasse überschreiben, mit dem Array hat das nix zu tun,
entweder du machst eine anonyme innere Klasse, so wie bei KeyAdaptern beim Erzeugen des Objektest,
bei new TextField() hinten dran

sehr viel besser bei diesem ungewöhnlichen Überschreiben ist aber die Definition einer eigenen Klasse in einer eigenen Datei:

public class MyTextField extends JTextField {

// überschriebene Operation
}
--------

so, aber für TextField in AWT gibts die Operation wohl gar nicht,
selbst in Swing ist sie deprecated (sollte nicht verwendet werden)

in der API stehen dafür dann interessante neue Infos:
isManagingFocus
@Deprecated
public boolean isManagingFocus()Deprecated. As of 1.4, replaced by Component.setFocusTraversalKeys(int, Set) and Container.setFocusCycleRoot(boolean).

In release 1.4, the focus subsystem was rearchitected. For more information, see How to Use the Focus Subsystem, a section in The Java Tutorial.
Changes this JComponent's focus traversal keys to CTRL+TAB and CTRL+SHIFT+TAB. Also prevents SortingFocusTraversalPolicy from considering descendants of this JComponent when computing a focus traversal cycle.


See Also:
Component.setFocusTraversalKeys(int, java.util.Set), SortingFocusTraversalPolicy


http://java.sun.com/javase/6/docs/api/javax/swing/JComponent.html

Link zu 'How to Use the Focus Subsystem'
http://java.sun.com/docs/books/tutorial/uiswing/misc/focus.html

da suche ich persönlich dann aber nicht weiter,
versuch es alleine oder warte auf andere ;)
 

manuche

Bekanntes Mitglied
Ich glaub ich lass besser die Finger davon... Also ich bräuchte glaub ich Jahre um es zu verstehen weil ich bis dato einfach viel zu wenig hintergrundwissen hab um das selbst herleiten zu können! Trotzdem Danke!
Gruß manuche

*edit:

looooooooool google hilft... ich brech mir hier einen ab und probiere und frage und probiere und verzweifle... rein interesse halber mal einen google link von weit weit unten geöffnet und die Lösung des Problems gefunden... ALS EINZEILER -.-
Ok Shift+Tab funktioniert nich mehr aber das ist zweitrangig... Hier die Lösung ;)

Code:
matrix[i][j].setFocusTraversalKeysEnabled(false);
omg danke google und blitzideen xD
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Vererbung/Globale Variablen Java Basics - Anfänger-Themen 8
D globale Variablen zur Laufzeit erzeugen Java Basics - Anfänger-Themen 5
G Globale Variablen Java Basics - Anfänger-Themen 9
G Globale Variablen Java Basics - Anfänger-Themen 3
O globale variablen Java Basics - Anfänger-Themen 21
F Globale Variablen wie in C++? Java Basics - Anfänger-Themen 5
J "Globale Variablen" Java Basics - Anfänger-Themen 26
S globale Variablen Java Basics - Anfänger-Themen 9
J Globale Variablen Java Basics - Anfänger-Themen 3
D Globale Variablen Java Basics - Anfänger-Themen 31
C Globale Variablen und Array mit verschiedenen Typen Java Basics - Anfänger-Themen 3
S globale Variablen Java Basics - Anfänger-Themen 7
P Globale Objekte Java Basics - Anfänger-Themen 2
T Globale Variable mehrmals verwenden Java Basics - Anfänger-Themen 7
Traxter Globale Variable ? Java Basics - Anfänger-Themen 11
Jackii Globale Variable aus anderer Klasse ändern... Java Basics - Anfänger-Themen 4
M Variablen Globale Variable? Java Basics - Anfänger-Themen 4
Luk10 Globale (semi-finale) Varibalen Java Basics - Anfänger-Themen 9
U Globale Proxy Einstellungen ändern Java Basics - Anfänger-Themen 3
B Globale vector? Java Basics - Anfänger-Themen 7
C lokale Variable verwenden statt globale Java Basics - Anfänger-Themen 7
B Methoden Globale Methoden "Toolbox" Java Basics - Anfänger-Themen 3
S globale Variable deklarieren Java Basics - Anfänger-Themen 10
E Globale int Variable? Java Basics - Anfänger-Themen 6
K Datentypen Globale Variable direkt initialisieren oder im Konstruktor? Java Basics - Anfänger-Themen 13
T Globale Variable wird nicht gefunden Java Basics - Anfänger-Themen 6
T Globale Variable (Font) Java Basics - Anfänger-Themen 21
G Müssen globale Funktionen immer "static" sein? Java Basics - Anfänger-Themen 13
A Globale Variable änderbar Java Basics - Anfänger-Themen 3
A Globale Methode ohne imports und übergeben? Java Basics - Anfänger-Themen 2
P textfarbe,textgröße, textart als globale einstellung Java Basics - Anfänger-Themen 7
D Globale Klassenvariablen. Java Basics - Anfänger-Themen 12
P Globale und ständige Überwachung eines Textfeldes auf text? Java Basics - Anfänger-Themen 40
M Superglobale globale Variable? Java Basics - Anfänger-Themen 10
P Globale Variable Java Basics - Anfänger-Themen 3
J "globale" variable definieren? Java Basics - Anfänger-Themen 7
S Globale Variable / Methode Java Basics - Anfänger-Themen 5
O Welcher Object-Lock-Pool bei static Variablen? Java Basics - Anfänger-Themen 3
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
T Variablen Java Basics - Anfänger-Themen 1
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
M Aufsummieren von variablen Wertegrößen Java Basics - Anfänger-Themen 17
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
ashi Variablen aufrufen Java Basics - Anfänger-Themen 17
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
Arif Vererbung Methodenvererbung mit finalen Variablen Java Basics - Anfänger-Themen 1
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
S Variablen Variablen in einer Schleife erstellen lassen Java Basics - Anfänger-Themen 11
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Variablen Werte einer Klasse überschreiben Java Basics - Anfänger-Themen 4
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Variablen umbenennen Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
mars90 Fehler in der Variablen Deklaration Java Basics - Anfänger-Themen 8
E Variablen in formatierter Ausgabe Java Basics - Anfänger-Themen 15
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
H Variablen Multiplikation einer inkrementierten Variablen Java Basics - Anfänger-Themen 5
scratchy1 Variablen vertauschen wenn Bedingung "umgedreht" wird Java Basics - Anfänger-Themen 40
J Variablen mit einer anderen Klasse bekannt machen Java Basics - Anfänger-Themen 7
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
A Übergreifende Variablen Java Basics - Anfänger-Themen 17
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
H Variablen Methode zum Abfragen von Variablen aus Subklassen Java Basics - Anfänger-Themen 9
P Variablen Variablen voneinander abhängig Java Basics - Anfänger-Themen 54
F Liste nach einer Variablen sortieren Java Basics - Anfänger-Themen 6
L Variablen in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
J Klassen Variablen in andere Klassen oder Methoden übernehmen Java Basics - Anfänger-Themen 1
P Liste auslesen und in Variablen speichern Java Basics - Anfänger-Themen 7
temi Redundante Variablen Java Basics - Anfänger-Themen 29
Aprendiendo Zweifel mit versteckter Variablen Java Basics - Anfänger-Themen 16
L Variablen einmal nur zu weisen Java Basics - Anfänger-Themen 62
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
R Abfrage von Variablen in Unterklassen einer ArrayList Java Basics - Anfänger-Themen 9
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
S Vererbung Variablen klassenübergreifend nutzen Java Basics - Anfänger-Themen 42
R Auf Variablen einer anderen Klasse zugreifen? Java Basics - Anfänger-Themen 1
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
L Variablen dekleration + reset Java Basics - Anfänger-Themen 16
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben