[Java] Textveld vergelijken met database dmv keyPressed

Pagina: 1
Acties:

  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 09-02 23:35
Ik ben op dit moment bezig met een programma die sodoku's kan oplossen, geheel op eigen wijze wil ik ervoor zorgen dat er niet 2 dezelfde cijfers in 1 rij komen. Daarvoor gebruik ik nu 3 objecten: de applet(Sodoku), de database(Database) en een overerving van TextField(NumericTextField).
Die laatste gebruik ik om de input niet langer te laten worden dan 1 en om ervoor te zorgen dat er alleen cijfers in gestopt worden.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.awt.*;
import java.awt.TextField;
import javax.swing.JTextField;
import java.awt.event.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.InputEvent;
 
public class NumericTextField extends TextField implements KeyListener
{
    private int maxSumChar;
    private Sodoku sodoku;
    
    public NumericTextField(String _initialStr, int _col, int maxSumChar, Sodoku sodoku)
    {
        super (_initialStr, _col) ;
        this. maxSumChar = maxSumChar;
        this.addKeyListener(this);
        this.sodoku = sodoku;
    }
        
    public NumericTextField(int _col, int _maxSumChar, Sodoku _sodoku)
    {
        this ("", _col, _maxSumChar, _sodoku);
    }
    
    public void keyPressed(KeyEvent e) { 
        char c = e.getKeyChar();
        String input = String.valueOf(c);
        int textFieldDataLength = this.getText().length();

        if (!((c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE) ||  (c == KeyEvent.VK_ENTER) || (c == KeyEvent.VK_TAB) || (Character.isDigit(c)) || e.isActionKey() )) {
            e.consume();
        }

        if (!sodoku.checkIfInputIsCorrect(this, input)) {
            e.consume();
        }
        
        if (textFieldDataLength < maxSumChar) {
            return;
        }
        else if ((c==KeyEvent.VK_BACK_SPACE) || (c==KeyEvent.VK_DELETE) || (c==KeyEvent.VK_ENTER) || (c==KeyEvent.VK_TAB) || e.isActionKey() || (!this.getSelectedText().equals(""))) {
            return;
        }
        else {
            e.consume();
        }
    }
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}
}


Dan gebruik ik vervolgens mijn applet om de input van het textveld te vergelijken met de rij waar hij in staat. Dit doe ik door het object waar de input vandaan komt te vergelijken met alle textvelden die er zijn aangemaakt (een makkelijkere methode weet ik niet):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public boolean checkIfInputIsCorrect(NumericTextField numericTextField, String value) 
    {
        boolean returnValue = true;
        
        for (int rowToGet = 0; rowToGet < ROW; rowToGet++) {
            for (int colToGet = 0; colToGet < COL; colToGet++) {
                if (numericTextField.equals(sodoku[rowToGet][colToGet])) {
                    if (sodokuDatabase.checkRowOnSameNumber(rowToGet, value)) {
                        returnValue = false;
                    }
                }
            }
        }
        return returnValue;
    }


De ROW en de COL worden aan het begin vast gezet als final en static en mijn NumericTextField wordt aangemaakt als volgt:
Java:
1
sodoku[0][0] = new NumericTextField("",sodokuFieldColumns, sodokuFieldLenght, this)

en dat door totdat er sodoku[8][8] is(het komt nog in een for lus vandaar dat ik werk met de sodoku[integer][integer]).

In de Database worden de waardes als volgt vergeleken. De hele rij wordt doorgelopen en als er een vergelijkbaar nummer is dan wordt er een true worden weergegeven.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
    public boolean checkRowOnSameNumber(int xa, String value)
    {
        boolean returnValue = false;
        
        for(int columnToGet = 0; columnToGet < col; columnToGet++) {
            String temp = database[xa][columnToGet];
            if (temp.equals(value)) {
                returnValue = true;
            }
        }
        return returnValue;
    }

De col hier wordt aangemaakt aan de hand van de COL van mijn applet.

Wat ik wil voorkomen dmv deze code is dat er geen cijfers in het textveld worden gezet als deze al aanwezig is in de rij of in de kolom(kolom heb ik hier niet, want het principe is hetzelfde). Maar de temp.equals(value) faalt in dit geval, als ik de if statement weghaal dan wordt er niks in m'n tekstveld gezet en dat is hoe het zou moeten werken maar dan met een voorwaarde(temp.equals(value)). Dus ik zou zeggen dat het bij de if statment fout gaat.

Wat mijn vraag is, hoe komt het dat mijn if (temp.equals(value)) faalt?

Verwijderd

Sorry

[ Voor 255% gewijzigd door Verwijderd op 16-03-2006 23:28 . Reden: het was onzin ]


Verwijderd

kan je de boel niet gewoon eens printen? De waarden die zich in "temp" bevinden bedoel ik. Dan zie waar je mee aan het vergelijken bent.

[ Voor 198% gewijzigd door Verwijderd op 16-03-2006 23:42 ]


  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 09-02 23:35
Java:
1
2
3
4
5
6
7
8
9
10
11
    public void setDatabase(String inputDatabaseTemp) {
        int inputDatabasePosition = 0;
        String[] inputDatabase = inputDatabaseTemp.split(":");

        for (int rowToEdit = 0; rowToEdit < row; rowToEdit++) {
            for (int colToEdit = 0; colToEdit < col; colToEdit++) {
                database[rowToEdit][colToEdit] = inputDatabase[inputDatabasePosition];
                inputDatabasePosition++;
            }            
        }
    }


En de waardes komen uit alle textvelden dmv een for lus en getText(). Ziet er na het uithalen van de de tekstvelden dus bijvoorbeeld als volgt uit.
code:
1
3:1:8:7......

De waardes uit de tekstvelden halen, er mee rekenen(een simpele oplosser werkt op dit moment al) werkt al. De gegevens kunnen uit de database worden gehaald, geanalyseerd en worden terug gestopt in de applet(ik heb al getest met een sp!ts sodoku en dat werkt prima).

Deze staat overigens in database.

[ Voor 4% gewijzigd door EnsconcE op 17-03-2006 00:00 ]