Frage von fthee, 17

Java Textfeld?

Hallo Zusammen:

Ich programmiere gerade ein Sudoku - dazu hab ich für die GUI 81 Textfelder in Tabellenform mit dem GridBag-Layout angeordnet. Das eigentliche Sudoku ist in einer Matrix gespeichert. Die Lösung in einer anderen Matrix.

Jetzt suche ich schon seit mehreren Stunden nach einer Funktion, um den Text, den man in die Felder eintragen kann, in die Matrix zu übertragen, um ihn dort auf seine Richtigkeit zu überprüfen. Außerdem benötige ich eine Funktion, um den Text von der Matrix in die Textfelder zu schreiben. Ich hoffe jemand weiß, was ich meine, denn ich habe leider keine gescheiten Ergebnisse recherchieren können... Danke schon mal ;)

Expertenantwort
von KnusperPudding, Community-Experte für Java, 4

Werte aus einem Textfeld auszulesen geht via: 

JTextField#getText();

sowie das schreiben:

JTextField#setText(String value);

Du solltest gemäß deiner Datenmatrix eine weitere Matrix anlegen, in der du die Textfelder abspeicherst. mit den selben Maßen, also:

int[][] matrix = new int[9][9];

JTextField[][] textFields = new JTextField[9][9];

Da du wohl Swing benutzt, ist die Lösung hierfür leider nicht so schön wie mit FX.

Daher in Schritt 1: Schreiben von JTextField in deine Matrix: Hier sollte man in Swing einen Keylistener verwenden, da es ja nur um Tastatur-Eingaben geht.

Durch dieselbe Matrix kannst du nun leichter Referenzieren, welches Textfield zu welchem Wert aus deiner Matrix passt.

Beim Keylistener würde ich eine eigene Klasse verwenden, die diesen Implementiert. z.b. so:

class MyKeyListener implements KeyListener {

private int row; private int column; private JTextField textField;
public MyKeyListener(int row, int column, JTextField textField) { this.row = row; this.column = column; this.textField = textField; }
@Override public void keyTyped(KeyEvent e) { matrix[row][column] = Integer.parseInt(textField.getText()); }
@Override public void keyPressed(KeyEvent e) { }
@Override public void keyReleased(KeyEvent e) { } }

Beim Setzen der Listener sähe das so aus:

for (int row = 0; row < matrix.length; row++) {
    for (int col = 0; col < matrix[row].length; col++) {
        JTextField jtextField = new JTextField();
        jtextField.addKeyListener(new MyKeyListener(row, col, jtextField));
    }
}

In die Andere Richtung dürfte es deutlich leichter sein.

Wenn du von einem Wert aus deiner Matrix auf ein Textfeld referenzierst, ist dir die Position in der Matrix ja bekannt, also z.b:

int value = matrix[3][5];

Entsprechend weißt du über die Position auch, wo sich das Textfield befindet und kannst so den Wert direkt setzen:

textfields[3][5].setText(String.valueOf(value));
Antwort
von CaptainWobbles, 4

um den text aus den textfeldern zu kriegen empfehle ich dir einen DocumenListener, ein schönes Beispiel dafür gibt es hier http://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html

um die textfelder erstmal zu füllen kannst du die setText methode nutzen. Mehr dazu hier https://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#s...(java.lang.String)

kleiner Tipp: Beim Programmieren immer schön in die API gucken dann findet man das meiste selbst heraus

Keine passende Antwort gefunden?

Fragen Sie die Community