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....
 
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
 
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?
 
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
 
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();
    }
}
 
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
 
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,
 
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!
 
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 😉
 
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.

Zurück
Oben