JFrame, JPanel - JLabels werden nicht angezeigt?

4 Antworten

package com.company;

import java.util.Random;

// enthält alle in dem Rätsel möglichen Woerter
class Woerter {

    Random random = new Random();
    int l = 0;
    int m = 0;
    int m1 = 0, m2 = 0, m3 = 0, m4 = 0, m5 = 0, m6 = 0, m7 = 0, m8 = 0;

    String ergebnisHorizontal;
    String ergebnisVertikal1; // gibt einen zufällig gewählten vertikalen String wieder
    String ergebnisVertikal2;
    String ergebnisVertikal3;
    String ergebnisVertikal4;
    String ergebnisVertikal5;
    String ergebnisVertikal6;
    String ergebnisVertikal7;
    String ergebnisVertikal8;

    // Gibt zufällig den anzuzeigen Buchstaben aus
    public String Buchstabe(int spalte, int reihe){

        String ergebnisVertikal = ErgebnisVertikalGeprueft(spalte, reihe);  // holt den Wert von ergebnisVertikal aus getErgebnisVertikal und prüft ihn
                                                                            // spalte und reihe werden für die Initialisierung von ergebnisVertikal verwendet
        String ergebnisHorizontal = ErgebnisHorizontal(spalte);
        char[] arrayHorizontal = ergebnisHorizontal.toCharArray(); // ein Array aus den Buchstaben des zufällig gewählten Strings aus
        char[] arrayVertikal = ergebnisVertikal.toCharArray(); // ein Array aus den Buchstaben des zufällig gewählten Strings aus
        int i = random.nextInt(3);
        char[] arrayAllgemein = new char[3];
        arrayAllgemein[0] = arrayHorizontal[l];
        arrayAllgemein[1] = arrayVertikal[m];
        arrayAllgemein[2] = BeliebigerBuchstabe();
        String buchstabe = "";

        boolean mUndSpalte = SpalteHatVertikalenBuchstaben(spalte); // prüft, ob es für die gleiche Spaltennummer schon einen festgelegten String gibt

        // Gibt alle Zeichen eines horizontalen Wortes aus
        if (arrayAllgemein[i] == arrayHorizontal[l] || l > 0) {
            buchstabe = String.valueOf(arrayHorizontal[l]);
            l++;
        }

        // Gibt alle Zeichen eines vertikalen Wortes aus
        if (arrayAllgemein[i] == arrayVertikal[m] || mUndSpalte) {
            switch (spalte) {
                case 1:
                    m = m1;
                    m1++;
                    break;
                case 2:
                    m = m2;
                    m2++;
                    break;
                case 3:
                    m = m3;
                    m3++;
                    break;
                case 4:
                    m = m4;
                    m1++;
                    break;
                case 5:
                    m = m5;
                    m5++;
                    break;
                case 6:
                    m = m6;
                    m6++;
                    break;
                case 7:
                    m = m7;
                    m7++;
                    break;
                case 8:
                    m = m8;
                    m8++;
                    break;
            }
            buchstabe = String.valueOf(arrayVertikal[m]);
        }
        return buchstabe;
    }
    // ein zufällig gewählter String wird ausgegeben
    public String Woerter() { // enthält alle horizontal geschriebenen Wörter

        String[] array = new String[11];
        array[0] = " ";
        array[1] = "JAVA";
        array[2] = "PC";
        array[3] = "TABLET";
        array[4] = "HANDY";
        array[5] = "TELEFON";
        array[6] = "KONSOLE";
        array[7] = "SPIEL";
        array[8] = "DRUCKER";
        array[9] = "KOPIERER";
        array[10] = "SCANNER";

        int i = random.nextInt(11);

        String string = array[i];

        return string; // einer der Strings wird zufällig ausgewählt und ausgegeben
    }
    String ErgebnisHorizontal(int spalte){
        if (l == 0) {
            ergebnisHorizontal = Woerter();
        }
        int platzHorizontal = 8 - spalte + 1; // verbleibender Platz bei 8 Spalten inklusive aktueller Spalte
        int benoetigterPlatzHorizontal = ergebnisHorizontal.length();
        if (benoetigterPlatzHorizontal > platzHorizontal || l == ergebnisHorizontal.length() - 1){
            l = 0;
            do {
                ergebnisHorizontal = Woerter();
            }while (benoetigterPlatzHorizontal > platzHorizontal);
        }
        return ergebnisHorizontal;
    }
    String getErgebnisVertikal(int spalte){
        String ergebnisVertikal = "";

        switch (spalte){
            case 1:
                if (m1 == 0 || m1 == ergebnisVertikal1.length() - 1) { // wenn in der Spalte noch kein vertikaler String angefangen oder gerade einer abgeschlossen wurde
                    m1 = 0; // wenn m1 == ergebnisVertikal1.length() - 1, wird m1 zurückgesetzt
                    ergebnisVertikal1 = Woerter(); // gibt einen zufällig gewählten vertikalen String wieder
                }
                ergebnisVertikal = ergebnisVertikal1;
                break;
            case 2:
                if (m2 == 0 || m2 == ergebnisVertikal2.length() - 1){
                    m2 = 0;
                    ergebnisVertikal2 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal2;
                break;
            case 3:
                if (m3 == 0 || m3 == ergebnisVertikal3.length() - 1) {
                    m3 = 0;
                    ergebnisVertikal3 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal3;
                break;
            case 4:
                if (m4 == 0 || m4 == ergebnisVertikal4.length() - 1) {
                    m4 = 0;
                    ergebnisVertikal4 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal4;
                break;
            case 5:
                if (m5 == 0 || m5 == ergebnisVertikal5.length() - 1) {
                    m5 = 0;
                    ergebnisVertikal5 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal5;
                break;
            case 6:
                if (m6 == 0 || m6 == ergebnisVertikal6.length() - 1) {
                    m6 = 0;
                    ergebnisVertikal6 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal6;
                break;
            case 7:
                if (m7 == 0 || m7 == ergebnisVertikal7.length() - 1) {
                    m7 = 0;
                    ergebnisVertikal7 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal7;
                break;
            case 8:
                if (m8 == 0 || m8 == ergebnisVertikal8.length() - 1) {
                    m8 = 0;
                    ergebnisVertikal8 = Woerter();
                }
                ergebnisVertikal = ergebnisVertikal8;
                break;
        }
        return ergebnisVertikal;
    }
    String ErgebnisVertikalGeprueft(int spalte, int reihe){
        String ergebnisVertikalGeprueft = getErgebnisVertikal(spalte);

        boolean gleich = GleichVertikal(spalte); //stellt sicher, dass jeder String einen anderen Wert enthält

        int benoetigterPlatzVertikal = ergebnisVertikalGeprueft.length();
        int PlatzVertikal = 8 - reihe + 1;
        if (gleich || benoetigterPlatzVertikal > PlatzVertikal){
            do {
                ergebnisVertikalGeprueft = getErgebnisVertikal(spalte);
                benoetigterPlatzVertikal = ergebnisVertikalGeprueft.length();
                gleich = GleichVertikal(spalte);
            }while (gleich || benoetigterPlatzVertikal > PlatzVertikal);
        }
        return ergebnisVertikalGeprueft;
    }
    char BeliebigerBuchstabe(){
        char[] arrayBeliebigerBuchstabe = new char[10];

        arrayBeliebigerBuchstabe[0] = 'A';
        arrayBeliebigerBuchstabe[1] = 'B';
        arrayBeliebigerBuchstabe[2] = 'X';
        arrayBeliebigerBuchstabe[3] = 'Y';
        arrayBeliebigerBuchstabe[4] = 'L';
        arrayBeliebigerBuchstabe[5] = 'I';
        arrayBeliebigerBuchstabe[6] = 'N';
        arrayBeliebigerBuchstabe[7] = 'O';
        arrayBeliebigerBuchstabe[8] = 'P';
        arrayBeliebigerBuchstabe[9] = 'U';

        int i = random.nextInt(10);

        char beliebigerBuchstabe = arrayBeliebigerBuchstabe[i];

        return beliebigerBuchstabe;
    }
    Boolean GleichVertikal(int spalte){

        // sind true, wenn keiner der Strings mit einem anderen überein stimmt
        boolean ungleich1 = (ergebnisVertikal1 != ergebnisVertikal2) && (ergebnisVertikal1 != ergebnisVertikal3) && (ergebnisVertikal1 != ergebnisVertikal4) && (ergebnisVertikal1 != ergebnisVertikal5) && (ergebnisVertikal1 != ergebnisVertikal6) && (ergebnisVertikal1 != ergebnisVertikal7) && (ergebnisVertikal1 != ergebnisVertikal8);
        boolean ungleich2 = (ergebnisVertikal2 != ergebnisVertikal1) && (ergebnisVertikal2 != ergebnisVertikal3) && (ergebnisVertikal2 != ergebnisVertikal4) && (ergebnisVertikal2 != ergebnisVertikal5) && (ergebnisVertikal2 != ergebnisVertikal6) && (ergebnisVertikal2 != ergebnisVertikal7) && (ergebnisVertikal2 != ergebnisVertikal8);
        boolean ungleich3 = (ergebnisVertikal3 != ergebnisVertikal1) && (ergebnisVertikal3 != ergebnisVertikal2) && (ergebnisVertikal3 != ergebnisVertikal4) && (ergebnisVertikal3 != ergebnisVertikal5) && (ergebnisVertikal3 != ergebnisVertikal6) && (ergebnisVertikal3 != ergebnisVertikal7) && (ergebnisVertikal3 != ergebnisVertikal8);
        boolean ungleich4 = (ergebnisVertikal4 != ergebnisVertikal1) && (ergebnisVertikal4 != ergebnisVertikal2) && (ergebnisVertikal4 != ergebnisVertikal3) && (ergebnisVertikal4 != ergebnisVertikal5) && (ergebnisVertikal4 != ergebnisVertikal6) && (ergebnisVertikal4 != ergebnisVertikal7) && (ergebnisVertikal4 != ergebnisVertikal8);
        boolean ungleich5 = (ergebnisVertikal5 != ergebnisVertikal1) && (ergebnisVertikal5 != ergebnisVertikal2) && (ergebnisVertikal5 != ergebnisVertikal3) && (ergebnisVertikal5 != ergebnisVertikal4) && (ergebnisVertikal5 != ergebnisVertikal6) && (ergebnisVertikal5 != ergebnisVertikal7) && (ergebnisVertikal5 != ergebnisVertikal8);
        boolean ungleich6 = (ergebnisVertikal6 != ergebnisVertikal1) && (ergebnisVertikal6 != ergebnisVertikal2) && (ergebnisVertikal6 != ergebnisVertikal3) && (ergebnisVertikal6 != ergebnisVertikal4) && (ergebnisVertikal6 != ergebnisVertikal5) && (ergebnisVertikal6 != ergebnisVertikal7) && (ergebnisVertikal6 != ergebnisVertikal8);
        boolean ungleich7 = (ergebnisVertikal7 != ergebnisVertikal1) && (ergebnisVertikal7 != ergebnisVertikal2) && (ergebnisVertikal7 != ergebnisVertikal3) && (ergebnisVertikal7 != ergebnisVertikal4) && (ergebnisVertikal7 != ergebnisVertikal5) && (ergebnisVertikal7 != ergebnisVertikal6) && (ergebnisVertikal7 != ergebnisVertikal8);
        boolean ungleich8 = (ergebnisVertikal8 != ergebnisVertikal1) && (ergebnisVertikal8 != ergebnisVertikal2) && (ergebnisVertikal8 != ergebnisVertikal3) && (ergebnisVertikal8 != ergebnisVertikal4) && (ergebnisVertikal8 != ergebnisVertikal5) && (ergebnisVertikal8 != ergebnisVertikal6) && (ergebnisVertikal8 != ergebnisVertikal7);
        boolean ungleich = true; // Standardwert

        switch (spalte){
            case 1: ungleich = ungleich1;
                    break;
            case 2: ungleich = ungleich2;
                    break;
            case 3: ungleich = ungleich3;
                    break;
            case 4: ungleich = ungleich4;
                    break;
            case 5: ungleich = ungleich5;
                    break;
            case 6: ungleich = ungleich6;
                    break;
            case 7: ungleich = ungleich7;
                    break;
            case 8: ungleich = ungleich8;
                    break;
        }

        boolean gleich = !ungleich;

        return gleich;
    }
    Boolean SpalteHatVertikalenBuchstaben(int spalte){

        boolean m1UndSpalte1 = m1 > 0 && spalte == 1;
        boolean m2UndSpalte2 = m2 > 0 && spalte == 2;
        boolean m3UndSpalte3 = m3 > 0 && spalte == 3;
        boolean m4UndSpalte4 = m4 > 0 && spalte == 4;
        boolean m5UndSpalte5 = m5 > 0 && spalte == 5;
        boolean m6UndSpalte6 = m6 > 0 && spalte == 6;
        boolean m7UndSpalte7 = m7 > 0 && spalte == 7;
        boolean m8UndSpalte8 = m8 > 0 && spalte == 8;
        boolean mUndSpalte = m1UndSpalte1 || m2UndSpalte2 || m3UndSpalte3 || m4UndSpalte4 || m5UndSpalte5 || m6UndSpalte6 || m7UndSpalte7 || m8UndSpalte8;

        return mUndSpalte;
    }
}

das sind meine drei klassen

regex9  16.04.2018, 15:02

Ich schaue mir das heute Abend einmal genauer an. Es gibt so einiges, was sich noch verbessern lässt.

0
package com.company;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.*;

public class GUI {

    public JFrame Fenster(){
        JFrame fenster = new JFrame("Kreuzworträtsel");

        //fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(1000,1000);
        fenster.setLayout(new GridLayout(8,8));
        fenster.setVisible(true);

        // Feldreihen
        JPanel reihea = Reihea();
        JPanel reiheb = Reiheb();
        JPanel reihec = Reihec();
        JPanel reihed = Reihed();
        JPanel reihee = Reihee();
        JPanel reihef = Reihef();
        JPanel reiheg = Reiheg();
        JPanel reiheh = Reiheh();

        fenster.add(reihea);
        fenster.add(reiheb);
        fenster.add(reihec);
        fenster.add(reihed);
        fenster.add(reihee);
        fenster.add(reihef);
        fenster.add(reiheg);
        fenster.add(reiheh);

        return fenster;
    }

    Woerter string = new Woerter();

    // Feldreihen
    JPanel Reihea(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1a = new JLabel(string.Buchstabe(1,1));
        JLabel Feld2a = new JLabel(string.Buchstabe(2,1));
        JLabel Feld3a = new JLabel(string.Buchstabe(3,1));
        JLabel Feld4a = new JLabel(string.Buchstabe(4,1));
        JLabel Feld5a = new JLabel(string.Buchstabe(5,1));
        JLabel Feld6a = new JLabel(string.Buchstabe(6,1));
        JLabel Feld7a = new JLabel(string.Buchstabe(7,1));
        JLabel Feld8a = new JLabel(string.Buchstabe(8,1));

        reihe.add(Feld1a);
        reihe.add(Feld2a);
        reihe.add(Feld3a);
        reihe.add(Feld4a);
        reihe.add(Feld5a);
        reihe.add(Feld6a);
        reihe.add(Feld7a);
        reihe.add(Feld8a);

        return reihe;
    }
    JPanel Reiheb(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1b = new JLabel(string.Buchstabe(1,2));
        JLabel Feld2b = new JLabel(string.Buchstabe(2,2));
        JLabel Feld3b = new JLabel(string.Buchstabe(3,2));
        JLabel Feld4b = new JLabel(string.Buchstabe(4,2));
        JLabel Feld5b = new JLabel(string.Buchstabe(5,2));
        JLabel Feld6b = new JLabel(string.Buchstabe(6,2));
        JLabel Feld7b = new JLabel(string.Buchstabe(7,2));
        JLabel Feld8b = new JLabel(string.Buchstabe(8,2));

        reihe.add(Feld1b);
        reihe.add(Feld2b);
        reihe.add(Feld3b);
        reihe.add(Feld4b);
        reihe.add(Feld5b);
        reihe.add(Feld6b);
        reihe.add(Feld7b);
        reihe.add(Feld8b);

        return reihe;
    }
    JPanel Reihec(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1c = new JLabel(string.Buchstabe(1,3));
        JLabel Feld2c = new JLabel(string.Buchstabe(2,3));
        JLabel Feld3c = new JLabel(string.Buchstabe(3,3));
        JLabel Feld4c = new JLabel(string.Buchstabe(4,3));
        JLabel Feld5c = new JLabel(string.Buchstabe(5,3));
        JLabel Feld6c = new JLabel(string.Buchstabe(6,3));
        JLabel Feld7c = new JLabel(string.Buchstabe(7,3));
        JLabel Feld8c = new JLabel(string.Buchstabe(8,3));

        reihe.add(Feld1c);
        reihe.add(Feld2c);
        reihe.add(Feld3c);
        reihe.add(Feld4c);
        reihe.add(Feld5c);
        reihe.add(Feld6c);
        reihe.add(Feld7c);
        reihe.add(Feld8c);

        return reihe;
    }
    JPanel Reihed(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1d = new JLabel(string.Buchstabe(1,4));
        JLabel Feld2d = new JLabel(string.Buchstabe(2,4));
        JLabel Feld3d = new JLabel(string.Buchstabe(3,4));
        JLabel Feld4d = new JLabel(string.Buchstabe(4,4));
        JLabel Feld5d = new JLabel(string.Buchstabe(5,4));
        JLabel Feld6d = new JLabel(string.Buchstabe(6,4));
        JLabel Feld7d = new JLabel(string.Buchstabe(7,4));
        JLabel Feld8d = new JLabel(string.Buchstabe(8,4));

        reihe.add(Feld1d);
        reihe.add(Feld2d);
        reihe.add(Feld3d);
        reihe.add(Feld4d);
        reihe.add(Feld5d);
        reihe.add(Feld6d);
        reihe.add(Feld7d);
        reihe.add(Feld8d);

        return reihe;
    }
    JPanel Reihee(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1e = new JLabel(string.Buchstabe(1,5));
        JLabel Feld2e = new JLabel(string.Buchstabe(2,5));
        JLabel Feld3e = new JLabel(string.Buchstabe(3,5));
        JLabel Feld4e = new JLabel(string.Buchstabe(4,5));
        JLabel Feld5e = new JLabel(string.Buchstabe(5,5));
        JLabel Feld6e = new JLabel(string.Buchstabe(6,5));
        JLabel Feld7e = new JLabel(string.Buchstabe(7,5));
        JLabel Feld8e = new JLabel(string.Buchstabe(8,5));

        reihe.add(Feld1e);
        reihe.add(Feld2e);
        reihe.add(Feld3e);
        reihe.add(Feld4e);
        reihe.add(Feld5e);
        reihe.add(Feld6e);
        reihe.add(Feld7e);
        reihe.add(Feld8e);

        return reihe;
    }
    JPanel Reihef(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1f = new JLabel(string.Buchstabe(1,6));
        JLabel Feld2f = new JLabel(string.Buchstabe(2,6));
        JLabel Feld3f = new JLabel(string.Buchstabe(3,6));
        JLabel Feld4f = new JLabel(string.Buchstabe(4,6));
        JLabel Feld5f = new JLabel(string.Buchstabe(5,6));
        JLabel Feld6f = new JLabel(string.Buchstabe(6,6));
        JLabel Feld7f = new JLabel(string.Buchstabe(7,6));
        JLabel Feld8f = new JLabel(string.Buchstabe(8,6));

        reihe.add(Feld1f);
        reihe.add(Feld2f);
        reihe.add(Feld3f);
        reihe.add(Feld4f);
        reihe.add(Feld5f);
        reihe.add(Feld6f);
        reihe.add(Feld7f);
        reihe.add(Feld8f);

        return reihe;
    }
    JPanel Reiheg(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1g = new JLabel(string.Buchstabe(1,7));
        JLabel Feld2g = new JLabel(string.Buchstabe(2,7));
        JLabel Feld3g = new JLabel(string.Buchstabe(3,7));
        JLabel Feld4g = new JLabel(string.Buchstabe(4,7));
        JLabel Feld5g = new JLabel(string.Buchstabe(5,7));
        JLabel Feld6g = new JLabel(string.Buchstabe(6,7));
        JLabel Feld7g = new JLabel(string.Buchstabe(7,7));
        JLabel Feld8g = new JLabel(string.Buchstabe(8,7));

        reihe.add(Feld1g);
        reihe.add(Feld2g);
        reihe.add(Feld3g);
        reihe.add(Feld4g);
        reihe.add(Feld5g);
        reihe.add(Feld6g);
        reihe.add(Feld7g);
        reihe.add(Feld8g);

        return reihe;
    }
    JPanel Reiheh(){
        JPanel reihe = new JPanel(new GridLayout(1,8));

        // Felder
        JLabel Feld1h = new JLabel(string.Buchstabe(1,8));
        JLabel Feld2h = new JLabel(string.Buchstabe(2,8));
        JLabel Feld3h = new JLabel(string.Buchstabe(3,8));
        JLabel Feld4h = new JLabel(string.Buchstabe(4,8));
        JLabel Feld5h = new JLabel(string.Buchstabe(5,8));
        JLabel Feld6h = new JLabel(string.Buchstabe(6,8));
        JLabel Feld7h = new JLabel(string.Buchstabe(7,8));
        JLabel Feld8h = new JLabel(string.Buchstabe(8,8));

        reihe.add(Feld1h);
        reihe.add(Feld2h);
        reihe.add(Feld3h);
        reihe.add(Feld4h);
        reihe.add(Feld5h);
        reihe.add(Feld6h);
        reihe.add(Feld7h);
        reihe.add(Feld8h);

        return reihe;
    }
}

Also, mir sind, wie schon gesagt, einige Dinge aufgefallen, die du unbedingt angehen / verbessern solltest. Falls du Logikfehler haben solltest, werde ich auf diese nicht eingehen, denn soweit möchte ich dein Programm nicht prüfen.

1) Benennung der Bezeichner

Es ist immer das Gleiche, bei jedem muss man es anmerken: Aussagekräftige und eindeutige Bezeichner verwenden! Es ist von außen überhaupt nicht ersichtlich, wofür l, m oder i (beim Generieren des Zufallsindex) stehen. Methodennamen wie Fenster, Buchstabe, Woerter sind nichtssagend oder irreführend. So gibt letztere Methode zum Beispiel stattdessen nur ein Zufallswort zurück.

Würdest du hingegen Bezeichner überlegter setzen, könntest du dir Kommentare auch locker sparen. Ein guter Quellcode beschreibt sich durch seine Bezeichner selbst.

Weiteres zu von dir gewählten Bezeichnern:

  • Bleibe bei der Konvention, beginne Variablen- und Methodennamen mit einem Kleinbuchstaben und schreibe in konsequenter Kamelhöckerschreibweise (Bsp.: reiheA statt reihea)
  • Gib Methoden nicht den selben Namen wie den Konstruktor
  • Vermeide auch Namen, die einem reserved word ähnlich sind (z.B. string)

Am besten du gehst nochmals über dein Programm und vergibst in jedem Fall bessere Namen.

2) Redundanzen vermeiden

Dein gesamter Code ist voller Wiederholungen und Aufzählungen, die du um Längen kürzen könntest. Dazu müsstest du nur Schleifen und Arrays beherrschen. Zeitgleich würden mögliche Fehlerquellen ebenso reduziert werden.

Beispiele:

  • Für ergebnisVertikal1-ergebnisVertikal8 und m1-m8 könnten jeweils Arrays angelegt werden. Wenn du ein komplettes Grid beschreiben möchtest, würde sich ein zweidimensionales Array anbieten.
  • Die switch-cases bräuchtest du bei einem Einsatz eines Arrays nicht mehr, siehe z.B. in der Methode Buchstabe:
if (arrayAllgemein[i] == arrayVertikal[m] || mUndSpalte) {
  ++m[spalte];
  buchstabe = String.valueOf(arrayVertikal[m]);
}
  • Am schlimmsten, dass muss ich einfach so sagen, ist die Methode GleichVertikal. Sie ist nur schwer überschaubar (man muss unter anderem horizontal scrollen) und führt auch noch Vergleiche unabhängig davon aus, ob deren Ergebnisse bei Methodenaufruf benötigt werden.

Schauen wir uns also erst einmal an, was du dort machst:

boolean ungleich1 = (ergebnisVertikal1 != ergebnisVertikal2)
  && (ergebnisVertikal1 != ergebnisVertikal3)
  && (ergebnisVertikal1 != ergebnisVertikal4)
  && (ergebnisVertikal1 != ergebnisVertikal5)
  && (ergebnisVertikal1 != ergebnisVertikal6)
  && (ergebnisVertikal1 != ergebnisVertikal7)
  && (ergebnisVertikal1 != ergebnisVertikal8);

Einer der Ausdrücke offenbart in lesbarer Formatierung bereits, dass du alle vertikalen Ergebnisse einer gegebenen Spalte mit allen anderen vergleichen möchtest. Angenommen, diese Variablen wären nun bereits in einem Array gebündelt, könntest du über dieses einfach iterieren und pro Iteration die Vergleiche durchführen:

boolean notEqual = true;

for (int i = 0; i < verticalResults.length; ++i) {
  if (i == column) {
    continue;
  }

  notEqual &= !verticalResults[column].equals(verticalResults[i]);
}
                  
return !notEqual;

Da der Vergleich mit sich selbst ausgespart werden soll, wird in diesem Fall die Iteration natürlich übersprungen. Zudem vergleiche ich die Strings mit der Methode equals. Wieso? Weil der Vergleichsoperator nicht prüft, ob 2 Objekte gleich, sondern ob sie identisch zueinander sind (in der gleichen Speicherzelle liegen).

Die anderen Ausdrücke kann man sich, wie du siehst, in dem Zuge auch sparen, denn der Vergleich wird ja nur, wie gewünscht, mit dem Wert aus der (durch den Methodenparameter) gegebenen Spalte durchgeführt.

  • Ein letztes Beispiel: Die Methode BeliebigerBuchstabe. Speicher die Buchstaben nicht in einem char-Array ab sondern setze sie gleich in einem String zusammen. Über die charAt-Methode kannst du nun einen Buchstaben an beliebiger Position zugreifen.
String anyWord = "ABXYLINOPU";
int randomIndex = random.nextInt(10);

return anyWord.charAt(randomIndex);

3) Model-View-Bindung

Java Swing-Programme basieren bereits auf dem MVC-Pattern. Zwar beschreibt dieses View und Model als voneinander getrennte Komponenten, dennoch könntest du sie ruhig in einer Eigenschaft mehr miteinander binden: Der Länge der Wörter/Reihen/... (8).

Nutze also wieder eine Schleife, um die einzelnen Panels zu erzeugen:

private Crossword crossword;

private final int NUMBER_OF_VERTICAL_WORDS;

public CrosswordView() {
  crossword = new Crossword();
  NUMBER_OF_VERTICAL_WORDS = crossword.getNumberOfVerticalWords();
}
  
// later in method that returns the JFrame:
  for (int row = 0; row < NUMBER_OF_VERTICAL_WORDS; ++row) {
    frame.add(getRow(row));
  }
  // ...
  
private JPanel getRow(int row) {
  JPanel panelRow = new JPanel(new GridLayout(1, 8));

  for (int i = 0; i < NUMBER_OF_VERTICAL_WORDS; ++i) {
    panelRow.add(new JLabel(words.getLetter(i, row)));
  }

  return panelRow;
}

Die Methode getRow ist lediglich eine verallgemeinerte Version von dem, was du mit den einzelnen Methoden reihea, reiheb, usw. definiert hast. Die einzige Variable, die sich in dem Kontext ändert, ist die der Spalte, wofür eine Schleife genutzt werden kann. Die Reihe wird von außen via Parameter hereingegeben.

Eine Konstante (NUMBER_OF_VERTICAL_WORDS) sorgt für die engere Bindung zwischen Model (Crossword) und View (CrosswordView), bzw. bei dir Woerter und GUI.

Auch im Model solltest du übrigens öfter die 8 in Form einer Variable an die einzelnen Durchläufe binden.

4) Redundantes Vorgehen zur Laufzeit

Ein Beispiel hat ja bereits GleichVertikal geliefert, ein Weiteres wäre der Vorgang in Woerter. Bei jedem Aufruf der Methode lässt du ein Array erzeugen, welches sich wohlgemerkt nie ändert. Nur die Rückgabe ist anders - ein zufällig gewähltes Element aus dem Array. Speichere das Array doch stattdessen in mindestens einem globalen Kontext darüber, zum Beispiel als Attribut. So wird es einmal angelegt und ist für die Folgeaufrufe der Methode wieder bereits im Speicher.

5) Frame-Sichtbarkeit

Mache ein Fenster (JFrame) erst dann sichtbar, wenn all seine Komponenten richtig auf ihm angeordnet wurden. So gehst du sicher, dass ein Nutzer in jedem Fall das Fenster erst dann zu Gesicht bekommt, wenn es bereit für seine Nutzereingaben ist.

6) Kapselung

Eines der wichtigsten Konzept in der OOP ist die Kapselung, die du jedoch völlig ignorierst. Mache dir darüber Gedanken, welche Elemente in deinen Klassen nun nach außen sichtbar sein sollten und welche nicht. Der package access modifier ist hier jedenfalls nicht sinnvoll.

7) Imports

Wirf ungenutzte Imports raus (siehe Main.java) und benutze ruhig konkrete, wenn Wildcards nicht nötig sind (z.B. java.awt.GridLayout statt java.awt.*).

8) Primitives vor Wrapper

Einige deiner Methoden geben als Rückgabetyp explizit eine Wrapperklasse an, so wie SpalteHatVertikalenBuchstaben. Intern und auch auf Ebene des Aufrufers wird jedoch der primitive Datentyp genutzt, der ja auch völlig ausreicht. Verwende also auch diesen und nimm somit nicht unnötigen Speicherplatz in Anspruch, so gering der Unterschied an dieser Stelle auch ausfallen mag.

9) Code sauber halten / Ordnung wahren

Führe Attribute einer Klasse immer oben an (oder meinetwegen unten...), aber nicht verstreut zwischen Methoden u.ä.. Definiere sie ruhig innerhalb des Konstruktors und schreibe des Weiteren Kommentare über der Anweisung, damit man als Leser des Codes nicht ständig viel horizontal scrollen muss.

10) Swing Komponenten im Event Dispatch Thread starten

Jeglicher Code, der mit Java Swing-Komponenten interagiert, muss im Event Dispatch Thread laufen, wie du in der Oracle Dokumentation nachlesen kannst. Der Grund hierfür wird auf dieser Seite erklärt.

Gestalte also deine main-Methode folgendermaßen um:

public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
      // write here your code ...
    }
  });
}                

Fazit:

Wenn ich anhand dieser Code-Abschnitte also nun deinen Lernstand beurteile, muss ich ganz klar sagen: Du bist noch nicht weit genug für Java Swing. Bitte lerne erst weiter Grundlagen (vor allem Schleifen und Arrays), bevor du dich an etwas fortgeschrittenere Themen wie das Bauen von GUI-Anwendungen heranwagst.

Nun noch zu deinem Problem:

Dein Programm steckt in einer Endlosschleife fest. Hat es beispielsweise für Reihe 2 das Wort Scanner gewählt, erfüllt sich die Bedingung benoetigterPlatzVertikal > PlatzVertikal nie, denn der vertikale Platz wird durch den Wert 8 repräsentiert (8 - 1 + 1 = 8). Keines der von dir gegebenen Wörter hat mehr als 8 Buchstaben.

package com.company;

import javax.swing.*;
import java.awt.*;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        GUI gui = new GUI();
        JFrame fenster = gui.Fenster();
    }
}