Mit Pfeiltasten Textboxen durchwählen

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
Hallo!
Ich bin dabei einen Sudokulöser zu schreiben und bin eigentlich auch vom Programm her ziemlich weit voran gekommen (lösungswege lassen wir mal aussen vor...)
Was ich allerdings gerne überarbeiten würde wäre das Handling des Programms. Bis jetzt kann man die Textboxen leider nur mit dem Tabtaste weiter schalten, was allerdings ziemlich ätzend ist wenn man die 1. und die 81. ausfüllen will!
gibt es eine möglichkeit mit den pfeiltasten über die textboxen zu navigieren? und gibt es eine möglichkeit, die aktuelle textbox hervor zu heben (evtl durch dicken rahmen oder oder oder)???
gruß manuche!
 

LoN_Nemesis

Bekanntes Mitglied
Du könntest Variablen der Form
Code:
int row, column;
mitführen. Jedesmal wenn eine Pfeiltaste gedrückt wird, zählst du die entsprechende Variable hoch bzw runter (natürlich mit Beschränkung >0 und <=9 oder so).
Dann musst du nur noch die zu den Koordinaten passende Textbox auswählen lassen.
 

manuche

Bekanntes Mitglied
gut das mit dem durchzählen ist eine möglichkeit... wo muss ich denn das ganze implementieren? da wo ich meine textboxen auch implementiere? und mit action listenern? ich habe garkeinen ansatz...
 

LoN_Nemesis

Bekanntes Mitglied
Naja ich meinte das in etwa so:

Code:
int zeile, spalte = 0; //diese Variablen irgendwo global anlegen

public void keyPressed(KeyEvent e) {
	if (e.getKeyCode() == KeyEvent.VK_UP)
		zeile--;
	else if (e.getKeyCode() == KeyEvent.VK_DOWN)
	   zeile++;
	else if (e.getKeyCode() == KeyEvent.VK_LEFT)
	   spalte--;
	else if (e.getKeyCode() == KeyEvent.VK_RIGHT)
	   spalte++;

	if (zeile>8)
		zeile = 8;
	else if (zeile<0)
		zeile = 0;
	if (spalte>8)
		spalte = 8;
	else if (spalte<0)
		spalte = 0;

	textBoxen[zeile][spalte].requestFocus();
}


Also wie du siehst brauchst du einen KeyListener. Der Code muss natürlich auf dein Projekt angepasst werden, ich hab ja keine Ahnung wie deine TextBoxen heissen und ob du sie überhaupt als Array verwaltest. Vielleicht gibt es auch eine bessere Lösung, aber das sollte eigentlich funktionieren.
 

manuche

Bekanntes Mitglied
Das war intuitiv richtig mit dem Array... Da gibt es nur ein kleines weiteres Problem... Und zwar hängt an den Textboxen ein weiterer Keylistener der aufpasst, dass nur eine Stelle und eine Zahl zwischen 1 und 9 eingegeben werden kann... Wenn ich jetzt navigiere sagt er mir natürlich das ich eine falsche Eingabe gemacht hab...
Ich ahb mir folgendes überlegt was allerdings nciht funktionier...

Code:
        matrix[i][j].addKeyListener(new KeyAdapter() { 
        	public void keyPressed(KeyEvent e) { 
        		if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT){
        		   if (e.getKeyCode() == KeyEvent.VK_UP){ 
        		      row--; 
        		   }else if (e.getKeyCode() == KeyEvent.VK_DOWN){ 
        		      row++; 
        		   }else if (e.getKeyCode() == KeyEvent.VK_LEFT){ 
        		      column--; 
        		   }else if (e.getKeyCode() == KeyEvent.VK_RIGHT){ 
        		      column++; 
        		   }
        		   if (row>8){ 
        		      row = 8; 
        		   }else if (row<0){ 
        		      row = 0; 
        		   }if (column>8){ 
        		      column = 8; 
        		   }else if (column<0){ 
        		      column = 0; 
        		   }
        		   matrix[row][column].requestFocus(); 
        		}else{
        			String input = ((TextField)e.getSource()).getText(); 
	                if(input.length() > 1){ 
	                    ((TextField)e.getSource()).setText(input.substring(0,1)); 
	                    ((TextField)e.getSource()).setCaretPosition(1);
	                    JOptionPane.showMessageDialog(null, 
	                    "Es ist nur eine maximale Zeichenlänge\nvon 1 erlaubt!");
	                }
	                try{ 
	                    int zahl = Integer.parseInt(((TextField)e.getSource()).getText());
	                    if (zahl == 0){
	                    	((TextField)e.getSource()).setText("");
	                    	JOptionPane.showMessageDialog(null, 
	                        "Es sind nur Zahlen zwischen\n1 und 9 erlaubt!");
	                    }
	                }catch(NumberFormatException e) { 
	                    ((TextField)e.getSource()).setText(""); 
	                    JOptionPane.showMessageDialog(null, 
	                    "Es sind nur numerische Werte erlaubt!");
	                } 	
        		}
        	}
        });
und zwar mit folgender Fehlermeldung:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Duplicate parameter e
The method getSource() is undefined for the type NumberFormatException

at Sudokusolver.<init>(Sudokusolver.java:128)
at Sudokusolver.main(Sudokusolver.java:364)
 
G

Guest

Gast
manuche hat gesagt.:
Das war intuitiv richtig mit dem Array... Da gibt es nur ein kleines weiteres Problem... Und zwar hängt an den Textboxen ein weiterer Keylistener der aufpasst, dass nur eine Stelle und eine Zahl zwischen 1 und 9 eingegeben werden kann... Wenn ich jetzt navigiere sagt er mir natürlich das ich eine falsche Eingabe gemacht hab...
Ich ahb mir folgendes überlegt was allerdings nciht funktionier...

Code:
        matrix[i][j].addKeyListener(new KeyAdapter() { 
        	public void keyPressed(KeyEvent e) { 
        		if (e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_RIGHT){
        		   if (e.getKeyCode() == KeyEvent.VK_UP){ 
        		      row--; 
        		   }else if (e.getKeyCode() == KeyEvent.VK_DOWN){ 
        		      row++; 
        		   }else if (e.getKeyCode() == KeyEvent.VK_LEFT){ 
        		      column--; 
        		   }else if (e.getKeyCode() == KeyEvent.VK_RIGHT){ 
        		      column++; 
        		   }
        		   if (row>8){ 
        		      row = 8; 
        		   }else if (row<0){ 
        		      row = 0; 
        		   }if (column>8){ 
        		      column = 8; 
        		   }else if (column<0){ 
        		      column = 0; 
        		   }
        		   matrix[row][column].requestFocus(); 
        		}else{
        			String input = ((TextField)e.getSource()).getText(); 
	                if(input.length() > 1){ 
	                    ((TextField)e.getSource()).setText(input.substring(0,1)); 
	                    ((TextField)e.getSource()).setCaretPosition(1);
	                    JOptionPane.showMessageDialog(null, 
	                    "Es ist nur eine maximale Zeichenlänge\nvon 1 erlaubt!");
	                }
	                try{ 
	                    int zahl = Integer.parseInt(((TextField)e.getSource()).getText());
	                    if (zahl == 0){
	                    	((TextField)e.getSource()).setText("");
	                    	JOptionPane.showMessageDialog(null, 
	                        "Es sind nur Zahlen zwischen\n1 und 9 erlaubt!");
	                    }
	                }catch(NumberFormatException e) { 
	                    ((TextField)e.getSource()).setText(""); 
	                    JOptionPane.showMessageDialog(null, 
	                    "Es sind nur numerische Werte erlaubt!");
	                } 	
        		}
        	}
        });
und zwar mit folgender Fehlermeldung:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Duplicate parameter e
The method getSource() is undefined for the type NumberFormatException

at Sudokusolver.<init>(Sudokusolver.java:128)
at Sudokusolver.main(Sudokusolver.java:364)

Die Fehlermeldung ist ja wohl vollkommen eindeutig! Ein Objekt vom Typ NumberFormatException besitzt keine Methode getSource().
 

manuche

Bekanntes Mitglied
Irgendwas ist da schief gelaufen... also so gehts...:

Code:
matrix[i][j].addKeyListener(new KeyAdapter() { 
		  public void keyReleased(java.awt.event.KeyEvent evt) { 
		    String input = ((TextField)evt.getSource()).getText(); 
		    if (input.length() > 1){ 
		      ((TextField)evt.getSource()).setText(input.substring(0,1)); 
		      ((TextField)evt.getSource()).setCaretPosition(1); 
		    } 
	        try{ 
	            int zahl = Integer.parseInt(((TextField)evt.getSource()).getText()); 
	            if(zahl == 0) 
	                ((TextField)evt.getSource()).setText(""); 
	        }catch(NumberFormatException e) { 
	            ((TextField)evt.getSource()).setText(""); 
	        }
		  } 
		});

wie bekomm ich die beiden keylistener denn jetzt zusammen? also das er mir nicht den fehler sagt wenn ich nur durch die boxen stepen will???
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben