Klassen Klassen Kommunikation

Darnok

Mitglied
Hallo Liebe Programmierer,

Ich programmiere Gerade ein Sudoku für die Schule und habe eine Klasse Die für das Lesen von Test Daten zuständig ist
Bild_2022-10-18_212634276.png

Hier ein Klassen Diagramm hoffe es hilft. Wie ihr seht habe ich schon selbst eine weitere Verbindung hinzugefügt da ich nicht wusste wie ich sonst auf Button druck die Funktion leseDaten() Starte. Sollte es hier bessere Möglichkeiten geben nur her damit 😉 .

Jetzt zum eigentlichen Problem ich will nach dem Lesen der Daten (Die in ein 2d Array eingelesen werden also die zahlen) die zahlen auch visuell direkt zeichnen.

Jetzt hatte ich erst gedacht ich mache einfach noch eine Verbindung zurück zur Gui aber damit entsteht ein Stack Overflow da sich die Klassen unendlich gegenseitig erstellen also frage:

Wie kann ich die Funktion zeicheZahlen() in meiner Gui Klasse ansprechen

Tipps allgemein zu Klassen sind auch willkommen

Danke 😉
 
Jetzt zum eigentlichen Problem ich will nach dem Lesen der Daten (Die in ein 2d Array eingelesen werden also die zahlen) die zahlen auch visuell direkt zeichnen.

Jetzt hatte ich erst gedacht ich mache einfach noch eine Verbindung zurück zur Gui aber damit entsteht ein Stack Overflow da sich die Klassen unendlich gegenseitig erstellen also frage:
Du denkst zu abstrakt, es sind zwie Operationen die nacheinander ausgefuehrt werden muessen, und niemand sagt wo dies passieren muss.

Also wenn du in der GUI folgenden Code hast:

Java:
private void onButtonPressed() {
    sudokoReader.leseDaten(ausgeaehlteDatei);
}

Dann kannst du ja einfach direkt folgendes machen:


Java:
private void onButtonPressed() {
    sudokoReader.leseDaten(ausgeaehlteDatei);
    zeichneSpielfeld();
}
 
Sorry entweder habe ich mich falsch ausgedrückt oder jetzt etwas falsch verstanden, aber ich denke so einfach ist es leider nicht.

Java:
//Code des Buttons
private void cmdTestActionPerformed(java.awt.event.ActionEvent evt) {                                       
        try {
            c_sodokuSpiel.readData();
            
        } catch (IOException ex) {

        }
    }

Java:
// weiter leitung des prozessen von gui über SudokuSpiel nach Testdaten
public void readData() throws IOException
    {
        c_reader.leseDaten();
    }

hier kommt dann der Befehl in der Klasse Testdatenreader an

Java:
// die Funktion zum lesen der daten
public void leseDaten() throws FileNotFoundException, IOException {
        String dataiName = "SodokoVorlagen\\richtig.txt";
        char[] number = new char[81 * 2];

        System.out.println("create file reader");
        try {
            FileReader bob = new FileReader(dataiName);

            bob.read(number);

            System.out.println("Data in the file: ");
            System.out.println((number));
            int reihe = 0;
            for (int i = 0; i < 81; i++) {
                if (((i) % 9) == 0 && i != 0) {
                    reihe++;
                }
                int zeile = ((i) % 9);

                if (spiel.pruefeZahl(zeile + 1, reihe + 1, number[2 * i])) {
                    System.out.println("" + zeile);
                    System.out.println("" + zeile + reihe + number[2 * i]);
                    spiel.initZahl(zeile + 1, reihe + 1, number[2 * i]);
                    //c_gui.zeichneZahl(zeile, reihe, number[2 * i]);
                    // würde ich gerne machen aber dafür müsste meine klasse die Gui klasse kennen

                }

            }

            bob.close();
        } catch (FileNotFoundException e) {
            System.out.println("" + e);
        } catch (IOException ex) {
            System.out.println("" + ex);
        }
    }

hier noch die Zeichnen funktion in der Gui
Java:
 public void zeichneZahl(int x, int y, int zahl) throws NumberFormatException {
        if (x * y != 0) {
            // Zahl im Kaestchen ausrichten
            int xKoord = breiteFeld * x + breiteFeld / 4;
            int yKoord = breiteFeld * y + (breiteFeld - 4);

            // Feld leeren
            // Zahl schreiben
            if (zahl > 0 && zahl < 10) {
                if (c_sodokuSpiel.setZahlSpiel(x, y, zahl)) {
                    zeichnung.clearRect(breiteFeld * x + 1, breiteFeld * y + 1, breiteFeld - 2, breiteFeld - 2);
                    //c_sodokuSpiel.setZahlSpiel(x, y, zahl); // brauch man glaub net
                    zeichnung.drawString("" + zahl, xKoord, yKoord);

                } else {
                    JOptionPane.showMessageDialog(this, "Die Zahl kannst du hier nicht Setzen!");
                }
            } else {
                JOptionPane.showMessageDialog(this, "Nur Zahlen 1-9 sind erlaubt");
            }
        }
    }

das Problem ist das ich die Zeichen Funktion für jede eingelesene zahl aufrufen will und soweit ich das sehe es auf einigermaßen gescheite weiße nur geht wenn die Klassen sich kennen aber dadurch entsteht der Overflow

Java:
// hier noch aus der Klasse SudokuSpiel die initZahl funktion
public void initZahl(int x, int y, int zahl) {
        sodokuArray[x-1][y-1].initZahl(zahl);
    }
Java:
// aus der Klasse SudokuFeld
public void initZahl(int zahl) {
        this.zahl = zahl;
        this.belegt = true;
    }
bezweifle zwar das die init funktionen relevant sind aber ich schick sie einfach mal mit

Java:
public boolean pruefeZahl(int x, int y, int zahl)
    {
        int xCord,yCord;
        xCord = x-1;
        yCord = y-1;
        
        
        if(sodokuArray[xCord][yCord].getZahl() == zahl) return true;
      
        
        for (int i = 0; i < 9; i++)
        {
            if(sodokuArray[xCord][i].getZahl() == zahl) return false;
            else if(sodokuArray[i][yCord].getZahl() == zahl) return false;
        }
        
        int xBox = 0,yBox = 0;
        
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if(x >= 1+j*3 && x<=3+j*3 && y >= 1+i*3 && y <= 3+i*3)
                {
                    xBox = j;
                    yBox = i;
                    break;
                }
            }
            
        }

hier noch die pruefeZahl funktion aber auch die sollte unwichtig sein

sorry wenn ich wieder irgendwas offensichtliches übersehe
 
dein Daten Array ist doch nur lokal in der Methode leseDaten.
"char[] number = new char[81 * 2];" i

Wie soll da die Gui darauf zugreifen?
 
dein Daten Array ist doch nur lokal in der Methode leseDaten.
"char[] number = new char[81 * 2];" i

Wie soll da die Gui darauf zugreifen?
Auf Zeile 24 in der leseDaten Funktion wird Spiel.initZahl aufgerufen mit der aktuellen Zahl. Ich hoffe mal dass das die Zahl im Spiel selbst setzt...aber ich habe den Code ehrlich gesagt nur ueberflogen weil es mir nur um die Strukturierung ging.
 
Und weiter? Du willst dass nicht waehrend dem einlesen, du willst das am Ende machen wenn alles eingelesen ist. Und was genau tut denn zeichenSpielfeld wenn nicht zeichneZahl fuer jede einzelne Zahl aufzurufen?
Zeiche Spielfeld zeichnet die linien etc.

Java:
private void zeichneSpielfeld() {

        for (int i = 0; i < 10; i++) {
            if ((i + 2) % 3 == 0) {
                zeichnung.setStroke(new BasicStroke(2));
            } else {
                zeichnung.setStroke(new BasicStroke(1));
            }

            zeichnung.drawLine(0, breiteFeld * i, breiteSpiel - 1, breiteFeld * i);
            zeichnung.drawLine(breiteFeld * i, 0, breiteFeld * i, hoeheSpiel + 1);

            zeichnung.drawString(String.valueOf(i + 1), breiteFeld / 2 - 2 + breiteFeld * (i + 1), breiteFeld / 2 + 4);
            zeichnung.drawString(String.valueOf(i + 1), breiteFeld / 2 - 2, breiteFeld / 2 + 4 + breiteFeld * (i + 1));
        }
        zeichnung.drawLine(0, breiteSpiel - 1, breiteSpiel - 1, breiteSpiel - 1);
        zeichnung.drawLine(breiteSpiel - 1, 0, breiteSpiel - 1, hoeheSpiel + 1);

    }

Aber danke ich mach mal ne neue Funktion die das Ganze Array durch geht und die zahlen alle neu zeichnet das sollte dann funktionieren
 
Auf Zeile 24 in der leseDaten Funktion wird Spiel.initZahl aufgerufen mit der aktuellen Zahl. Ich hoffe mal dass das die Zahl im Spiel selbst setzt...aber ich habe den Code ehrlich gesagt nur ueberflogen weil es mir nur um die Strukturierung ging.
Ja aber da wirt nur eine Zahl in der Klasse in einer Instanzvariablen gehalten mehr nicht.
Er will bestimmt alle haben zum zeichnen.

Wo kommt den Variable spiel her. Von wlelcher Klasse (Objekt) ist die?

OK es gibt zwei initZahl Methoden.
 
Zuletzt bearbeitet:
Ja aber da wirt nur eine Zahl in der Klasse in einer Instanzvariablen gehalten mehr nicht.
Er will bestimmt alle haben zum zeichnen.

Wo kommt den Variable spiel her. Von wlelcher Klasse (Objekt) ist die?

OK es gibt zwei initZahl Methoden.
spiel ist von SudokuSpiel Also der Name der klasse einfach

Zwischenfrage: wie Wandel in ascii code in ints um ? bekomme von meiner get Methode ascii code zurück brauche sie aber zum zeichnen als int
Danke 😉
 
Zwischenfrage: wie Wandel in ascii code in ints um ? bekomme von meiner get Methode ascii code zurück brauche sie aber zum zeichnen als int
Ascii codes bedeutet doch, dass Du es als char vorliegen hast. Und da kannst Du dann normal rechnen: myChar - '0' würde den "ASCII"-Wert von 0 von dem char Wert abziehen so dass Du den Wert der Ziffer bekommst. (ASCII in Anführungszeichen, denn in dem char hast Du kein ASCII Wert der ja nur 7 oder 8 Bit hätte (je nach Darstellung) sondern ein 16Bit Wert. (Java setzt eine UTF-16 Codierung ein, wobei char nicht zwingend ein gültiges UTF-16 Zeichen enthalten muss ...)
 
//c_gui.zeichneZahl(zeile, reihe, number[2 * i]); // würde ich gerne machen aber dafür müsste meine klasse die Gui klasse kennen
Deine GUI klasse erstellt doch bestimmt ein Objekt dieser Klasse. Dann gebe ihr doch dich selber mit. (This)
Also in der SodukuSpiel hast du eine Instanzvariable der GUI.

Mit der du das zeichnen aufrufen kannst.
 

Zurück
Oben