Results 1 to 8 of 8

Rätselstatistik für Wordle

  1. #1 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    Wordle ist ja derzeit ein beliebtes Rätselspiel. Man muss ein Wort mit fünf Buchstaben innerhalb von sechs Versuchen erraten.
    Richtige Buchstaben an richtiger Stelle ergeben ein grünes Feld, richtige an falscher Stelle ein gelbes Feld und falsche ein weißes.
    Mit dem Programm kann man sich anhand der bisherigen Lösungsworte vielleicht das ganze ein wenig erleichtern.
    Und zwar anhand der Buchstabenhäufigkeit. Einmal als gesamtes, zum anderen an Stelle x.
    Zusätzlich können noch Filter gesetzt werden mit Buchstabe x an Stelle y. Diese Liste kann nochmals gefiltert werden.

    Das Programm ist in Java geschrieben, Version Java-SE 14.

    Viel Spaß

    package Worte
    Class Worte
    Code:
    package Worte;
    
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    
    
    import javax.swing.SwingUtilities;
    
    
    public class Worte {
    	private static boolean dateifehler=false;
    	private static boolean datei_ist_leer=false;
    	private static boolean keineBuchstaben=false;
    	private static boolean speicherfehler=false;
    	private static boolean vorhandenWorteDatei=false; //ini-datei in Worte.xxx
    	private static boolean vorhandenLoesenDatei=false; //Statistik Lösen in Worte.sta
    	private static boolean istZahl=false; //char, der keine Zahl ist in Lösestatistikdatei
    	private final static String WORTELISTE="worte.txt";
    	private final static String[] STARTLISTE= {"GANZE","IHRER","MENGE","WERTE","STETS","WEIST","AUTOS","DEINE","EBENE","ESSEN",
    											   "STOCK","BRETT","KOMIK","NYLON","AGENT","IRDEN","HEBEN","WOMIT","SIPPE","KARTE",
    											   "TRIST","DRAMA","BARDE","GRIFF","DEKOR","MUTIG","LARVE","THESE","MALER","FAMOS",
    											   "PRIMA","ASIAT","WOLLE","HAUCH"};
    	private static String dateinamen=""; 
    	
    	protected static Buchstaben buchstaben=new Buchstaben();
    	protected static ArrayList<String> al_Daten_sortiert=new ArrayList<>();
    	protected static ArrayList<String> al_Wortliste_select=new ArrayList<>();
    	protected static ArrayList<Wort> wortstatistik=new ArrayList<>();
    	
    	protected static String getDateinamen() {
    		return dateinamen;
    	}
    	
    	protected static int getAnzahlWorte() {
    		return wortstatistik.size();
    	}
    	
    	protected static boolean getIstZahl() {
    		return istZahl;
    	}
    	
    	protected static boolean getVorhandenWortDatei() {
    		return vorhandenWorteDatei;
    	}
    
    
    	protected static boolean getLoesenDatei() {
    		return vorhandenLoesenDatei;
    	}
    
    
    	
    	protected static boolean dateiLadefehler() {
    		return dateifehler;
    	}
    	
    	protected static boolean leereDatei() {
    		return datei_ist_leer;
    	}
    
    
    	protected static boolean keineBuchstaben() {
    		return keineBuchstaben;
    	}
    	
    	protected static void sortiereWorte() {
    		
    		al_Daten_sortiert.clear();
    		
    		for(Wort hilf:wortstatistik) {
    			al_Daten_sortiert.add(hilf.getwort());
    		}
    		
    		al_Daten_sortiert.sort(null);
    		
    	}
    
    
    	protected static ArrayList<String> getWortliste(){
    		ArrayList<String>hilf=new ArrayList<>();
    		for(Wort wort:wortstatistik) {
    			hilf.add(wort.getwort());
    		}
    		return hilf;
    	}
    	
    	protected static ArrayList<Integer> getWortGeloestliste(){
    		ArrayList<Integer>hilf=new ArrayList<>();
    		for(Wort wort:wortstatistik) {
    			if(wort.getGeloest()!=0)hilf.add(wort.getGeloest());
    		}
    		return hilf;
    	}
    
    
    	
    	protected static boolean ermittleWortListeSelect(int stelle, char buchstabe) {
    		
    		if(wortstatistik.isEmpty())return false;
    		
    		al_Wortliste_select.clear();
    		
    		for(Wort hilf:wortstatistik) {
    			if(buchstabe==hilf.getwort().charAt(stelle))al_Wortliste_select.add(hilf.getwort());
    		}
    		
    		al_Wortliste_select.sort(null);
    		
    		return true;
    	}
    	
    	protected static boolean ermittleWortListeSelect(int stelle, char buchstabe,ArrayList<String>selectList) {
    		
    		if(selectList.isEmpty())return false;
    		
    		al_Wortliste_select.clear();
    		
    		for(String hilf:selectList) {
    			if(buchstabe==hilf.charAt(stelle))al_Wortliste_select.add(hilf);
    		}
    		
    		al_Wortliste_select.sort(null);
    		
    		return true;
    	}
    
    
    
    
    	
    	protected static boolean pruefeWort(String wort) {
    		if(wort==null)return false;
    		
    		String hilf=null;
    		int geloest=0;
    		
    		if(wort.length()>Wordle.WORTLAENGE_5_BUCHSTABEN.wert()) {
    			hilf=wort.substring(0, Wordle.WORTLAENGE_5_BUCHSTABEN.wert());
    			if(Tools.IstZahl.isInteger(wort.substring(Wordle.WORTLAENGE_5_BUCHSTABEN.wert(), wort.length()))) {
    				geloest=Integer.parseInt(wort.substring(Wordle.WORTLAENGE_5_BUCHSTABEN.wert(), wort.length()));
    				if(Tools.IstABC.istABC(hilf)) {
    					wortstatistik.add(new Wort(hilf.toUpperCase(),geloest));
    					return true;
    				}
    			}
    			else {
    				dateifehler=true;
    				return false; //länger als 5 buchstaben aber keine Zahl ab stelle 6
    			}
    		}
    		else {	
    			if(wort.length()!=Wordle.WORTLAENGE_5_BUCHSTABEN.wert()) {
    				dateifehler=true;
    				return false; //maximal 5 Buchstaben
    			}
    			else {
    				if(Tools.IstABC.istABC(wort)) {
    					wortstatistik.add(new Wort(wort));
    					return true;
    				}
    			}
    		}
    		return false;
    	}
    	
    	protected static boolean loescheWort(int nummer) {
    		if(nummer<0||nummer>wortstatistik.size()-1)return false;
    		
    		wortstatistik.remove(nummer);
    		for(int i=nummer;i<wortstatistik.size();i++) {
    			wortstatistik.get(i).subIndex();
    		}
    		Wort.subWortnummer();
    		erstelleLoesungsstatistik();
    		buchstaben.sortiere_nach_Anzahl_Buchstaben();
    		return true;
    	}
    	
    	protected static boolean fuege_Wort_ein(int nummer,String wort) {
    		if(nummer<0||nummer>wortstatistik.size()-1)return false;
    		
    		wortstatistik.add(nummer,new Wort(wort));
    		for(int i=nummer+1;i<wortstatistik.size();i++) {
    			wortstatistik.get(i).addIndex();
    		}
    		erstelleLoesungsstatistik();
    		buchstaben.sortiere_nach_Anzahl_Buchstaben();
    		return true;
    	}
    
    
    	
    	protected static int getIndexLetzteNichtgeloest() {
    		
    		int index=0;
    		int ns=0;
    		for(Wort wort:wortstatistik) {
    			if(wort.getGeloest()==7)index=wort.getIndex();
    		}
    		if(index==0)return index;
    		
    		for(int i=0;i<index;i++) {
    			if(wortstatistik.get(i).getGeloest()==0)ns++;
    			
    		}
    
    
    		return index-ns;
    	}
    	
    	private static void erstelleStartwortliste() {
    
    
    		wortstatistik.clear();
    		for(int i=0;i<STARTLISTE.length;i++) {
    			wortstatistik.add(new Wort(STARTLISTE[i]));
    		}
    	    buchstaben.setAnzahl(getWortliste());
    	    sortiereWorte();
    	}
    	
    	protected static void erstelleLoesungsstatistik() {
    		buchstaben=new Buchstaben();
    		buchstaben.setAnzahl(getWortliste());
    		BearbeiteVersuche.resetAll();
    
    
    		for(Wort wort:wortstatistik) {
    			if(wort.getGeloest()>0){
    				if(wort.getGeloest()<BearbeiteVersuche.MOEGLICH)BearbeiteVersuche.addStreakAktuell();
    			
    				BearbeiteVersuche.addAnzahl(wort.getGeloest());
    			}
    		}
    	}
    	
    	/*private static boolean ladeLoesenStatistikDatei() {
    
    
    	    File file = new File(DialogSpeicherort.getDateiPlusPfad(3));
    	    ArrayList<String> versuche=new ArrayList<>();
    	    
    	    if (file.canRead() || file.isFile()) {
    	        BufferedReader in = null;
    	        try {
    	        	in = new BufferedReader(new FileReader(file));
    	        	String zeile = null;
    	        	while ((zeile = in.readLine()) != null) {
    	        		versuche.add(zeile);
    	        	}
    	        } catch (IOException e) {
    	        	e.printStackTrace();
    	        } finally {
    	        	if (in != null)
    	        		try {
    	        			in.close();
    	        		} catch (IOException e) {
    	        			}
    	           	}
    	        if(versuche.size()!=BearbeiteVersuche.STREAK) {
    	        	return false;
    	        }
    	    
    	        for(int i=0;i<versuche.size();i++) {
    	        	if(!Tools.IstZahl.isInteger(versuche.get(i))) {
    	        		return false;
    	        	}
    	        }
    		
    	        istZahl=true;
    		
    	        int anzahl=0;
    	        for(int i=0;i<BearbeiteVersuche.MOEGLICH;i++) {
    	        	anzahl=Integer.parseInt(versuche.get(i));
    	        	if(anzahl==-1)anzahl=0;
    	        	BearbeiteVersuche.setAnzahl(i+1, anzahl);
    	        }
    	        
    	        anzahl=Integer.parseInt(versuche.get(Wordle.MAXSTREAK.wert()));
    	        if(anzahl<0)anzahl=0;
    	        BearbeiteVersuche.setStreakMax(anzahl);
    	        anzahl=Integer.parseInt(versuche.get(Wordle.AKTUELLERSTREAK.wert()));
    	        if(anzahl<0)anzahl=0;
    	        BearbeiteVersuche.setStreakAktuell(anzahl);
    	    
    	        return istZahl; //kein Fehler
    	    }
    	    
    	    istZahl=false;
    	    return istZahl;
    	}*/
    	
    	protected static boolean ladeDatei(String datName) {
    
    
    	    File file = new File(datName);
    	    ArrayList<String>hilf=new ArrayList<>();
    	    
    	    if (!file.canRead() || !file.isFile())
    	        return false;
    
    
    	        BufferedReader in = null;
    	    try {
    	        in = new BufferedReader(new FileReader(datName));
    	        String zeile = null;
    	        while ((zeile = in.readLine()) != null) {
    	            hilf.add(zeile);
    	        }
    	    } catch (IOException e) {
    	        e.printStackTrace();
    	        return false;
    	    } finally {
    	        if (in != null)
    	            try {
    	                in.close();
    	            } catch (IOException e) {
    	       }
    	    }
    	    
    	    if(hilf.isEmpty()) {
    	    	datei_ist_leer=true;
    	    	return false;
    	    }
    	    
    		for(int i=0;i<hilf.size();i++) {
    			if(!pruefeWort(hilf.get(i))){
    				return false;
    			}
    		}
    	    
    	    buchstaben.setAnzahl(getWortliste());
    	    sortiereWorte();
    	    
    	    return true; //kein Fehler
    	}
    	
    	protected static boolean schreibeDatei(String dateiname, ArrayList<String> Daten) {
    
    
    		File file = new File(dateiname); 
    
    
    		try {
    		   BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 
    		   for(int i=0;i<Daten.size();i++) {
    			   writer.write(Daten.get(i));
    			   writer.newLine();
    		   }
    		   writer.close();
    		   speicherfehler=false;
    		}
    		catch(IOException ioe) {
    		   System.err.println(ioe);
    		   speicherfehler=true;
    		}
    		
    		return speicherfehler;
    	}
    	
    	protected static boolean schreibeLoeseStatistik() {
    		boolean fehler=false;
    		ArrayList<String> versuche=new ArrayList<>();
    		for(int i=0;i<BearbeiteVersuche.MOEGLICH;i++) {
    			versuche.add(String.valueOf(BearbeiteVersuche.getAnzahl(i+1)));
    		}
    		
    		versuche.add(String.valueOf(BearbeiteVersuche.getStreakMax()));
    		versuche.add(String.valueOf(BearbeiteVersuche.getStreakAktuell()));
    		
    		fehler=schreibeDatei(DialogSpeicherort.getDateiPlusPfad(DialogSpeicherort.RATESTATISTIK_DATEI), versuche);
    		
    		return fehler;
    	}
    	
    
    
    	public static void main(String[] args) {
    		
    		if(!DialogSpeicherort.ladeIni()) {
    			dateinamen=WORTELISTE;
    			erstelleStartwortliste();
    		}
    
    
    		BearbeiteVersuche.initailisiereVersuche();
    
    
    		SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                	new Fenster();
                }
            });
    	}
    }
    class Wort
    Code:
    package Worte;
    
    public class Wort {
        
        private static int wortnummer=0;
        
        private String wort=null;
        private String wort_versuche;
        private int index=0;
        private int geloest=0;
        
        protected Wort(String wort,int geloest) {
            this.wort=wort.toUpperCase();
            this.geloest=geloest;
            this.index=++wortnummer;
            this.wort_versuche=wort.concat(Integer.toString(geloest));
        }
        
        protected Wort(String wort) {
            this(wort,0);
        }
        
        protected String getwort() {
            return this.wort;
        }
        
        protected String getwort_versuche() {
            return this.wort_versuche;
        }
        
        protected int getGeloest() {
            return this.geloest;
        }
        
        protected int getIndex() {
            return this.index;
        }
        
        protected void setGeloest(int geloest) {
            this.geloest=geloest;
            this.wort_versuche=wort.concat(Integer.toString(this.geloest));
        }
        
        protected void subIndex() {
            this.index--;
        }
        
        protected void addIndex() {
            this.index++;
        }
    
    
        
        protected static void subWortnummer() {
            wortnummer--;
        }
        
        protected void setWort(String wort) {
            this.wort=wort;
            this.wort_versuche=wort.concat(Integer.toString(this.geloest));
        }
    }
    class Buchstabe
    Code:
    package Worte;
    
    
    public class Buchstabe {
        
        protected char buchstabe;
        protected int anzahl;
        protected int index;
        protected double prozent;
        
        protected Buchstabe(int nummer) {
            this.buchstabe=(char)(nummer+65);
            this.anzahl=0;
            this.index=nummer;
            this.prozent=0.0;
        }
        
    }
    class Buchstaben

    Code:
    package Worte;
    
    import java.util.ArrayList;
    
    
    public class Buchstaben {
        private static int anzahlBuchstaben=0;
        
        private Buchstabe buchstabe[]; //für hauptwortliste
        private Buchstabe stelle_x[][];// buchstabenhäufigkeit an stelle x
        private Buchstabe stelle_x_sortiert[][]; // buchstabenhäufigkeit an stelle x sortiert
        
        private int anzahlBuchstaben_select=0;//ausgewählte wortliste mit Buchstabe x an Stelle y
        
        private char char_select;
        private int  sortierteSpalte_select;
    
    
        
        protected ArrayList<Buchstabe>anz_von_buchstaben=new ArrayList<>();
        
        private boolean erstellt=false;
        
        protected Buchstaben() {
    
    
            if(!erstellt) {
                this.buchstabe= new Buchstabe[Wordle.ALPHABET.wert()];
                this.stelle_x=new Buchstabe[Wordle.ALPHABET.wert()][Wordle.ANZAHL_STELLEN.wert()];
                
                for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                    this.buchstabe[i]=new Buchstabe(i);
                    for(int j=0;j<Wordle.ANZAHL_STELLEN.wert();j++) {
                        this.stelle_x[i][j]=new Buchstabe(i);
                    }
                }
                this.char_select='A';
                this.sortierteSpalte_select=0;
                this.erstellt=true;
            }
        }
        
        protected int getSelectStelle() {
            return this.sortierteSpalte_select;
        }
        
        protected char getSelectChar() {
            return this.char_select;
        }
    
    
        
        protected Buchstabe getBuchstabe(int index) {
            return buchstabe[index];
        }
        
        protected Buchstabe getSortiertenBuchstabenAnStelleX(int index, int stelle) {
            return stelle_x_sortiert[index][stelle];
        }
        
        protected int getIndex(int nummer) {
            return this.buchstabe[nummer].index;
        }
    
    
        protected void setIndex(int nummer, int index) {
            this.buchstabe[nummer].index=index;
        }
    
    
        protected int getAnzahl(int nummer) {
            return this.buchstabe[nummer].anzahl;
        }
        
        protected static int getAnzahl_aller_Buchstaben() {
            return anzahlBuchstaben;
        }
    
    
        protected void setAnzahl(ArrayList<String>worte) {
            anzahlBuchstaben=0;
            char hilf;
            for(String wort:worte) {
                for(int j=0;j<Wordle.WORTLAENGE_5_BUCHSTABEN.wert();j++) {
                    hilf=wort.charAt(j);
                    for(int k=0;k<Wordle.ALPHABET.wert();k++) {
                        if(hilf==k+Wordle.A_ASCII.wert()) {
                            this.buchstabe[k].anzahl++;
                            this.stelle_x[k][j].anzahl++;
                            anzahlBuchstaben++;
                        }
                        
                    }
                }
            }
            this.setProzent();
        }
        
        protected void setAnzahl(char buchstabe,int stelle) {
            
            for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                if(this.buchstabe[i].buchstabe==buchstabe) {
                    this.buchstabe[i].anzahl++;
                    this.stelle_x[i][stelle].anzahl++;
                    anzahlBuchstaben++;
                    this.setProzent(this.buchstabe[i],stelle);
                }
            }
        }
        
        private void setProzent() {
            int ergebnis=0;
    
    
            for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                ergebnis=(int)(buchstabe[i].anzahl*1000/anzahlBuchstaben+0.5);
                this.buchstabe[i].prozent=(double)((ergebnis)/10.0);
                for(int j=0;j<Wordle.ANZAHL_STELLEN.wert();j++) {
                    ergebnis=(int)(this.stelle_x[i][j].anzahl*1000/anzahlBuchstaben*5+0.5);
                    this.stelle_x[i][j].prozent=(double)((ergebnis)/10.0);    
                }
            }
        }
        
        private void setProzent(Buchstabe buchstabe,int stelle) {
            int ergebnis=0;
    
    
            for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                if(buchstabe==this.buchstabe[i]) {
                    ergebnis=(int)(buchstabe.anzahl*1000/anzahlBuchstaben+0.5);
                    this.buchstabe[i].prozent=(double)((ergebnis)/10.0);
                    ergebnis=(int)(this.stelle_x[buchstabe.index][stelle].anzahl*1000/anzahlBuchstaben*5+0.5);
                    this.stelle_x[i][stelle].prozent=(double)((ergebnis)/10.0);
                    break;
                }
            }
        }
    
    
        
        protected double getProzent(Buchstabe buchstabe) {
            return buchstabe.prozent;
        }
        
        protected ArrayList<Buchstabe> sortiere_nach_Anzahl_Buchstaben(){
            
            this.sortiere_Stellen_nach_Anzahl_Buchstaben();
            
            int hilf=0;
            anz_von_buchstaben.clear();
            Buchstabe hb=new Buchstabe(-1);
            ArrayList<Buchstabe>copy=new ArrayList<>();
            for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                copy.add(buchstabe[i]);
            }
            
            for(int z=0;z<Wordle.ALPHABET.wert();z++) {
                for(int i=0;i<copy.size();i++) {
                    if(copy.get(i).anzahl>hilf) {
                        hb=copy.get(i);    
                        hilf=hb.anzahl;
                    }
                }
                
                if(copy.contains(hb)) {
                    copy.remove(hb);
                    anz_von_buchstaben.add(hb);
                    hilf=0;
                    hb=new Buchstabe(0);
                }
            }
            
            if(!copy.isEmpty()) {
                for(int i=0;i<copy.size();i++) {
                    anz_von_buchstaben.add(copy.get(i));
                }
            }
            
            return anz_von_buchstaben;
        }
        
        protected ArrayList<Buchstabe> sortiere_nach_Anzahl_Buchstaben_Select(int sortierteSpalte,ArrayList<String> wortliste, char buchstabe){
            
            int hilf=0;
            
            anz_von_buchstaben.clear();
            Buchstabe hb=new Buchstabe(-1);
            Buchstabe[]select=new Buchstabe[Wordle.ALPHABET.wert()];
            for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                select[i]=new Buchstabe(i);
            }
            
            for(String wort:wortliste) {
                for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                    if(wort.charAt(sortierteSpalte)==select[i].buchstabe) {
                        select[i].anzahl++;
                        this.anzahlBuchstaben_select++;
                    }
                }
            }
            
            
            ArrayList<Buchstabe>copy=new ArrayList<>();
            for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                copy.add(select[i]);
            }
            
            for(int z=0;z<Wordle.ALPHABET.wert();z++) {
                for(int i=0;i<copy.size();i++) {
                    if(copy.get(i).anzahl>hilf) {
                        hb=copy.get(i);    
                        hilf=hb.anzahl;
                    }
                }
                
                if(copy.contains(hb)) {
                    copy.remove(hb);
                    anz_von_buchstaben.add(hb);
                    hilf=0;
                    hb=new Buchstabe(0);
                }
            }
            
            int ergebnis=0;
    
    
            for(int i=0;i<anz_von_buchstaben.size();i++) {
                if(anzahlBuchstaben_select!=0) {
                    ergebnis=(int)(anz_von_buchstaben.get(i).anzahl*1000/anzahlBuchstaben_select+0.5);
                }
                else ergebnis=0;
                anz_von_buchstaben.get(i).prozent=(double)((ergebnis)/10.0);
                }
            
            this.sortierteSpalte_select=sortierteSpalte;
            this.char_select=buchstabe;
            
            return anz_von_buchstaben;
        }
        
        private void sortiere_Stellen_nach_Anzahl_Buchstaben(){
            
            int hilf=0;
            Buchstabe hb=new Buchstabe(-1);
            stelle_x_sortiert=new Buchstabe[Wordle.ALPHABET.wert()][Wordle.ANZAHL_STELLEN.wert()];
    
    
            for(int stelle=0;stelle<Wordle.ANZAHL_STELLEN.wert();stelle++) {
                anz_von_buchstaben.clear();
                ArrayList<Buchstabe>copy=new ArrayList<>();
                for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                    copy.add(stelle_x[i][stelle]);
                }
            
                for(int z=0;z<Wordle.ALPHABET.wert();z++) {
                    for(int i=0;i<copy.size();i++) {
                        if(copy.get(i).anzahl>hilf) {
                            hb=copy.get(i);    
                            hilf=hb.anzahl;
                        }
                    }
                
                if(copy.contains(hb)) {
                    copy.remove(hb);
                    anz_von_buchstaben.add(hb);
                    hilf=0;
                    hb=new Buchstabe(0);
                    }
                }
            
                if(!copy.isEmpty()) {
                    for(int i=0;i<copy.size();i++) {
                        anz_von_buchstaben.add(copy.get(i));
                    }
                }
                
                for(int i=0;i<Wordle.ALPHABET.wert();i++) {
                    stelle_x_sortiert[i][stelle]=anz_von_buchstaben.get(i);
                }
            }
            
        }
    
    
    
    
    }
    class Versuche
    Code:
    package Worte;
    public class Versuche {
        
        protected int nummer=0;
        protected int anzahl=0;
        protected double prozent=0.0;
        
        
        public Versuche (int nummer, int anzahl){
            this.nummer=nummer;
            this.anzahl=anzahl;
            this.prozent=0.0;
        }
    }

    class BearbeiteVersuche
    Code:
    package Worte;
    
    
    import java.util.ArrayList;
    
    
    public class BearbeiteVersuche {
    	
    	protected static final int MOEGLICH=7; //0-6 = 1 bis 6 Versuche und gescheitert.
    	protected static final int ERFOLG=6; //0-5 = 1 bis 6 Versuche
    	protected static final int STREAK=9;
    	protected static final int MISSERFOLG=6; //6=Misserfolg
    	protected static final int KEINE_LOESUNG_VERSUCHT=7; //7=keine Lösung versucht
    
    
    	
    	private static Versuche [] versuche;
    	private static int summeAnzahl=0;
    	private static double durchschnitt=0.0;
    	private static boolean ini_is=false;
    	private static int streak_max=0;
    	private static int streak_aktuell=0;
    	
    	protected static boolean initailisiereVersuche(int [] anzahl) {
    		
    		if(STREAK!=anzahl.length)return false;
    		
    		versuche=new Versuche[MOEGLICH];
    		
    		for(int i=0;i<MOEGLICH;i++) {
    			versuche[i]=new Versuche(i+1,anzahl[i]);
    			summeAnzahl+=anzahl[i];
    		}
    		
    		streak_max=anzahl[Wordle.MAXSTREAK.wert()];
    		streak_aktuell=anzahl[Wordle.AKTUELLERSTREAK.wert()];
    		
    		ini_is=true;
    		
    		berechneProzent();
    		berechneDurchschnitt();
    		
    		return true;
    	}
    	
    	protected static void initailisiereVersuche() {
    		if(!ini_is) {
    			versuche=new Versuche[MOEGLICH];
    				for(int i=0;i<MOEGLICH;i++) {
    					versuche[i]=new Versuche(i+1,0);
    				}
    			
    			streak_max=0;
    			streak_aktuell=0;
    			summeAnzahl=0;
    			durchschnitt=0.0;
    		
    			ini_is=true;
    		}
    	}
    	
    	protected static void resetAll() {
    		ini_is=false;
    		initailisiereVersuche();
    	}
    	
    	protected static boolean addAnzahl(int nummer) {
    		
    		if(!ini_is)return false;
    		
    		if(nummer<1 || nummer>MOEGLICH)return false;
    		
    		versuche[nummer-1].anzahl++;
    		summeAnzahl++;
    		if(nummer-1==6)zuruecksetzenStreakAktuell();
    		
    		berechneProzent();
    		berechneDurchschnitt();
    		
    		return true;
    	}
    	
    	protected static boolean setAnzahl(int nummer, int anzahl) {
    		if(!ini_is)return false;
    		
    		if(nummer<1 || nummer>MOEGLICH)return false;
    		
    		summeAnzahl-=versuche[nummer-1].anzahl;
    		versuche[nummer-1].anzahl=anzahl;
    		summeAnzahl+=anzahl;
    		
    		berechneProzent();
    		berechneDurchschnitt();
    		
    		return true;
    	}
    	
    	protected static int getAnzahl(int nummer) {
    		if(!ini_is)return -1;
    		if(nummer<1 || nummer>MOEGLICH)return -1;
    		
    		return versuche[nummer-1].anzahl;
    	}
    	
    	protected static int getSummeAnzahl() {
    		if(!ini_is)return -1;
    		
    		return summeAnzahl;
    	}
    	
    	private static void berechneProzent() {
    		for(int i=0;i<MOEGLICH;i++) {
    			
    			if(summeAnzahl!=0)versuche[i].prozent=(double)((int)(versuche[i].anzahl*1000/summeAnzahl+0.5))/10;
    		}
    	}
    	
    	private static void berechneDurchschnitt() {
    		int ergebnis=0;
    		int worte=0;
    		for(int i=0;i<MOEGLICH-1;i++) { //7. Versuch = gescheitert. Für Durchschnitt zählen eins bis sechs Versuche
    			ergebnis=ergebnis+versuche[i].anzahl*versuche[i].nummer;
    			worte=worte+versuche[i].anzahl;
    		}
    		
    		durchschnitt=(double)ergebnis/(double)worte;
    	}
    
    
    	protected static double berechneDurchschnittAS() {
    		int ergebnis=0;
    		int stelle=0;
    		
    		ArrayList<Integer>loesen=new ArrayList<>();
    		
    		for(int i=Worte.wortstatistik.size()-1;i>-1;i--) {
    			if(Worte.wortstatistik.get(i).getGeloest()==7) {
    				stelle=i;
    				break;
    			}
    		}
    		
    		if(stelle+1==Worte.wortstatistik.size())return -1;
    		
    		for(int i=stelle+1;i<Worte.wortstatistik.size();i++) {
    			if(Worte.wortstatistik.get(i).getGeloest()!=0) {
    				loesen.add(Worte.wortstatistik.get(i).getGeloest());
    			}
    		}
    		
    		for(int i:loesen) {
    			ergebnis+=i;
    		}
    		
    		int runden=(int)(((double)ergebnis/(double)loesen.size()*100)+0.5);
    		return (double)runden/100;
    	}
    
    
    	protected static ArrayList<Double> berechneDurchschnittVerlauf() {
    		int ergebnis=0;
    		int anzahl=0;
    		int runden=0;
    		
    		ArrayList<Integer>loesen=new ArrayList<>();
    		ArrayList<Double>verlauf=new ArrayList<>();
    		
    		loesen=Worte.getWortGeloestliste();
    
    
    		verlauf.add((double)loesen.get(0));
    		anzahl++;
    		ergebnis+=loesen.get(0);
    		for(int i=1;i<(loesen.size());i++) {
    				if(loesen.get(i)!=7) {
    					ergebnis+=loesen.get(i);
    				}
    				else {
    					anzahl--;
    				}
    				anzahl++;
    				if(anzahl>0) {
    					runden=(int)(((double)ergebnis/(double)anzahl*100)+0.5);
    					verlauf.add((double)runden/100);
    				}
    		}
    		return verlauf;
    	}
    
    
    	
    	protected static double getProzent(int nummer) {
    		if(!ini_is)return -1;
    
    
    		return versuche[nummer-1].prozent;
    	}
    	
    	protected static double getDurchschnitt() {
    		int runden=(int)(durchschnitt*100+0.5);
    		return (double)runden/100;
    	}
    	
    	protected static void setStreakAktuell(int streak) {
    		streak_aktuell=streak;
    		if(streak_aktuell>streak_max)streak_max=streak_aktuell;
    	}
    	
    	protected static void setStreakMax(int streak) {
    		streak_max=streak;
    	}
    	
    	protected static int getStreakAktuell() {
    		return streak_aktuell;
    	}
    
    
    	protected static int getStreakMax() {
    		return streak_max;
    	}
    	
    	protected static void addStreakAktuell() {
    		streak_aktuell++;
    		if(streak_aktuell>streak_max)streak_max=streak_aktuell;
    	}
    	
    	protected static void addStreakMax() {
    		streak_max++;
    	}
    	
    	protected static void zuruecksetzenStreakAktuell() {
    		streak_aktuell=0;
    	}
    	
    	protected static void ermittelSummeAnzahl() {
    		summeAnzahl=0;
    		for(int i=0;i<MOEGLICH;i++) {
    			summeAnzahl+=versuche[i].anzahl;
    		}
    	}
    	
    	protected static int getAnzahlMisserfolge() {
    		int fehler=0;
    		for(int i=0;i<Worte.wortstatistik.size();i++) {
    			if(Worte.wortstatistik.get(i).getGeloest()==MISSERFOLG+1)fehler++;
    		}
    		return fehler;
    	}
    }
    enum Wordle
    Code:
    package Worte;
    
    
    public enum Wordle {
        
        A_ASCII(65),
        Z_ASCII(90),
        a_ASCII(97),
        z_ASCII(122),
        ALPHABET(26),
        PLATZHALTER(10),
        COL1(0),
        COL2(1),
        COL3(2),
        COL4(3),
        COL5(4),
        COL6(5),
        COL7(6),
        COL8(7),
        COL9(8),
        COL10(9),
        COL11(10),
        COL12(11),
        COL13(12),
        COL14(13),
        COL15(14),
        COL16(15),
        ROW1(0),
        ROW5(4),
        ROW6(5),
        WORTLAENGE_5_BUCHSTABEN(5),
        SUMMENZEILE(1),
        ANZAHL_STELLEN(5),
        STELLE_1(0),
        STELLE_2(1),
        STELLE_3(2),
        STELLE_4(3),
        STELLE_5(4),
        MAXSTREAK(7),
        AKTUELLERSTREAK(8);
        
        private final int wert;
        
        Wordle(int wert){
            this.wert=wert;
        }
        
        public int wert() {return wert;}
    }
    Fortsetzung package Worte, die Fensterklassen
    Stiller Leser is offline Last edited by Stiller Leser; 13.11.2022 at 13:23.

  2. #2 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    class Fenster (Das Hauptfenster)
    Code:
    package Worte;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.ArrayList;
    
    
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JRadioButton;
    import javax.swing.JScrollPane;
    import javax.swing.JSeparator;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.SwingConstants;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.filechooser.FileNameExtensionFilter;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    
    
    import Renderer.TableBuchstabenhaeufigkeitRenderer;
    import Renderer.TableStelleRenderer;
    import Renderer.TableWorteRenderer;
    import Renderer.TableWorteSortiertRenderer;
    
    
    
    
    public class Fenster implements ActionListener,
    								MouseListener{
    	
    	private JFrame jframe;
    	private JMenuBar menubar;
    	private JMenu jm_datei;
    	private JMenuItem jmi_speicherort_konfiguration;
    	private JMenuItem jmi_datei_laden;
    	private JMenuItem jmi_datei_speichern;
    	private JMenuItem jmi_beenden;
    	
    	private JMenu jm_bearbeiten;
    	private JMenuItem jmi_bearbeiten_wort_hinzufuegen;
    	private JMenuItem jmi_wort_vorhanden;
    	private JMenuItem jmi_ratestatistik_hinzufuegen;
    	private JMenuItem jmi_ratestatistik_aendern;
    	private JMenuItem jmi_filter;
    	private JMenuItem jmi_grosser_filter;
    	private JMenuItem jmi_loesungsdiagramm;
    	
    	private JMenu jm_info;
    	private JMenuItem jmi_info;
    
    
    	private JPanel jp;
    
    
    	private JPanel jp_worte;
    	private JPanel jp_worte_sortiert;
    	private JPanel jp_buchstabenhaeufigkeit;
    	private JPanel jp_Stelle_X;
    	private JPanel jp_ratestatistik;
    	private JPanel jp_versuch_eingeben;
    	private JPanel jp_versuchstatistik;
    
    
    	private JLabel jl_worte;
    	private JLabel jl_worte_dn;
    	private JLabel jl_worte_sortiert;
    	private JLabel jl_worte_sortiert_dn;
    	
    	private JTable jt_worte;
    	private DefaultTableModel dtm_worte;
    	private JTable jt_worte_sortiert;
    	private DefaultTableModel dtm_worte_sortiert;
    	private JTable jt_buchstabenhaeufigkeit;
    	private JTable jt_stellen;
    	
    	//eingabe der Anzahl Versuche für ein Wort
    	private JRadioButton[] jrb_versuche;
    	private ButtonGroup bg_versuche;
    	private JButton jb_versuch_uebernehmen;
    	private JLabel jl_gesichert;
    	
    	//kontextmenü zum ändern eines wortes
    	private JMenuItem jmi_wort_aendern;
    	private JMenuItem jmi_wort_einfuegen;
    	private JMenuItem jmi_wort_loeschen;
    	private JMenuItem jmi_abbrechen;
    	private int aendern=-1;
    	/*
    	 * reihe, gemessen und GRENZE benötigt zum Verzögern des linken Mausclicks 
    	 */
    	private static boolean gemessen=false;
    	private static final int GRENZE=25;
    	private static int reihe=-1;
    	
    	private String dateiname="";
    
    
    	protected final static int START_X_FRAME=250;
    	protected final static int START_Y_FRAME=50;
    	protected final static int FENSTERBREITE=1400;
    	protected final static int FENSTERHOEHE=850;
    	private final static int PANELBREITE=280;
    	private final static int HOEHE_ALPHABET=495;
    			
    	public Fenster() {
    		this.jframe=new JFrame("Statistik Worte für Wordle");
    		this.jframe.setBounds(START_X_FRAME, START_Y_FRAME, FENSTERBREITE, FENSTERHOEHE);
    		
    		this.menubar=new JMenuBar();
    		
    		this.jm_datei=new JMenu("Datei");
    		this.jmi_speicherort_konfiguration= new JMenuItem("Konfiguriere Speicherorte");
    		this.jmi_speicherort_konfiguration.addActionListener(this);
    
    
    		this.jmi_datei_laden= new JMenuItem("Datei laden");
    		this.jmi_datei_laden.addActionListener(this);
    		this.jmi_datei_speichern= new JMenuItem("Datei speichern");
    		this.jmi_datei_speichern.setEnabled(false);
    		this.jmi_datei_speichern.addActionListener(this);
    		
    		this.jmi_beenden=new JMenuItem("Beenden");
    		this.jmi_beenden.addActionListener(this);
    
    
    		this.jm_datei.add(this.jmi_speicherort_konfiguration);
    		this.jm_datei.add(new JSeparator());
    		this.jm_datei.add(this.jmi_datei_laden);
    		this.jm_datei.add(this.jmi_datei_speichern);
    		this.jm_datei.add(new JSeparator());
    		this.jm_datei.add(this.jmi_beenden);
    		
    		this.jm_bearbeiten=new JMenu("Bearbeiten");
    		this.jmi_bearbeiten_wort_hinzufuegen=new JMenuItem("Wort hinzufügen");
    		this.jmi_bearbeiten_wort_hinzufuegen.setEnabled(false);
    		this.jmi_bearbeiten_wort_hinzufuegen.setToolTipText("Neues Wort hinzufügen");
    		this.jmi_bearbeiten_wort_hinzufuegen.addActionListener(this);
    		
    		this.jmi_wort_vorhanden=new JMenuItem("Wort in Liste?");
    		this.jmi_wort_vorhanden.setEnabled(false);
    		this.jmi_wort_vorhanden.setToolTipText("War Lösungsversuch schon mal als Lösungswort?");
    		this.jmi_wort_vorhanden.addActionListener(this);
    		
    		
    		this.jmi_ratestatistik_hinzufuegen=new JMenuItem("Ratestatistik hinzufügen");
    		this.jmi_ratestatistik_hinzufuegen.setEnabled(false);
    		this.jmi_ratestatistik_hinzufuegen.setToolTipText("<html>Fügt eigene Ratestatistik hinzu.<br>"+
    														  "Die Statistik wird gespeichert in der Datei Worte.sta<br>"+
    														  "Beim nächsten Programmstart wird die Statistik automatisch geladen.</html>");
    		this.jmi_ratestatistik_hinzufuegen.addActionListener(this);
    		
    		this.jmi_ratestatistik_aendern=new JMenuItem("Ratestatistik ändern");
    		this.jmi_ratestatistik_aendern.setEnabled(false);
    		this.jmi_ratestatistik_aendern.setToolTipText("Statistik wird geändert und in der Datei Worte.sta gespeichert");
    		this.jmi_ratestatistik_aendern.addActionListener(this);
    		
    		this.jmi_filter=new JMenuItem("Filter");
    		this.jmi_filter.setEnabled(false);
    		this.jmi_filter.setToolTipText("Die Wortliste wird nach Buchstaben an Stelle x gefiltert");
    		this.jmi_filter.addActionListener(this);
    
    
    		this.jmi_grosser_filter=new JMenuItem("Großer Filter");
    		this.jmi_grosser_filter.setEnabled(false);
    		this.jmi_grosser_filter.setToolTipText("Umfangreiche Filterung aus Wortliste");
    		this.jmi_grosser_filter.addActionListener(this);
    
    
    		
    		this.jmi_loesungsdiagramm=new JMenuItem("Diagramm Zeitleiste Lösungen");
    		this.jmi_loesungsdiagramm.setEnabled(false);
    		this.jmi_loesungsdiagramm.setToolTipText("Zeitleiste über die Anzahl der Versuche bei den bisherigen Lösungsworten.");
    		this.jmi_loesungsdiagramm.addActionListener(this);
    
    
    
    
    		
    		this.jm_bearbeiten.add(this.jmi_bearbeiten_wort_hinzufuegen);
    		this.jm_bearbeiten.add(this.jmi_wort_vorhanden);
    		this.jm_bearbeiten.add(new JSeparator());
    		this.jm_bearbeiten.add(this.jmi_ratestatistik_hinzufuegen);
    		this.jm_bearbeiten.add(this.jmi_ratestatistik_aendern);
    		this.jm_bearbeiten.add(new JSeparator());
    		this.jm_bearbeiten.add(this.jmi_filter);
    		this.jm_bearbeiten.add(this.jmi_grosser_filter);
    		this.jm_bearbeiten.add(new JSeparator());
    		this.jm_bearbeiten.add(this.jmi_loesungsdiagramm);
    		
    		this.jm_info=new JMenu("Info");
    		this.jmi_info=new JMenuItem("Info");
    		this.jmi_info.addActionListener(this);
    		
    		this.jm_info.add(this.jmi_info);
    
    
    		this.menubar.add(this.jm_datei);
    		this.menubar.add(this.jm_bearbeiten);
    		this.menubar.add(this.jm_info);
    		
    		this.jp=new JPanel(null);
    		this.jp.setBounds(0, 0, FENSTERBREITE, FENSTERHOEHE);
    		
    		this.jp_worte=new JPanel(null);
    		this.jp_worte.setBounds(5, 10, PANELBREITE-5, FENSTERHOEHE-80);
    		this.jp_worte.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Wortliste - Unsortiert"));
    		
    		this.jl_worte=new JLabel("Dateiname: ");
    		this.jl_worte.setBounds(5, FENSTERHOEHE-150, PANELBREITE-5, 20);
    		this.jl_worte_dn=new JLabel(" ");
    		this.jl_worte_dn.setBounds(5, FENSTERHOEHE-135, PANELBREITE-5, 20);
    		this.jl_worte_dn.setFont(new Font("Courier",Font.BOLD,14));
    		JLabel jl_legende=new JLabel("Legende [gelöst]:");
    		jl_legende.setBounds(5, FENSTERHOEHE-220, PANELBREITE-5, 20);
    		jl_legende.setFont(new Font("Serif",Font.BOLD,14));
    		JLabel jl_legende_text=new JLabel("in [1-6] Versuchen gelöst");
    		jl_legende_text.setBounds(5, FENSTERHOEHE-200, PANELBREITE-5, 15);
    		jl_legende_text.setFont(new Font("Serif",Font.PLAIN,12));
    		JLabel jl_legende_text2=new JLabel("X nicht gelöst");
    		jl_legende_text2.setBounds(5, FENSTERHOEHE-185, PANELBREITE-5, 15);
    		jl_legende_text2.setFont(new Font("Serif",Font.PLAIN,12));
    		JLabel jl_legende_text3=new JLabel("LEER nicht gespielt");
    		jl_legende_text3.setBounds(5, FENSTERHOEHE-170, PANELBREITE-5, 15);
    		jl_legende_text3.setFont(new Font("Serif",Font.PLAIN,12));
    
    
    		this.jp_worte.add(this.jl_worte);
    		this.jp_worte.add(this.jl_worte_dn);
    		this.jp_worte.add(jl_legende);
    		this.jp_worte.add(jl_legende_text);
    		this.jp_worte.add(jl_legende_text2);
    		this.jp_worte.add(jl_legende_text3);
    				
    		this.jp_worte_sortiert=new JPanel(null);
    		this.jp_worte_sortiert.setBounds(PANELBREITE+5, 10, PANELBREITE-5, FENSTERHOEHE-80);
    		this.jp_worte_sortiert.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Wortliste - Sortiert"));
    		
    		this.jl_worte_sortiert=new JLabel("Dateiname:");
    		this.jl_worte_sortiert.setBounds(5, FENSTERHOEHE-150, PANELBREITE-5, 20);
    		this.jl_worte_sortiert_dn=new JLabel(" ");
    		this.jl_worte_sortiert_dn.setBounds(5, FENSTERHOEHE-135, PANELBREITE-5, 20);
    		this.jl_worte_sortiert_dn.setFont(new Font("Courier",Font.BOLD,14));
    
    
    		this.jp_worte_sortiert.add(this.jl_worte_sortiert);
    		this.jp_worte_sortiert.add(this.jl_worte_sortiert_dn);
    		
    		this.jp_buchstabenhaeufigkeit=new JPanel(null);
    		this.jp_buchstabenhaeufigkeit.setBounds(PANELBREITE*2+5, 10, PANELBREITE-5, HOEHE_ALPHABET);
    		this.jp_buchstabenhaeufigkeit.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Buchstabenhäufigkeit"));
    		
    		this.jp_Stelle_X=new JPanel(null);
    		this.jp_Stelle_X.setBounds(PANELBREITE*3+5, 10, PANELBREITE*2-30, HOEHE_ALPHABET);
    		this.jp_Stelle_X.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Buchstaben an Stelle x"));
    
    
    		
    		this.jp.add(this.jp_worte);
    		this.jp.add(this.jp_worte_sortiert);
    		this.jp.add(this.jp_buchstabenhaeufigkeit);
    		this.jp.add(this.jp_Stelle_X);
    		
    		this.jframe.setJMenuBar(this.menubar);
    		this.jframe.add(this.jp);
    		
    		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jframe.setVisible(true);
    		
    		//wenn inintialisierungsdatei vorhanden, wird tabelle sofort geladen
    		if(DialogSpeicherort.getLadeIni_ok()) {
    			this.dateiname=DialogSpeicherort.getPfad().concat("\\").concat(DialogSpeicherort.getWorteDatei());
    			if(Worte.ladeDatei(this.dateiname)) {
    				Worte.erstelleLoesungsstatistik();
    				
    				this.erstelleWortTabelle();
    				this.erstelle_sortierte_WortTabelle();
    				this.erstelleBuchstabenStatistik();
    				this.erstelleStellenStatistik();
    				this.aktualisiereTabelle();
    				this.jmi_bearbeiten_wort_hinzufuegen.setEnabled(true);
    				this.jmi_wort_vorhanden.setEnabled(true);
    				this.jmi_ratestatistik_hinzufuegen.setEnabled(true);
    				this.jl_worte_dn.setText(DialogSpeicherort.getWorteDatei());
    				this.jmi_datei_laden.setEnabled(false);
    				this.jmi_filter.setEnabled(true);
    				this.jmi_grosser_filter.setEnabled(true);
    				this.jmi_loesungsdiagramm.setEnabled(true);
    				
    				this.erstelleRatestastistik();
    				this.erstelleBalkendiagramm();
    				this.jmi_ratestatistik_hinzufuegen.setEnabled(false);
    				this.jmi_ratestatistik_aendern.setEnabled(true);
    
    
    			}
    		}
    	}
    	
    	private void erstelleRatestastistik() {
    		this.jp_ratestatistik=new JPanel(null);
    		this.jp_ratestatistik.setBounds(PANELBREITE*2+8, HOEHE_ALPHABET+20, PANELBREITE*3-34, FENSTERHOEHE-92-HOEHE_ALPHABET);
    		this.jp_ratestatistik.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), ""));
    		
    		this.jp_versuch_eingeben=new JPanel(null);
    		this.jp_versuch_eingeben.setLayout(new BorderLayout());
    		this.jp_versuch_eingeben.setBounds(10, 10, PANELBREITE-17, FENSTERHOEHE-105-HOEHE_ALPHABET);
    		this.jp_versuch_eingeben.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Gelöst"));
    		
    		JPanel jp_radio=new JPanel(null);
    		jp_radio.setLayout(new BoxLayout(jp_radio,BoxLayout.Y_AXIS));
    		
    		this.jrb_versuche=new JRadioButton[8];
    		this.bg_versuche=new ButtonGroup();
    		
    		this.jrb_versuche[0]=new JRadioButton("im ersten Versuch");
    		this.jrb_versuche[1]=new JRadioButton("im zweitem Versuch");
    		this.jrb_versuche[2]=new JRadioButton("im drittem Versuch");
    		this.jrb_versuche[3]=new JRadioButton("im vierten Versuch");
    		this.jrb_versuche[4]=new JRadioButton("im fünften Versuch");
    		this.jrb_versuche[5]=new JRadioButton("im sechsten Versuch");
    		this.jrb_versuche[6]=new JRadioButton("nicht gelöst");
    		this.jrb_versuche[7]=new JRadioButton("Nicht versucht zu lösen");
    		
    		int pa=4; //pixelabstand
    		for (int i=0;i<jrb_versuche.length;i++) {
    			this.jrb_versuche[i].setAlignmentX(Box.LEFT_ALIGNMENT);
    			this.jrb_versuche[i].setFont(new Font("Dialog",Font.BOLD,12));
    			this.jrb_versuche[i].setPreferredSize(new Dimension(170,15));
    			if(i<BearbeiteVersuche.ERFOLG) {
    				this.bg_versuche.add(this.jrb_versuche[i]);
    				jp_radio.add(this.jrb_versuche[i]);
    				jp_radio.add(Box.createRigidArea(new Dimension(0,pa)));
    			}
    		}
    		this.bg_versuche.add(this.jrb_versuche[6]);
    		this.bg_versuche.add(this.jrb_versuche[7]);
    		
    		jp_radio.add(Box.createRigidArea(new Dimension(0,pa)));
    		jp_radio.add(new JSeparator(SwingConstants.HORIZONTAL));
    		jp_radio.add(this.jrb_versuche[BearbeiteVersuche.MISSERFOLG]);
    		jp_radio.add(Box.createRigidArea(new Dimension(0,pa)));
    		jp_radio.add(new JSeparator(SwingConstants.HORIZONTAL));
    		jp_radio.add(this.jrb_versuche[BearbeiteVersuche.KEINE_LOESUNG_VERSUCHT]);
    		jp_radio.add(Box.createRigidArea(new Dimension(0,pa)));
    		jp_radio.add(new JSeparator(SwingConstants.HORIZONTAL));
    
    
    		jp_radio.add(Box.createHorizontalGlue());
    		
    		JPanel jp_test=new JPanel(null);
    		jp_test.setLayout(new BoxLayout(jp_test,BoxLayout.X_AXIS));
    		jp_test.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
    		jp_test.add(Box.createHorizontalGlue());
    
    
    		this.jl_gesichert=new JLabel("");
    		this.jl_gesichert.setAlignmentX(Box.LEFT_ALIGNMENT);
    		
    		this.jb_versuch_uebernehmen=new JButton("Übernehmen");
    		this.jb_versuch_uebernehmen.setAlignmentX(Box.LEFT_ALIGNMENT);
    		this.jb_versuch_uebernehmen.addActionListener(this);
    		this.jb_versuch_uebernehmen.setEnabled(false);
    
    
    		jp_test.add(jl_gesichert);
    		jp_test.add(Box.createRigidArea(new Dimension(8,5)));
    		jp_test.add(jb_versuch_uebernehmen);
    		
    		this.jp_versuch_eingeben.add(jp_radio,BorderLayout.WEST);
    		this.jp_versuch_eingeben.add(jp_test,BorderLayout.SOUTH);
    		
    		this.jp_ratestatistik.add(this.jp_versuch_eingeben);
    		
    		this.jp.add(this.jp_ratestatistik);
    		this.jframe.add(jp);
    	}
    	
    	private void erstelleBalkendiagramm() {
    		JLabel[] versuch=new JLabel [BearbeiteVersuche.MOEGLICH-1];
    		JLabel[] balken=new JLabel [BearbeiteVersuche.MOEGLICH-1];
    		JLabel[] anzahl=new JLabel [BearbeiteVersuche.MOEGLICH-1];
    		
    		final int KOPF=25;
    		final int FUSS=25;
    		final int ABSTAND=5;
    		final int BREITE=40;
    		final int HOEHE=15;
    		final int STARTHOEHE=20;
    		int start=80;
    		double ergebnis=0;
    		
    		this.jp_versuchstatistik=new JPanel(null);
    		this.jp_versuchstatistik.setBounds(PANELBREITE-2, 10, PANELBREITE*2-40, FENSTERHOEHE-105-HOEHE_ALPHABET);
    		this.jp_versuchstatistik.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Statistik Worte raten"));
    		
    		int balkenrelation=this.jp_versuchstatistik.getHeight()-KOPF-FUSS;
    		
    		JLabel geloest=new JLabel("Versuche:");
    		geloest.setBounds(10, 225, 60, HOEHE);
    		this.jp_versuchstatistik.add(geloest);
    		
    		
    		int starthoehe=STARTHOEHE;
    		final int LABELBREITE=120;
    		final int LABELHOEHE=20;
    		final int BESCHRIFTUNGSTART=this.jp_versuchstatistik.getWidth()-LABELBREITE-20;
    		JLabel treffer=new JLabel("Gelöst: "+(BearbeiteVersuche.getSummeAnzahl()-BearbeiteVersuche.getAnzahl(7)));
    		treffer.setBounds(BESCHRIFTUNGSTART, starthoehe, LABELBREITE, LABELHOEHE);
    		this.jp_versuchstatistik.add(treffer);
    		starthoehe+=20;
    		JLabel fehler=new JLabel("Fehlversuche: "+BearbeiteVersuche.getAnzahl(7));
    		fehler.setBounds(BESCHRIFTUNGSTART, starthoehe,LABELBREITE, LABELHOEHE);
    		this.jp_versuchstatistik.add(fehler);
    		starthoehe+=20;
    		JLabel schnitt=new JLabel("Durchschnitt: "+BearbeiteVersuche.getDurchschnitt());
    		schnitt.setBounds(BESCHRIFTUNGSTART, starthoehe,LABELBREITE,LABELHOEHE);
    		this.jp_versuchstatistik.add(schnitt);
    		starthoehe+=20;
    		JLabel maxstreak=new JLabel("Max Streak: "+BearbeiteVersuche.getStreakMax());
    		maxstreak.setBounds(BESCHRIFTUNGSTART, starthoehe,LABELBREITE, LABELHOEHE);
    		this.jp_versuchstatistik.add(maxstreak);
    		starthoehe+=20;
    		JLabel streak=new JLabel("Streak aktuell: "+BearbeiteVersuche.getStreakAktuell());
    		streak.setBounds(BESCHRIFTUNGSTART, starthoehe,LABELBREITE, LABELHOEHE);
    		this.jp_versuchstatistik.add(streak);
    		starthoehe+=100;
    		JLabel par=new JLabel("Rot = 4 Versuche = Par");
    		par.setBounds(BESCHRIFTUNGSTART, starthoehe,LABELBREITE+10, LABELHOEHE);
    		this.jp_versuchstatistik.add(par);
    
    
    		Integer [] feld=new Integer[BearbeiteVersuche.ERFOLG];
    		for(int i=0;i<feld.length;i++) {
    			feld[i]=BearbeiteVersuche.getAnzahl(i+1);
    		}
    		
    		balkenrelation=berechneBalkenrelation(feld, balkenrelation);
    
    
    		for (int i=0;i<BearbeiteVersuche.MOEGLICH-1;i++) {
    			versuch[i]=new JLabel(String.valueOf(i+1),JLabel.CENTER);
    			versuch[i].setBounds(start, 225, BREITE, HOEHE);
    			this.jp_versuchstatistik.add(versuch[i]);
    			ergebnis=(double)BearbeiteVersuche.getAnzahl(i+1)/BearbeiteVersuche.getSummeAnzahl()*balkenrelation;
    			balken[i]=new JLabel("");
    			balken[i].setBounds(start, 
    								(int)(this.jp_versuchstatistik.getHeight()-FUSS-ergebnis),
    								BREITE,
    								(int)ergebnis); 
    								
    			balken[i].setOpaque(true);
    			if(3==i) {
    				balken[i].setBackground(new Color(Farben.Farbe.LightRed.rot(),
    												  Farben.Farbe.LightRed.gruen(),
    												  Farben.Farbe.LightRed.blau()));
    			}
    			else {
    				balken[i].setBackground(Color.GREEN);
    			}
    			this.jp_versuchstatistik.add(balken[i]);
    			anzahl[i]=new JLabel(String.valueOf(BearbeiteVersuche.getAnzahl(i+1)),JLabel.CENTER);
    			anzahl[i].setBounds(start, this.jp_versuchstatistik.getHeight()-KOPF-FUSS-(int)(ergebnis), BREITE, HOEHE);
    			this.jp_versuchstatistik.add(anzahl[i]);
    			
    			start=start+BREITE+ABSTAND;
    		}
    		
    		this.jp_ratestatistik.add(this.jp_versuchstatistik);
    		this.jp.add(this.jp_ratestatistik);
    		this.jframe.add(this.jp);
    		
    	}
    	
    	private static int berechneBalkenrelation(Integer []balken, int balkenrelation) {
    		int max=Tools.Max.max(balken);
    		int summebalken=BearbeiteVersuche.getSummeAnzahl();
    		int ergebnis=0;
    		//System.out.println(max+" summebalken "+summebalken);
    		if(summebalken>0) {
    		
    			if(max<(int)summebalken/4) {
    				ergebnis=(int)balkenrelation*3;
    			}
    			
    			if(max<(int)summebalken/3) {
    				ergebnis=(int)(balkenrelation*2.5);
    			}
    
    
    			if(max<(int)summebalken/2) {
    				ergebnis=balkenrelation*2;
    			}
    		
    			if(max>=summebalken) {
    				ergebnis=balkenrelation;
    			}
    		}
    		
    		return ergebnis;
    	}
    
    
    
    
    	private void erstelleWortTabelle() {
    		String[] titel={"Nr. ","unsortiert","Gelöst"};
    		
    		this.dtm_worte=new DefaultTableModel(titel,0);
    		this.jt_worte=new JTable(this.dtm_worte);
    		
    		for(int i=0;i<Worte.wortstatistik.size();i++) {
    			this.addRow(dtm_worte);
    		}
    		
    		this.jt_worte.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    		TableColumn nummer = this.jt_worte.getColumnModel().getColumn(Wordle.COL1.wert()); //Spalte 1
    		TableColumn worte = this.jt_worte.getColumnModel().getColumn(Wordle.COL2.wert()); //Spalte 2
    		TableColumn geloest = this.jt_worte.getColumnModel().getColumn(Wordle.COL3.wert()); //Spalte 2
    		nummer.setPreferredWidth(40);
    		worte.setPreferredWidth(70);
    		geloest.setPreferredWidth(50);
    
    
    		JScrollPane scrollbar=new JScrollPane(this.jt_worte,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    		scrollbar.setBounds(30, 30, 200, 600);
    		
    		this.jp_worte.add(scrollbar);
    		this.jp_worte.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Worte aus Datei"));
    		
    		TableColumn[] column=new TableColumn[this.jt_worte.getColumnCount()];
    		for(int i=0;i<this.jt_worte.getColumnCount();i++) {
    			column[i]=this.jt_worte.getColumnModel().getColumn(i);
    			column[i].setCellRenderer(new TableWorteRenderer());
    		}
    		
    		this.jt_worte.addMouseListener(this);
    		this.jt_worte.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    	}
    	
    	private void erstelle_sortierte_WortTabelle() {
    		Worte.sortiereWorte();
    		
    		String[] titel={"Nr. ","Worte sortiert","Anz."};
    		
    		this.dtm_worte_sortiert=new DefaultTableModel(titel,0);
    		this.jt_worte_sortiert=new JTable(this.dtm_worte_sortiert);
    		
    		for(int i=0;i<Worte.al_Daten_sortiert.size();i++) {
    			this.addRow(dtm_worte_sortiert);
    		}
    		this.jt_worte_sortiert.setFont(new Font("Serif",Font.PLAIN,16));
    		
    		this.jt_worte_sortiert.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    		TableColumn nummer = this.jt_worte_sortiert.getColumnModel().getColumn(Wordle.COL1.wert()); 
    		TableColumn worte = this.jt_worte_sortiert.getColumnModel().getColumn(Wordle.COL2.wert());
    		TableColumn nummerbuchstabe = this.jt_worte_sortiert.getColumnModel().getColumn(Wordle.COL3.wert());
    		nummer.setPreferredWidth(40);
    		worte.setPreferredWidth(80);
    		nummerbuchstabe.setPreferredWidth(40);
    
    
    		JScrollPane scrollbar=new JScrollPane(this.jt_worte_sortiert,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
    				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    		scrollbar.setBounds(30, 30, 200, 600);
    		
    		this.jp_worte_sortiert.add(scrollbar);
    	}
    	
    	private void erstelleBuchstabenStatistik() {
    		
    		String[] titel={"Nr. ","ABC ","Anzahl ","Prozent "};
    		Object [][] komplett= new Object [Wordle.ALPHABET.wert()+Wordle.SUMMENZEILE.wert()][titel.length];
    		
    		komplett[Wordle.ALPHABET.wert()][Wordle.COL3.wert()]=Buchstaben.getAnzahl_aller_Buchstaben();
    		
    		this.jt_buchstabenhaeufigkeit=new JTable(komplett,titel);
    		
    		this.jt_buchstabenhaeufigkeit.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    		TableColumn nummer = this.jt_buchstabenhaeufigkeit.getColumnModel().getColumn(Wordle.COL1.wert()); 
    		TableColumn abc = this.jt_buchstabenhaeufigkeit.getColumnModel().getColumn(Wordle.COL2.wert()); 
    		TableColumn anzahl = this.jt_buchstabenhaeufigkeit.getColumnModel().getColumn(Wordle.COL3.wert()); 
    		TableColumn prozent = this.jt_buchstabenhaeufigkeit.getColumnModel().getColumn(Wordle.COL4.wert()); 
    		nummer.setPreferredWidth(25);
    		abc.setPreferredWidth(30);
    		anzahl.setPreferredWidth(50);
    		prozent.setPreferredWidth(50);
    
    
    		JScrollPane scrollbar=new JScrollPane(this.jt_buchstabenhaeufigkeit,ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
    				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    		scrollbar.setBounds(30, 30, 185, HOEHE_ALPHABET-35);
    		
    		jp_buchstabenhaeufigkeit.add(scrollbar);
    		
    		TableColumn[] column=new TableColumn[this.jt_buchstabenhaeufigkeit.getColumnCount()];
    		for(int i=0;i<this.jt_buchstabenhaeufigkeit.getColumnCount();i++) {
    			column[i]=this.jt_buchstabenhaeufigkeit.getColumnModel().getColumn(i);
    			column[i].setCellRenderer(new TableBuchstabenhaeufigkeitRenderer());
    		}
    	}
    	
    	private void erstelleStellenStatistik() {
    
    
    		String[] titel={"Nr. ","-1- ","Anz ","[%]","-2- ","Anz ","[%]","-3- ","Anz ","[%]","-4- ","Anz ","[%]","-5- ","Anz ","[%]"};
    		Object [][] komplett= new Object [Wordle.ALPHABET.wert()+Wordle.SUMMENZEILE.wert()][titel.length];
    		
    		this.jt_stellen=new JTable(komplett,titel);
    		
    		JScrollPane scrollbar=new JScrollPane(jt_stellen,ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
    				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    		scrollbar.setBounds(30, 30, 480, HOEHE_ALPHABET-35);
    		
    		jp_Stelle_X.add(scrollbar);
    		
    		TableColumn[] column=new TableColumn[this.jt_stellen.getColumnCount()];
    		for(int i=0;i<this.jt_stellen.getColumnCount();i++) {
    			column[i]=this.jt_stellen.getColumnModel().getColumn(i);
    			column[i].setCellRenderer(new TableStelleRenderer());
    		}
    	}
    
    
    
    
    	private void aktualisiereTabelle() {
    		
    		ArrayList<Buchstabe> ergebnis = new ArrayList<>();
    		ergebnis=Worte.buchstaben.sortiere_nach_Anzahl_Buchstaben();
    
    
    		int fall=0;
    		for(int i=0;i<Worte.wortstatistik.size();i++) {
    			this.jt_worte.setValueAt(i+1, i, Wordle.COL1.wert());
    			this.jt_worte.setValueAt(Worte.wortstatistik.get(i).getwort(), i, Wordle.COL2.wert());
    			fall=Worte.wortstatistik.get(i).getGeloest();
    			
    			if(fall==0)this.jt_worte.setValueAt(" ", i, Wordle.COL3.wert()); //nicht gespielt
    			else if(fall==7)this.jt_worte.setValueAt("X", i, Wordle.COL3.wert()); //nicht gelöst
    			else
    				this.jt_worte.setValueAt(Worte.wortstatistik.get(i).getGeloest(), i, Wordle.COL3.wert());
    			
    			this.jt_worte_sortiert .setValueAt(i+1, i, Wordle.COL1.wert());
    			this.jt_worte_sortiert.setValueAt(Worte.al_Daten_sortiert.get(i), i, Wordle.COL2.wert());
    		}
    		
    		for(int i=0;i<ergebnis.size();i++) {
    			this.jt_buchstabenhaeufigkeit.setValueAt(i+1, i, Wordle.COL1.wert());//1-26
    			this.jt_buchstabenhaeufigkeit.setValueAt(ergebnis.get(i).buchstabe, i, Wordle.COL2.wert());
    			this.jt_buchstabenhaeufigkeit.setValueAt(ergebnis.get(i).anzahl, i, Wordle.COL3.wert());
    			this.jt_buchstabenhaeufigkeit.setValueAt(ergebnis.get(i).prozent, i, Wordle.COL4.wert());		
    			}
    		this.jt_buchstabenhaeufigkeit.setValueAt(Buchstaben.getAnzahl_aller_Buchstaben(),ergebnis.size(),Wordle.COL3.wert());
    		
    		int spalte=0;
    		for(int i=0;i<Wordle.ALPHABET.wert();i++) {
    			this.jt_stellen.setValueAt(i+1, i, Wordle.COL1.wert());//1-26
    			for(int j=0;j<Wordle.ANZAHL_STELLEN.wert();j++) {
    				this.jt_stellen.setValueAt(Worte.buchstaben.getSortiertenBuchstabenAnStelleX(i, j).buchstabe, i, ++spalte);
    				this.jt_stellen.setValueAt(Worte.buchstaben.getSortiertenBuchstabenAnStelleX(i, j).anzahl, i, ++spalte);
    				this.jt_stellen.setValueAt(Worte.buchstaben.getSortiertenBuchstabenAnStelleX(i, j).prozent, i, ++spalte);
    			}
    			spalte=0;
    		}
    		
    		this.jt_stellen.setValueAt(Buchstaben.getAnzahl_aller_Buchstaben()/5,jt_stellen.getRowCount()-1,Wordle.COL3.wert());
    		
    		this.hervorheben();
    	}
    	
    	private void hervorheben() {
    		char wert1,wert2;
    		int zaehler=1;
    		
    		for(int i=1;i<Worte.al_Daten_sortiert.size();i++) {
    			this.jt_worte_sortiert.setValueAt("", i-1, Wordle.COL3.wert());//anzahl jeweiliger Buchstaben auf "" setzen
    			wert1=Worte.al_Daten_sortiert.get(i-1).charAt(0);
    			wert2=Worte.al_Daten_sortiert.get(i).charAt(0);
    			zaehler++;
    			if(wert2>wert1) {
    				this.jt_worte_sortiert.setValueAt(--zaehler, i-1, Wordle.COL3.wert());//anzahl der Worte, die mit jeweils gleichen Buchstaben anfangen
    				zaehler=1;
    			}
    		}
    		
    		TableColumn[] column=new TableColumn[this.jt_worte_sortiert.getColumnCount()];
    		
    		for(int i=0;i<this.jt_worte_sortiert.getColumnCount();i++) {
    			column[i]=this.jt_worte_sortiert.getColumnModel().getColumn(i);			
    			column[i].setCellRenderer(new TableWorteSortiertRenderer());
    		}
    		
    		this.jt_worte_sortiert.setValueAt(zaehler, dtm_worte_sortiert.getRowCount()-1, Wordle.COL3.wert());
    	}
    	
    	private void addRow(DefaultTableModel model) {
    		int anzahlspalten=model.getColumnCount();
    		model.addRow(new Object[anzahlspalten]);
    	}
    	
    	private void removeRow(DefaultTableModel model) {
    		int anzahlspalten=model.getColumnCount();
    		model.removeRow(anzahlspalten-1);
    	}
    
    
    	
    	private boolean ratestatistikGeandert(String titel) {
    		int[] pruef=new int[BearbeiteVersuche.STREAK];
    		for(int i=0;i<BearbeiteVersuche.MOEGLICH;i++) {
    			pruef[i]=BearbeiteVersuche.getAnzahl(i+1);
    		}
    		pruef[BearbeiteVersuche.MOEGLICH]=BearbeiteVersuche.getStreakMax();
    		pruef[BearbeiteVersuche.STREAK-1]=BearbeiteVersuche.getStreakAktuell();
    		boolean geaendert=false;
    		
    		new DialogRatestatistik(titel);
    		
    		for(int i=0;i<BearbeiteVersuche.MOEGLICH;i++) {
    			if(pruef[i]!=BearbeiteVersuche.getAnzahl(i+1)){
    				geaendert=true;
    				break;
    			}
    		}
    		if(pruef[BearbeiteVersuche.MOEGLICH]!=BearbeiteVersuche.getStreakMax())geaendert=true;
    		if(pruef[BearbeiteVersuche.STREAK-1]!=BearbeiteVersuche.getStreakAktuell())geaendert=true;
    
    
    		return geaendert;
    	}
    
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		
    		if (e.getSource()==this.jmi_speicherort_konfiguration){
    			new DialogSpeicherort();
    		} //end speicherort_konfiguration
    		
    		if (e.getSource()==this.jmi_datei_laden){
    			FileFilter filter=new FileNameExtensionFilter("Textdatei","txt");
    			JFileChooser chooser=new JFileChooser(DialogSpeicherort.getPfad());
    			chooser.setFileFilter(filter);
    			chooser.setApproveButtonText("Öffne");
    			int auswahl=chooser.showOpenDialog(null);
    		
    			if(auswahl==JFileChooser.APPROVE_OPTION) {
    				this.dateiname=chooser.getSelectedFile().getAbsolutePath();
    				this.jl_worte_dn.setText(this.dateiname);
    		
    				if(Worte.ladeDatei(this.dateiname)) {
    					BearbeiteVersuche.resetAll();
    					Worte.erstelleLoesungsstatistik();
    					this.erstelleWortTabelle();
    					this.erstelle_sortierte_WortTabelle();
    					this.erstelleBuchstabenStatistik();
    					this.erstelleStellenStatistik();
    					this.aktualisiereTabelle();
    					this.jmi_bearbeiten_wort_hinzufuegen.setEnabled(true);
    					this.jmi_wort_vorhanden.setEnabled(true);
    					this.jmi_ratestatistik_hinzufuegen.setEnabled(true);
    					this.jmi_loesungsdiagramm.setEnabled(true);
    				}
    				else 
    					JOptionPane.showMessageDialog(null, "Worte mit 5 Buchstaben + Lösungsversuch 0-7","Error",
    							JOptionPane.ERROR_MESSAGE);
    			}
    			//ende von if(auswahl==JFileChooser.APPROVE_OPTION
    			//this.jp_worte.repaint();
    		}//ende von datei laden
    		
    		if (e.getSource()==this.jmi_bearbeiten_wort_hinzufuegen){
    			boolean korrekt=false;
    			String hilfstring="";
    			char hb;
    			
    			jl_gesichert.setText(" ");
    			
    			while(!korrekt) {
    				korrekt=true;
    				hilfstring= JOptionPane.showInputDialog(this.jframe, "Zulässige Eingabe:[a-z bzw. A-Z], Wortlänge 5 Buchstaben:", "Neues Lösungswort eingeben:", JOptionPane.QUESTION_MESSAGE);
    
    
    				if(hilfstring==null)break;
    
    
    				if(!Worte.pruefeWort(hilfstring)) {
    					JOptionPane.showMessageDialog(this.jframe, "Kein Wort: Wort mit 5 Buchstaben eingeben! Beispiel: ZENIT");
    					korrekt=false;
    				}
    				else {
    					hilfstring=hilfstring.toUpperCase();
    					Worte.sortiereWorte();
    					this.jmi_datei_speichern.setEnabled(true);
    					this.jb_versuch_uebernehmen.setEnabled(true);
    					this.jmi_bearbeiten_wort_hinzufuegen.setEnabled(false);
    				
    					for(int i=0;i<hilfstring.length();i++) {
    						hb=hilfstring.charAt(i);
    						Worte.buchstaben.setAnzahl(hb,i);
    					}
    				
    					this.addRow(dtm_worte);
    					this.addRow(dtm_worte_sortiert);
    					
    					this.bg_versuche.clearSelection(); //radiobuttons werden zurückgesetzt auf false
    					
    					this.aktualisiereTabelle();
    				}
    			}
    		}//end wort hinzufügen
    		
    		if (e.getSource()==this.jmi_datei_speichern){
    				ArrayList<String>hilf=new ArrayList<>();
    				for(Wort wort:Worte.wortstatistik) {
    					hilf.add(wort.getwort_versuche());
    				}
    				if(Worte.schreibeDatei(DialogSpeicherort.getDateiPlusPfad(DialogSpeicherort.WORTE_DATEI), hilf)) {
    					JOptionPane.showMessageDialog(null, "Speicherfehler bei "+DialogSpeicherort.getWorteDatei());
    				}
    				else {
    					this.jl_gesichert.setText("Gesichert :-) ");
    					if(Worte.schreibeLoeseStatistik()) {
    						JOptionPane.showMessageDialog(null, "Speicherfehler bei "+DialogSpeicherort.getRatestatistik());
    					}
    
    
    					if(Worte.schreibeDatei(DialogSpeicherort.getDateiPlusPfad(DialogSpeicherort.WORTE_SORTIERT_DATEI), Worte.al_Daten_sortiert)) {
    						JOptionPane.showMessageDialog(this.jframe, "Speicherfehler bei "+DialogSpeicherort.getWorteSortiertDatei());
    					}
    					else {
    						this.jl_worte_dn.setText(DialogSpeicherort.getWorteDatei());
    						this.jl_worte_sortiert_dn.setText(DialogSpeicherort.getWorteSortiertDatei());
    						JOptionPane.showMessageDialog(this.jframe, "Erfolgreich gespeichert.");
    						this.jmi_datei_speichern.setEnabled(false);
    					}
    				}
    		}// end speichern
    
    
    		if (e.getSource()==this.jmi_info) {
    			JOptionPane.showMessageDialog(null, "Erstellt im April-Juni 2022,  Stiller Leser");
    		}//end info
    		
    		if(e.getSource()==this.jmi_ratestatistik_hinzufuegen) {
    			if(!Worte.getIstZahl()) {
    				if(this.ratestatistikGeandert("Ratestatistik hinzufügen")) {
    					Worte.schreibeLoeseStatistik();
    					this.erstelleRatestastistik();
    					this.erstelleBalkendiagramm();
    					this.jmi_ratestatistik_hinzufuegen.setEnabled(false);
    					this.jmi_ratestatistik_aendern.setEnabled(true);
    					this.jframe.repaint();
    				}
    			}
    		}//end ratestatistik hinzufügen
    		
    		if(e.getSource()==this.jmi_ratestatistik_aendern) {
    			if(this.ratestatistikGeandert("Ratestatistik ändern")){		
    				Worte.schreibeLoeseStatistik();
    				this.erstelleBalkendiagramm();
    				this.jp_versuchstatistik.repaint();
    			}
    		}//end ratestatistik geändert
    
    
    		
    		if (e.getSource()==this.jb_versuch_uebernehmen) {
    			for(int i=0;i<this.jrb_versuche.length;i++) {
    				if(this.jrb_versuche[i].isSelected()) {
    					if(i<BearbeiteVersuche.MOEGLICH) {
    						BearbeiteVersuche.addAnzahl(i+1);
    						Worte.wortstatistik.get(Worte.wortstatistik.size()-1).setGeloest(i+1);
    					}
    					else if(i==BearbeiteVersuche.KEINE_LOESUNG_VERSUCHT) {
    						Worte.wortstatistik.get(Worte.wortstatistik.size()-1).setGeloest(0);
    					}
    
    
    					if(i<BearbeiteVersuche.ERFOLG) {
    						BearbeiteVersuche.addStreakAktuell();
    					}
    					
    					this.jb_versuch_uebernehmen.setEnabled(false);
    					this.jmi_bearbeiten_wort_hinzufuegen.setEnabled(true);
    					this.jl_gesichert.setText("Nicht gesichert!");
    					this.jp_versuchstatistik.removeAll();
    					this.jp_ratestatistik.remove(jp_versuchstatistik);
    					this.aktualisiereTabelle();
    					this.erstelleBalkendiagramm();
    					
    					this.jp_versuchstatistik.repaint();
    				}
    			}
    		}//end versuch übernehmen
    
    
    		if (e.getSource()==this.jmi_wort_vorhanden) {
    			String hilfstring= JOptionPane.showInputDialog(null, "Bitte Lösungsmöglichkeit eingeben:");
    			
    			if(Tools.IstABC.istABC(hilfstring)&&hilfstring.length()==Wordle.ANZAHL_STELLEN.wert()) {
    				hilfstring=hilfstring.toUpperCase();
    				ArrayList<String>hilf=new ArrayList<>();
    				hilf=Worte.getWortliste();
    				if(hilf.contains(hilfstring)) {
    					int i=0;
    					for(int j=0;j<hilf.size();j++) {
    						if(hilfstring.equals(hilf.get(j))) {
    							i=j+1;
    							break;
    						}
    					}
    					JOptionPane.showInternalMessageDialog(null, hilfstring +" war schon mal eine Lösung! Wort Nummer "+Integer.toString(i), 
    							hilfstring +" in Liste vorhanden!", JOptionPane.WARNING_MESSAGE);
    				}
    				else {
    					JOptionPane.showInternalMessageDialog(null, hilfstring +" wurde bisher nicht als Lösung gesucht.");
    				}
    			}
    			else {
    				JOptionPane.showInternalMessageDialog(null, "Nur Buchstaben a-z bzw. A-Z zulässig! Nur Worte mit 5 Buchstaben erlaubt!", "Ungültige Eingabe", JOptionPane.ERROR_MESSAGE);
    			}
    
    
    		}//end wort vorhanden
    
    
    		if (e.getSource()==this.jmi_filter) {
    			new Filter();
    		}//end filter
    		
    		if (e.getSource()==this.jmi_grosser_filter) {
    			new Grosser_Filter();
    		}//end filter
    		
    		if (e.getSource()==this.jmi_loesungsdiagramm) {
    			new DiagrammLoesungen();
    		}//end loesungsdiagramm
    
    
    		if (e.getSource()==this.jmi_beenden) {
    			this.jframe.setVisible(false);
    			this.jframe.dispose();
    			
    			System.exit(0);
    		}//end beenden
    		
    		//mousekontextmenü
    		if (e.getSource()==this.jmi_wort_aendern) {
    			if(this.aendern!=-1) {
    				boolean korrekt=false;
    				String hilfstring="";
    				
    				while(!korrekt) {
    					korrekt=true;
    					hilfstring= JOptionPane.showInputDialog(this.jframe, "Zulässige Eingabe:[a-z bzw. A-Z], Wortlänge 5 Buchstaben:", "Neues Lösungswort eingeben:", JOptionPane.QUESTION_MESSAGE);
    
    
    					if(hilfstring==null)break;
    
    
    					if(!Tools.IstABC.istABC(hilfstring)||hilfstring.length()!=5) {
    						JOptionPane.showMessageDialog(this.jframe, "Kein Wort: Wort mit 5 Buchstaben eingeben! Beispiel: ZENIT");
    						korrekt=false;
    					}
    					else {
    						hilfstring=hilfstring.toUpperCase();
    						if(!Worte.getWortliste().contains(hilfstring)) {
    							Worte.wortstatistik.get(aendern).setWort(hilfstring);
    							Worte.sortiereWorte();
    							this.aktualisiereTabelle();
    							this.jl_gesichert.setText("Nicht gesichert!");
    							this.jmi_datei_speichern.setEnabled(true);
    						}
    						else {
    							JOptionPane.showMessageDialog(this.jframe, "Lösungswort schon vorhanden!");
    							korrekt=false;
    						}
    					}
    				}
    			}
    			this.jt_worte.clearSelection();
    		}//end wort aendern
    		
    		if (e.getSource()==this.jmi_wort_loeschen) {
    			if(this.aendern!=-1) {
    				int aktion=-1;
    				
    				aktion=JOptionPane.showInternalConfirmDialog(null, "Sicher?", Worte.wortstatistik.get(aendern)+" löschen?", 
    						JOptionPane.OK_CANCEL_OPTION);
    				
    				if(aktion==0) {
    					if(Worte.loescheWort(this.aendern)){
    						Worte.sortiereWorte();
    						
    						this.removeRow(dtm_worte);
    						this.removeRow(dtm_worte_sortiert);
    				
    						this.bg_versuche.clearSelection(); //radiobuttons werden zurückgesetzt auf false
    				
    						this.jb_versuch_uebernehmen.setEnabled(false);
    						this.jmi_bearbeiten_wort_hinzufuegen.setEnabled(true);
    						this.jl_gesichert.setText("Nicht gesichert!");
    						this.jmi_datei_speichern.setEnabled(true);
    						this.jp_versuchstatistik.removeAll();
    						this.jp_ratestatistik.remove(jp_versuchstatistik);
    						this.aktualisiereTabelle();
    						this.erstelleBalkendiagramm();
    						this.jp_versuchstatistik.repaint();
    					}
    				}
    			}
    			this.jt_worte.clearSelection();
    		}//end wort loeschen
    		
    		if (e.getSource()==this.jmi_wort_einfuegen) {
    			if(this.aendern!=-1) {
    				boolean korrekt=false;
    				boolean korrektezahl=false;
    				String hilfstring="";
    				int versuche=0;
    				
    				while(!korrekt) {
    					korrekt=true;
    					hilfstring= JOptionPane.showInputDialog(this.jframe, "Zulässige Eingabe:[a-z bzw. A-Z], Wortlänge 5 Buchstaben:", 
    															"Neues Lösungswort eingeben:", JOptionPane.QUESTION_MESSAGE);
    
    
    					if(hilfstring==null)break;
    
    
    					if(!Tools.IstABC.istABC(hilfstring)||hilfstring.length()!=5) {
    						JOptionPane.showMessageDialog(this.jframe, "Kein Wort: Wort mit 5 Buchstaben eingeben! Beispiel: ZENIT");
    						korrekt=false;
    					}
    					else {
    						hilfstring=hilfstring.toUpperCase();
    						if(!Worte.getWortliste().contains(hilfstring)) {
    							Worte.fuege_Wort_ein(aendern, hilfstring);
    						
    							while(!korrektezahl) {
    								korrektezahl=true;
    								hilfstring= JOptionPane.showInputDialog(this.jframe, "0=nicht versucht, 7=nicht gelöst, 1-6=Anzahl Versuche",
    																	"Anzahl Versuche: Zulässige Eingabe:[0-7]", JOptionPane.QUESTION_MESSAGE);
    								if(hilfstring==null)break;
    								if(Tools.IstZahl.isInteger(hilfstring)) {
    									versuche=Integer.valueOf(hilfstring);
    									if(versuche>-1||versuche<8) {
    										Worte.wortstatistik.get(aendern).setGeloest(versuche);
    										Worte.erstelleLoesungsstatistik();
    										Worte.sortiereWorte();
    										this.addRow(dtm_worte);
    										this.addRow(dtm_worte_sortiert);
    										this.jl_gesichert.setText("Nicht gesichert!");
    										this.jmi_datei_speichern.setEnabled(true);
    										this.jp_versuchstatistik.removeAll();
    										this.jp_ratestatistik.remove(jp_versuchstatistik);
    										this.aktualisiereTabelle();
    										this.erstelleBalkendiagramm();
    										this.jp_versuchstatistik.repaint();
    									}
    									else {
    										korrektezahl=false;
    										JOptionPane.showMessageDialog(this.jframe, "Nur eine Zahl zwischen 0 und 7 erlaubt!");
    									}
    								}
    								else {
    									korrektezahl=false;
    									JOptionPane.showMessageDialog(this.jframe, "Es wurde keine Zahl eingegeben!");
    								}
    							}
    						}
    						else {
    							JOptionPane.showMessageDialog(this.jframe, "Lösungswort schon vorhanden!");
    							korrekt=false;
    						}
    					}
    				}
    			this.jt_worte.clearSelection();			}
    		}// end wort einfügen
    		
    		if (e.getSource()==this.jmi_abbrechen) {
    			this.jt_worte.clearSelection();
    		}//end abbrechen
    
    
    	}
    
    
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		// TODO Auto-generated method stub
    		if (e.getButton()==MouseEvent.BUTTON1) {
    			if(!gemessen) {
    				reihe=jt_worte.getMousePosition().y/jt_worte.getRowHeight();
    				long zeit=System.currentTimeMillis();
    				gemessen=true;
    				while(System.currentTimeMillis()-zeit>GRENZE) {}
    			}
    			else if(jt_worte.getSelectedRow()==reihe) {
    					jt_worte.changeSelection(jt_worte.getMousePosition().y/jt_worte.getRowHeight(), 0, true, false);//wenn select,dann deseltect und umgekehrt
    					gemessen=false;
    					}
    			else if(jt_worte.getSelectedRow()!=reihe){
    				reihe=jt_worte.getMousePosition().y/jt_worte.getRowHeight();
    			}
    		}
    		
    		if (e.getButton()==MouseEvent.BUTTON3) {
    			if(jt_worte.getSelectedRow()!=-1&&jt_worte.getSelectedRow()==reihe) {
    				this.aendern=jt_worte.getSelectedRow();
    				
    				JPopupMenu j_pm=new JPopupMenu();
    				this.jmi_wort_aendern=new JMenuItem("Wort ändern");
    				this.jmi_wort_aendern.setFont(new Font("Dialog",Font.BOLD,12));
    				this.jmi_wort_aendern.addActionListener(this);
    				
    				this.jmi_wort_einfuegen=new JMenuItem("Wort einfügen");
    				this.jmi_wort_einfuegen.setFont(new Font("Dialog",Font.BOLD,12));
    				this.jmi_wort_einfuegen.setToolTipText("vor dem markierten Wort");
    				this.jmi_wort_einfuegen.addActionListener(this);
    
    
    				this.jmi_wort_loeschen=new JMenuItem("Wort löschen");
    				this.jmi_wort_loeschen.setFont(new Font("Dialog",Font.BOLD,12));
    				this.jmi_wort_loeschen.addActionListener(this);
    				
    				this.jmi_abbrechen=new JMenuItem("abbrechen");
    				this.jmi_abbrechen.setFont(new Font("Dialog",Font.BOLD,12));
    				this.jmi_abbrechen.addActionListener(this);
    
    
    				
    				j_pm.add(this.jmi_wort_aendern);
    				j_pm.add(this.jmi_wort_einfuegen);
    				j_pm.add(new JSeparator());
    				j_pm.add(this.jmi_wort_loeschen);
    				j_pm.add(new JSeparator());
    				j_pm.add(this.jmi_abbrechen);
    				j_pm.show(e.getComponent(), e.getX(), e.getY());
    			}
    		}
    	}
    
    
    	@Override
    	public void mousePressed(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    
    
    	@Override
    	public void mouseExited(MouseEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    	
    }
    class DialogRatestatistik Eingabe für die eigene Ratestatistik
    Code:
    package Worte;
    
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JSeparator;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;
    
    
    public class DialogRatestatistik implements ActionListener,
                                                FocusListener {                                                
        
        final static int ANZAHL_EINGABEN=9;
        
        private JDialog frame;
        private JPanel jp;
        private JLabel[] jl_beschreibung;
        private JTextField[] jt_eingabe;
        private JButton jb_ok;
        private JButton jb_cancel;
        
        public DialogRatestatistik(String titel) {
            
            int dialogbreite=250;
            int dialoghoehe=350;
            int dialog_x=Fenster.FENSTERBREITE/2+Fenster.START_X_FRAME-dialogbreite/2;
            int dialog_y=Fenster.START_Y_FRAME+Fenster.FENSTERHOEHE/2-dialoghoehe/2;
    
    
            
            this.frame=new JDialog();
            this.frame.setBounds(dialog_x, dialog_y, dialogbreite, dialoghoehe);
            this.frame.setTitle(titel);
            this.frame.setResizable(false);
            this.frame.setAlwaysOnTop(true);
            this.frame.setModal(true);
            
            this.jp=new JPanel(null);
            this.jp.setBounds(5, 5, 240, 340);
    
    
            int abstandHoehe=20;
            int hoehe=20;
            int breiteLabel=150;
            int breiteTextField=50;
            int linkerRandLabel=10;
            int linkerRandTextfield=170;
            
            this.jl_beschreibung=new JLabel[ANZAHL_EINGABEN];
            this.jt_eingabe=new JTextField[ANZAHL_EINGABEN];
            
            JSeparator sep=new JSeparator(SwingConstants.HORIZONTAL);
            
            for(int i=0;i<ANZAHL_EINGABEN;i++) {
                this.jl_beschreibung[i]=new JLabel("");
                this.jl_beschreibung[i].setBounds(linkerRandLabel, abstandHoehe, breiteLabel, hoehe);
                this.jl_beschreibung[i].setText("Gelöst im Versuch Nr.:    "+(i+1));
                this.jl_beschreibung[i].setHorizontalAlignment(JLabel.RIGHT);
                this.jp.add(this.jl_beschreibung[i]);
                
                this.jt_eingabe[i]=new JTextField();
                this.jt_eingabe[i].setBounds(linkerRandTextfield, abstandHoehe, breiteTextField, hoehe);
                this.jt_eingabe[i].setHorizontalAlignment(JLabel.RIGHT);
                this.jt_eingabe[i].addFocusListener(this);
                
                switch(i) {
                    case 0,1,2,3,4,5,6:
                        this.jt_eingabe[i].setText(String.valueOf(BearbeiteVersuche.getAnzahl(i+1)));
                    break;
                    case 7:
                        this.jt_eingabe[i].setText(String.valueOf(BearbeiteVersuche.getStreakMax()));
                    break;
                    case 8:
                        this.jt_eingabe[i].setText(String.valueOf(BearbeiteVersuche.getStreakAktuell()));
                    break;
                    default:
                    break;
                }
                this.jp.add(this.jt_eingabe[i]);
                
                if(i==5 ||i==6) {
                    abstandHoehe+=3;
                    sep=new JSeparator(SwingConstants.HORIZONTAL);
                    sep.setBounds(linkerRandLabel, abstandHoehe+hoehe+2, jp.getWidth()-30, 1);
                    sep.setBorder(BorderFactory.createLineBorder(Color.lightGray));
                    jp.add(sep);
                    abstandHoehe+=5;
                }
                
                abstandHoehe+=25;
            }
            
            this.jl_beschreibung[6].setText("Fehlversuche : ");
            this.jl_beschreibung[7].setText("Maximaler Streak : ");
            this.jl_beschreibung[8].setText("Aktueller Streak : ");
            
            this.jb_ok=new JButton("OK");
            this.jb_ok.setBounds(linkerRandTextfield-90, abstandHoehe+20, 60, 25);
            this.jb_ok.addActionListener(this);
            this.jb_ok.setFocusable(false);
            
            this.jb_cancel=new JButton("Cancel");
            this.jb_cancel.setBounds(linkerRandTextfield-25, abstandHoehe+20, 80, 25);
            this.jb_cancel.addActionListener(this);
            this.jb_cancel.setFocusable(false);
            
            this.jt_eingabe[0].selectAll();
    
    
            this.jp.add(this.jb_ok);
            this.jp.add(this.jb_cancel);
            
            this.frame.add(this.jp);
            this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.frame.setVisible(true);
            
        }
        
        private void aendereRateDaten(int nummer, int anzahl) {
            
            if(anzahl<0)anzahl=0;
            switch (nummer) {
                case 0,1,2,3,4,5,6:
                        BearbeiteVersuche.setAnzahl(nummer+1, anzahl);
                        BearbeiteVersuche.ermittelSummeAnzahl();
                break;
                case 7:
                    BearbeiteVersuche.setStreakMax(anzahl);
                break;
                case 8:
                    BearbeiteVersuche.setStreakAktuell(anzahl);
                break;
                default:
                break;
            }
        }
        
        
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            boolean inOrdnung=true;
            if (e.getSource()==this.jb_ok){
                for(int i=0;i<ANZAHL_EINGABEN;i++) {
                    if(!Tools.IstZahl.isInteger(jt_eingabe[i].getText())) {
                        JOptionPane.showMessageDialog(this.frame, "Es muss eine ganze Zahl eingegeben werden!","Error",
                                JOptionPane.ERROR_MESSAGE);
                        inOrdnung=false;
                        break;
                    }
                    this.aendereRateDaten(i,Integer.parseInt(jt_eingabe[i].getText()));
                }
                if(inOrdnung) {
                    frame.setVisible(false);
                    frame.dispose();
                }
            }//end ok
            
            if (e.getSource()==this.jb_cancel) {
                boolean isEingaben=false;
                for(int i=0;i<ANZAHL_EINGABEN;i++) {
                    if(Tools.IstZahl.isInteger(jt_eingabe[i].getText())) {
                        if(Integer.parseInt(jt_eingabe[i].getText())>0)isEingaben=true;
                    }
                }
                if(isEingaben) {
                    frame.setVisible(false);
                    frame.dispose();
                }
            }//end
        }
    
    
    
    
    
    
        @Override
        public void focusGained(FocusEvent e) {
            // TODO Auto-generated method stub
            for(int i=0;i<ANZAHL_EINGABEN;i++) {
                if (e.getSource()==this.jt_eingabe[i])this.jt_eingabe[i].selectAll();
            }
            
        }
    
    
        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub
            String hilf="";
            for(int i=0;i<ANZAHL_EINGABEN;i++) {
                if (e.getSource()==this.jt_eingabe[i]) {
                    hilf=this.jt_eingabe[i].getText();
                    if(!Tools.IstZahl.isInteger(hilf)) {
                        JOptionPane.showMessageDialog(this.frame, "Es muss eine ganze Zahl eingegeben werden!","Error",
                                JOptionPane.ERROR_MESSAGE);
                        this.jt_eingabe[i].selectAll();
                        this.jt_eingabe[i].requestFocus();
                    }
                }
            }
    
    
        }
    
    
    }
    class Filter für Ausgabe gefilterte Liste
    Code:
    package Worte;
    
    import java.awt.Color;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.util.ArrayList;
    
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.table.TableColumn;
    
    
    import Farben.Farbe;
    import Renderer.FilterRenderer;
    
    
    public class Filter implements ActionListener,
                                   FocusListener{
        
        private static int  startlinks=250;
        private static int instanz=0; //filter für vorhandene Liste 1 filter für gefilterte Liste beim nächsten Filteraufruf.
        private static boolean liste_aus_gefilterte_Liste=false;
        private static ArrayList<String> gf_Liste=new ArrayList<>();
        
        private int framebreite=250;
        private char buchstabe='A';
        //private int nummer=0;
        
        private JFrame frame;
        private JPanel jp;
        
        private JLabel jl_stelle;
        private JLabel jl_buchstabe;
        private JLabel jl_treffer;
        private JLabel jl_filter_gefilterteListe;
        private JCheckBox jcb_filter_gefilterteListe;
        
        private JComboBox<String> jcb_stelle;
        private JTextField jtf_buchstabe;
        
        private JTextArea jta_liste;
        
        private JTable jt_table;
        
        private JButton jb_schliessen;
        private JButton jb_auswahl;
        
        public Filter() {
            
            //instanz++;
            //this.nummer++;
            
            int hoehe=25;
            int componenthoehe=20;
            int rand=10;
            int rand2=42;
            int tabstart=97;
            int tabbreite=127;
            int textareabreite=80;
            int dialoghoehe=300;
            int dialog_y=Fenster.START_Y_FRAME+Fenster.FENSTERHOEHE/2-dialoghoehe/2;
    
    
            
            this.frame=new JFrame("Filter");
            this.frame.setBounds(startlinks, dialog_y, this.framebreite, 300);
            this.frame.setAlwaysOnTop(true);
            this.frame.setResizable(false);
            startlinks+=this.framebreite+5;
            
            String text="";
            if(liste_aus_gefilterte_Liste) {
                text="Filter auf gefilterte Wortliste:";
            }
            else {
                text="Wortliste gefiltert:";
            }
            this.jp=new JPanel(null);
            this.jp.setBounds(5, 5, this.frame.getHeight()-10, this.frame.getWidth()-10);
            this.jp.setBorder(BorderFactory.createTitledBorder
                    (BorderFactory.createEtchedBorder(), text));
    
    
            this.jl_buchstabe=new JLabel("Char");
            this.jl_buchstabe.setBounds(rand, hoehe, 40, componenthoehe);
            
            this.jl_stelle=new JLabel("Stelle x");
            this.jl_stelle.setBounds(rand2, hoehe, 50, componenthoehe);
            hoehe+=20;
            
            this.jtf_buchstabe=new JTextField("");
            this.jtf_buchstabe.setBounds(rand, hoehe, 30, componenthoehe);
            this.jtf_buchstabe.setFocusable(true);
            this.jtf_buchstabe.addFocusListener(this);
            this.jtf_buchstabe.addActionListener(this);
            this.jtf_buchstabe.setHorizontalAlignment(JLabel.CENTER);
            this.jtf_buchstabe.setToolTipText("Einzelnen Buchstaben eingeben");
    
    
            String[] stelle= {"1","2","3","4","5"};
            this.jcb_stelle=new JComboBox<>(stelle);
            this.jcb_stelle.setBounds(rand2, hoehe, 40, componenthoehe);
            ((JLabel)this.jcb_stelle.getRenderer()).setHorizontalAlignment(JLabel.CENTER);
            
            this.jcb_stelle.addActionListener(this);
            
            this.jb_auswahl=new JButton("Ok");
            this.jb_auswahl.setMargin(new Insets(0,0,0,0));
            this.jb_auswahl.setBounds(rand2+45, hoehe+2, 26, 16);
            this.jb_auswahl.setToolTipText("Worte mit Buchstabe an Stelle x");
            this.jb_auswahl.addActionListener(this);
            
            hoehe+=30;
            
            this.jta_liste=new JTextArea();
            this.jta_liste.setBounds(rand, hoehe, textareabreite, 150);
            this.jta_liste.setEditable(false);
            this.jta_liste.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
            JScrollPane scrollpane=new JScrollPane(this.jta_liste);
            scrollpane.setBounds(rand, hoehe, textareabreite, 150);
            
            String[] titel= {"Nr.","1","2","3","4","5"};
            Object[][] komplett=new Object[5][titel.length];
            
            this.jt_table=new JTable(komplett,titel);
            this.jt_table.setBounds(tabstart, hoehe, tabbreite, 150);
            this.jt_table.setToolTipText("Buchstabenhäufigkeit mit festen Buchstaben an Stelle x");
            this.jt_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            for(int i=0;i<titel.length;i++) {
                this.jt_table.getColumnModel().getColumn(i).setPreferredWidth(20);
            }
            
            JScrollPane scrollbar=new JScrollPane(this.jt_table,ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
            scrollbar.setBounds(tabstart, hoehe, tabbreite, 105);
            
            TableColumn[] column=new TableColumn[this.jt_table.getColumnCount()];
            for(int i=0;i<this.jt_table.getColumnCount();i++) {
                column[i]=this.jt_table.getColumnModel().getColumn(i);
                column[i].setCellRenderer(new FilterRenderer());
            }
            
            for(int i=0;i<5;i++) {
                this.jt_table.setValueAt(i+1, i, 0);
            }
            
            hoehe+=160;
            
            this.jl_treffer=new JLabel("");
            this.jl_treffer.setBounds(rand, hoehe, 150, componenthoehe);
        
            this.jb_schliessen=new JButton("Schließen");
            this.jb_schliessen.setMargin(new Insets(0,0,0,0));
            this.jb_schliessen.setBounds(jp.getWidth()-140, jp.getHeight()-10, 70, 25);
            this.jb_schliessen.addActionListener(this);
            
            this.jl_filter_gefilterteListe=new JLabel("Filter Liste:");
            this.jl_filter_gefilterteListe.setBounds(jp.getWidth()-193, jp.getHeight()-60, 65, 20);
            
            this.jcb_filter_gefilterteListe=new JCheckBox();
            this.jcb_filter_gefilterteListe.setBounds(jp.getWidth()-130, jp.getHeight()-60, 20, 20);
            this.jcb_filter_gefilterteListe.setToolTipText("<html>Wenn aktiviert, kann diese gefilterte Liste<br>" +
                                                      "noch mal gefiltert werden.<br>" +
                                                      "Hierzu muss ein neuen Filter aufrufen werden.</html>");
            this.jcb_filter_gefilterteListe.addActionListener(this);
            this.jcb_filter_gefilterteListe.setEnabled(false);
            
            this.jp.add(jl_stelle);
            this.jp.add(jl_buchstabe);
            this.jp.add(jcb_stelle);
            this.jp.add(jtf_buchstabe);
            this.jp.add(scrollpane);
            this.jp.add(jb_auswahl);
            this.jp.add(scrollbar);
            this.jp.add(jb_schliessen);
            this.jp.add(jl_treffer);
            this.jp.add(jl_filter_gefilterteListe);
            this.jp.add(jcb_filter_gefilterteListe);
            
            
            this.frame.add(jp);
            this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            this.frame.setVisible(true);
        }
    
    
        private void clearTable() {
            for(int i=1;i<this.jt_table.getColumnCount();i++) {
                for(int j=0;j<this.jt_table.getRowCount();j++) {
                    this.jt_table.setValueAt(" ", j, i);
                }
            }
        }
        
        private void fuelleTable(int stelle) {
            this.clearTable();
            ArrayList<Buchstabe>buchstabe=new ArrayList<>();
            int max=0;
            for(int i=0;i<this.jt_table.getColumnCount()-1;i++) {
                buchstabe=Worte.buchstaben.sortiere_nach_Anzahl_Buchstaben_Select(i, Worte.al_Wortliste_select, this.buchstabe);
                if(buchstabe.size()>5) {
                    max=5;
                }
                else {
                    max=buchstabe.size();
                }
                
                for(int j=0;j<max;j++) {
                    if(stelle==i) {
                        this.jt_table.setValueAt("-", j, i+1);
                    }
                    else {
                        this.jt_table.setValueAt(buchstabe.get(j).buchstabe, j, i+1);
                    }
                }
            }
        }
        
        private String wortstrecker(String wort) {
            String hilf="";
            for(int i=0;i<wort.length();i++) {
                hilf=hilf.concat(String.valueOf(wort.charAt(i)).concat(" "));
            }
            return hilf;
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
    
    
            if (e.getSource()==this.jb_auswahl||
                e.getSource()==this.jcb_stelle||
                e.getSource()==this.jtf_buchstabe) {
                boolean buchstabe_passt=false;
                int stelle=0;
                if(jtf_buchstabe.getText().length()==1) {
                    if(Tools.IstABC.istABC(jtf_buchstabe.getText())) {
                        String hilf=this.jtf_buchstabe.getText().toUpperCase();
                        this.buchstabe=hilf.charAt(0);
                        buchstabe_passt=true;
                    }
                    
                stelle=Integer.parseInt((String)this.jcb_stelle.getSelectedItem());
                
                if(buchstabe_passt) {
                    String text="";
                    if(!liste_aus_gefilterte_Liste) {
                        Worte.ermittleWortListeSelect(stelle-1, this.buchstabe);
                        for(String hilf:Worte.al_Wortliste_select){
                            text=text.concat(wortstrecker(hilf));
                            text=text.concat("\n");
                        }
                        this.jl_treffer.setText("Treffer: "+Worte.al_Wortliste_select.size());
                        this.jcb_filter_gefilterteListe.setEnabled(true);
                    }
                    else {
                        Worte.ermittleWortListeSelect(stelle-1, this.buchstabe,gf_Liste);
                        for(String hilf:Worte.al_Wortliste_select){
                            text=text.concat(wortstrecker(hilf));
                            text=text.concat("\n");
                        }
                        this.jl_treffer.setText("Treffer: "+Worte.al_Wortliste_select.size());
                    }
                    this.jta_liste.setText(text);
                    this.fuelleTable(stelle-1);
                    this.jp.repaint();
                }
            }
            
            }//end auswahl
    
    
            if (e.getSource()==this.jcb_filter_gefilterteListe) {
                if(this.jcb_filter_gefilterteListe.isSelected()) {
                    liste_aus_gefilterte_Liste=true;
                    gf_Liste.clear();
                    instanz=1;
                    for(String hilf:Worte.al_Wortliste_select) {
                        gf_Liste.add(hilf);
                    }
                }
                else {
                    liste_aus_gefilterte_Liste=false;
                    gf_Liste.clear();
                }
            }//end filterfilter
            
            if (e.getSource()==this.jb_schliessen) {
                startlinks-=this.framebreite-5;
                if(this.jcb_filter_gefilterteListe.isSelected()) {
                    liste_aus_gefilterte_Liste=false;
                    gf_Liste.clear();
                    instanz=0;
                }
    
    
                if(instanz==0) {
                        liste_aus_gefilterte_Liste=false;
                        gf_Liste.clear();
                }
                
                this.frame.setVisible(false);
                this.frame.dispose();
            }//end
        }
    
    
        @Override
        public void focusGained(FocusEvent e) {
            // TODO Auto-generated method stub
            if (e.getSource()==this.jtf_buchstabe)this.jtf_buchstabe.selectAll();
        }
    
    
        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub
            
        }
    
    
    }
    class DialogSpeicherort Speicherorte Fenster für die Pfad- und Dateiangaben
    Code:
    package Worte;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFileChooser;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JSeparator;
    import javax.swing.SwingConstants;
    import javax.swing.filechooser.FileNameExtensionFilter;
    
    
    public class DialogSpeicherort implements ActionListener,
                                              FocusListener {
        
        private final static String _ini="worte.xxx";
        private final static String BACKSLASH="\\";
        
        private static String _worte="worte.txt";
        private static String _worte_sortiert="worte_sortiert.txt";
        private static String _ratestatistik="statistik.txt";
        private static String _pfad="d:/daten/test";
        
        private static boolean ini_speicher_ok=false;
        private static boolean ini_lade_ok=false;
        private static boolean geaendert_ok=false;
        
        private JDialog dialog;
        private JPanel jp;
        
        private JLabel jl_pfad_ueberschrift;
        private JLabel jl_pfad;
        private JLabel jl_neuer_pfad;
        private JLabel jl_worte_ueberschrift;
        private JLabel jl_worte;
        private JLabel jl_neu_worte;
        private JLabel jl_worte__sortiert_ueberschrift;
        private JLabel jl_worte_sortiert;
        private JLabel jl_neu_worte_sortiert;
        private JLabel jl_ratestatistik_ueberschrift;
        private JLabel jl_ratestatistik;
        private JLabel jl_neu_ratestatistik;
            
        
        private JButton jb_pfad;
        private JButton jb_worte;
        private JButton jb_worte_sortiert;
        private JButton jb_ratestatistik;
        
        private JButton jb_ok;
        
        public DialogSpeicherort() {
            
            int start_x=5;
            int start_y=5;
            int start_comp_x=10;
            int start_comp_y=10;
            int componenthoehe=17;
            int componentbreite=380;
            int buttonstart=componentbreite+start_comp_x+5+40;
            int buttonbreite=35;
            int schrittweite=60;
            int dialogbreite=500;
            int dialoghoehe=335;
            int dialog_x=Fenster.FENSTERBREITE/2+Fenster.START_X_FRAME-dialogbreite/2;
            int dialog_y=Fenster.START_Y_FRAME+Fenster.FENSTERHOEHE/2-dialoghoehe/2;
    
    
            this.dialog=new JDialog();
            this.dialog.setTitle("Pfad und Speicherdateien konfigurieren");
            this.dialog.setBounds(dialog_x, dialog_y, dialogbreite, dialoghoehe);
            this.dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            
            this.jp=new JPanel(null);
            this.jp.setBounds(start_x, start_y, dialog.getWidth()-2*start_x, dialog.getHeight()-2*start_y);
            
            this.jl_pfad_ueberschrift=new JLabel("Pfadangabe für Speicherdateien:");
            this.jl_pfad_ueberschrift.setBounds(start_x, start_comp_y, componentbreite, componenthoehe+2);
            this.jl_pfad_ueberschrift.setFont(new Font("Serif",Font.BOLD,14));
            
            this.jl_pfad=new JLabel("Bisher: "+_pfad);
            this.jl_pfad.setBounds(start_comp_x, start_comp_y+componenthoehe+1, componentbreite, componenthoehe);
            this.jl_neuer_pfad=new JLabel("Bisher: "+_pfad);
            this.jl_neuer_pfad.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*2, componentbreite, componenthoehe);
    
    
            this.jb_pfad=new JButton("Neu");
            this.jb_pfad.setMargin(new Insets(0,0,0,0));
            this.jb_pfad.setBounds(buttonstart, this.jl_neuer_pfad.getLocation().y-2, buttonbreite, componenthoehe);
            this.jb_pfad.addActionListener(this);
            
            JSeparator sep=new JSeparator(SwingConstants.HORIZONTAL);
            sep.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*3+2, jp.getWidth()-(2*start_comp_x), 1);
            sep.setBorder(BorderFactory.createLineBorder(Color.lightGray));
            
            start_comp_y+=schrittweite;
    
    
            this.jl_worte_ueberschrift=new JLabel("Datei unsortierte Wortliste:");
            this.jl_worte_ueberschrift.setBounds(start_x, start_comp_y, componentbreite, componenthoehe+2);
            this.jl_worte_ueberschrift.setFont(new Font("Serif",Font.BOLD,14));
            
            this.jl_worte=new JLabel("Bisher: "+_worte);
            this.jl_worte.setBounds(start_comp_x, start_comp_y+componenthoehe+1, componentbreite, componenthoehe);
            this.jl_neu_worte=new JLabel("Bisher: "+_worte);
            this.jl_neu_worte.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*2, componentbreite, componenthoehe);
    
    
            this.jb_worte=new JButton("Neu");
            this.jb_worte.setMargin(new Insets(0,0,0,0));
            this.jb_worte.setBounds(buttonstart, this.jl_neu_worte.getLocation().y-2, buttonbreite, componenthoehe);
            this.jb_worte.addActionListener(this);
            
            JSeparator sep1=new JSeparator(SwingConstants.HORIZONTAL);
            sep1.setBounds(start_comp_x,start_comp_y+(componenthoehe+1)*3+2, jp.getWidth()-(2*start_comp_x), 1);
            sep1.setBorder(BorderFactory.createLineBorder(Color.lightGray));
            
            start_comp_y+=schrittweite;
            
            this.jl_worte__sortiert_ueberschrift=new JLabel("Datei sortierte Wortliste:");
            this.jl_worte__sortiert_ueberschrift.setBounds(start_x, start_comp_y, componentbreite, componenthoehe+2);
            this.jl_worte__sortiert_ueberschrift.setFont(new Font("Serif",Font.BOLD,14));
            
            this.jl_worte_sortiert=new JLabel("Bisher: "+_worte_sortiert);
            this.jl_worte_sortiert.setBounds(start_comp_x, start_comp_y+componenthoehe+1, componentbreite, componenthoehe);
            this.jl_neu_worte_sortiert=new JLabel("Bisher: "+_worte_sortiert);
            this.jl_neu_worte_sortiert.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*2, componentbreite, componenthoehe);
    
    
            this.jb_worte_sortiert=new JButton("Neu");
            this.jb_worte_sortiert.setMargin(new Insets(0,0,0,0));
            this.jb_worte_sortiert.setBounds(buttonstart, this.jl_neu_worte_sortiert.getLocation().y-2, buttonbreite, componenthoehe);
            this.jb_worte_sortiert.addActionListener(this);
            
            JSeparator sep2=new JSeparator(SwingConstants.HORIZONTAL);
            sep2.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*3+2, jp.getWidth()-(2*start_comp_x), 1);
            sep2.setBorder(BorderFactory.createLineBorder(Color.lightGray));
            
            start_comp_y+=schrittweite;
            
            this.jl_ratestatistik_ueberschrift=new JLabel("Lösestatitistik zu Wordle:");
            this.jl_ratestatistik_ueberschrift.setBounds(start_x, start_comp_y, componentbreite, componenthoehe+2);
            this.jl_ratestatistik_ueberschrift.setFont(new Font("Serif",Font.BOLD,14));
            
            this.jl_ratestatistik=new JLabel("Bisher: "+_ratestatistik);
            this.jl_ratestatistik.setBounds(start_comp_x, start_comp_y+componenthoehe+1, componentbreite, componenthoehe);
            this.jl_neu_ratestatistik=new JLabel("Bisher: "+_ratestatistik);
            this.jl_neu_ratestatistik.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*2, componentbreite, componenthoehe);
    
    
            this.jb_ratestatistik=new JButton("Neu");
            this.jb_ratestatistik.setMargin(new Insets(0,0,0,0));
            this.jb_ratestatistik.setBounds(buttonstart, this.jl_neu_ratestatistik.getLocation().y-2, buttonbreite, componenthoehe);
            this.jb_ratestatistik.addActionListener(this);
            
            JSeparator sep3=new JSeparator(SwingConstants.HORIZONTAL);
            sep3.setBounds(start_comp_x, start_comp_y+(componenthoehe+1)*3+2, jp.getWidth()-(2*start_comp_x), 1);
            sep3.setBorder(BorderFactory.createLineBorder(Color.lightGray));
            
            start_comp_y+=schrittweite;
    
    
            this.jb_ok=new JButton("Schliessen");
            this.jb_ok.setFont(new Font("serif",Font.BOLD,16));
            this.jb_ok.setMargin(new Insets(0,0,0,0));
            this.jb_ok.setBounds(buttonstart-60, start_comp_y+10, buttonbreite+60, componenthoehe+10);
            this.jb_ok.setToolTipText("<html>Wird was geändert, wird hierüber gespeichert. <br>"
                                     + "Wenn Abbruch ohne Übernahme, mit x oben rechts schließen!</html>");
            this.jb_ok.addActionListener(this);
    
    
            
            jp.add(jl_pfad_ueberschrift);
            jp.add(jl_pfad);
            jp.add(jl_neuer_pfad);
            jp.add(jb_pfad);
            jp.add(sep);
            jp.add(jl_worte_ueberschrift);
            jp.add(jl_worte);
            jp.add(jl_neu_worte);
            jp.add(jb_worte);
            jp.add(sep1);
            jp.add(jl_worte__sortiert_ueberschrift);
            jp.add(jl_worte_sortiert);
            jp.add(jl_neu_worte_sortiert);
            jp.add(jb_worte_sortiert);
            jp.add(sep2);
            jp.add(jl_ratestatistik_ueberschrift);
            jp.add(jl_ratestatistik);
            jp.add(jl_neu_ratestatistik);
            jp.add(jb_ratestatistik);
            jp.add(sep3);
            jp.add(jb_ok);
    
    
    
    
            
            dialog.add(jp);
            dialog.setVisible(true);
        }
        
        public static void setWorteDatei(String worte) {
            _worte=worte;
        }
    
    
        public static void setWorteSortiertDatei(String worteSortiert) {
            _worte_sortiert=worteSortiert;
        }
        
        public static void setRatestatistik(String ratestatistik) {
            _ratestatistik=ratestatistik;
        }
    
    
        public static void setPfad(String pfad) {
            _pfad=pfad;
        }
        
        public static String getWorteDatei() {
            return _worte;
        }
    
    
        public static String getWorteSortiertDatei() {
            return _worte_sortiert;
        }
        
        public static String getRatestatistik() {
            return _ratestatistik;
        }
        
        public static String getIniDatei() {
            return _ini;
        }
        
        public static String getPfad() {
            return _pfad;
        }
        
        public static String getDateiPlusPfad(int i) {
            String hilf=_pfad.concat(BACKSLASH);
            
            switch (i) {
                case 1:
                    return hilf.concat(_worte);
                case 2:
                    return hilf.concat(_worte_sortiert);
                case 3:
                    return hilf.concat(_ratestatistik);
                default:
                    break;
            }
            return null;
        }
        
        public static boolean getLadeIni_ok() {
            return ini_lade_ok;
        }
        
        private static boolean schreibeIni() {
    
    
            File file = new File(_ini); 
    
    
            try {
               BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 
                   writer.write(_pfad);
                   writer.newLine();
                   writer.write(_worte);
                   writer.newLine();
                   writer.write(_worte_sortiert);
                   writer.newLine();
                   writer.write(_ratestatistik);
                   writer.newLine();
               writer.close();
               ini_speicher_ok=true;
            }
            catch(IOException ioe) {
               JOptionPane.showMessageDialog(null, "Fehler beim Speichern der Ini "+ioe, "Speicher ini -> Speicherfehler", 
                                                JOptionPane.ERROR_MESSAGE);
            }
            
            return ini_speicher_ok;
        }
        
        protected static boolean ladeIni() {
            
            File file = new File(_ini);
            ArrayList<String> hilf=new ArrayList<>();
            
            if (file.canRead() || file.isFile()) {
                
                BufferedReader in = null;
            try {
                in = new BufferedReader(new FileReader(file));
                String zeile=null;
                while ((zeile = in.readLine()) != null) {
                    hilf.add(zeile);
                }
            } catch (IOException e) {
                   JOptionPane.showMessageDialog(null, "Fehler beim Speichern der Ini "+e, "Speicher ini -> Speicherfehler", 
                              JOptionPane.ERROR_MESSAGE);
            } finally {
                if (in != null)
                    try {
                        in.close();
                    } catch (IOException e) {
               }
            }
            }
    
    
            if(hilf.isEmpty()||hilf.size()>4)return false;
            
            _pfad=hilf.get(0);
            _worte=hilf.get(1);
            _worte_sortiert=hilf.get(2);
            _ratestatistik=hilf.get(3);
            
            ini_lade_ok=true;
            
            return ini_lade_ok; //kein Fehler
        }
    
    
        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if (e.getSource()==this.jb_pfad){
                
                JFileChooser chooser=new JFileChooser(_pfad);
                chooser.setDialogTitle("Speicherverzeichnis auswählen");
                chooser.setMultiSelectionEnabled(false);
                chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                chooser.setApproveButtonText("Ok");
                FileNameExtensionFilter filter=new FileNameExtensionFilter("Nur Verzeichnisse", "*.*");
                chooser.addChoosableFileFilter(filter);
                
                int auswahl=chooser.showOpenDialog(this.dialog);
                
                if(auswahl==JFileChooser.APPROVE_OPTION) {
                    String hilfstring=String.valueOf(chooser.getSelectedFile());
                    if(!hilfstring.equals(_pfad)) {
                        this.jl_neuer_pfad.setText("Pfad neu: "+ hilfstring);
                        _pfad=hilfstring;
                        geaendert_ok=true;
                        jb_ok.setText("Speichern");
                    }
                }
            }//end pfad
            
            if (e.getSource()==this.jb_worte){
                String hilfstring=JOptionPane.showInputDialog(this.dialog, "Dateinnamen ohne Endung eingeben [A-Z,a-z,0-9]:", "Unsortierte Wortliste eingeben",JOptionPane.QUESTION_MESSAGE);
                if(hilfstring!=null&&Tools.IstABC_Zif.istABC_Zif(hilfstring)) {
                    hilfstring=hilfstring.concat(".txt");
                    if(!hilfstring.equals(_ratestatistik) && 
                        !hilfstring.equals(_worte) &&
                        !hilfstring.equals(_worte_sortiert)) {
                            jl_neu_worte.setText("Neu: "+hilfstring);
                            _worte=hilfstring;
                            geaendert_ok=true;
                            jb_ok.setText("Speichern");
                    }
                }
                else {
                    JOptionPane.showMessageDialog(dialog, "Ohne Endung, nur Buchstaben + Ziffern zulässig! [a-z,A-Z,0-9]",
                                                           "Warnung -> Unsortierte Wortliste ",JOptionPane.ERROR_MESSAGE);
                }
            }//end worte
            
            if (e.getSource()==this.jb_worte_sortiert){
                String hilfstring=JOptionPane.showInputDialog(this.dialog, "Dateinamen ohne Endung eingeben [A-Z,a-z,0-9]:", "Sortierte Wortliste eingeben",JOptionPane.QUESTION_MESSAGE);
                if(hilfstring!=null&&Tools.IstABC_Zif.istABC_Zif(hilfstring)) {
                    hilfstring=hilfstring.concat(".txt");
                    if(!hilfstring.equals(_ratestatistik) && 
                        !hilfstring.equals(_worte) &&
                        !hilfstring.equals(_worte_sortiert)) {
                            jl_neu_worte_sortiert.setText("Neu: "+hilfstring);
                            _worte_sortiert=hilfstring;
                            geaendert_ok=true;
                            jb_ok.setText("Speichern");
                    }
                }
                else {
                    JOptionPane.showMessageDialog(dialog, "Ohne Endung, nur Buchstaben + Ziffern zulässig! [a-z,A-Z,0-9]",
                                                           "Warnung -> Sortierte Wortliste ",JOptionPane.ERROR_MESSAGE);
                }
            }//end worte sortiert
            
            if (e.getSource()==this.jb_ratestatistik){
                String hilfstring=JOptionPane.showInputDialog(this.dialog, "Dateinnamen ohne Endung eingeben [A-Z,a-z,0-9]:", "Rätselstatistik eingeben",JOptionPane.QUESTION_MESSAGE);
                if(hilfstring!=null&&Tools.IstABC_Zif.istABC_Zif(hilfstring)) {
                    hilfstring=hilfstring.concat(".txt");
                    if(!hilfstring.equals(_ratestatistik) && 
                        !hilfstring.equals(_worte) &&
                        !hilfstring.equals(_worte_sortiert)) {
                            jl_neu_ratestatistik.setText("Neu: "+hilfstring);
                            _ratestatistik=hilfstring;
                            geaendert_ok=true;
                            jb_ok.setText("Speichern");
                    }
                }
                else {
                    JOptionPane.showMessageDialog(dialog, "Ohne Endung, nur Buchstaben + Ziffern zulässig! [a-z,A-Z,0-9]",
                                                           "Warnung -> Rätselstatistik ",JOptionPane.ERROR_MESSAGE);
                }
            }//end ratestatistik
            
            if (e.getSource()==this.jb_ok){
                
                if(geaendert_ok) {
                    if(DialogSpeicherort.schreibeIni()) {
                        JOptionPane.showMessageDialog(null, "Erfolgreich geändert.");
                    }
                    geaendert_ok=false;
                    jb_ok.setText("Schliessen");
                }
                this.dialog.setVisible(false);
                this.dialog.dispose();
            }//end ok
            
        }
    
    
        @Override
        public void focusGained(FocusEvent e) {
            // TODO Auto-generated method stub
            
        }
    
    
        @Override
        public void focusLost(FocusEvent e) {
            // TODO Auto-generated method stub
            
        }
    }
    class DiagrammLoesungen

    Code:
    package Worte;
    
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    
    
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import Tools.Point;
    
    
    public class DiagrammLoesungen implements ActionListener{
    	
    	private JDialog dialog;
    	private JPanel jp_diagramm;
    	private JPanel jp_bereich;
    	private JPanel jp_scalierung;
    	private JPanel jp_schnitt;
    	private JPanel jp_streak;
    	
    	private JRadioButton[] jrb_scalierung;
    	private ButtonGroup bg_scalierung;
    	
    	private JCheckBox jcb_schnitt_komplett;
    	private JCheckBox jcb_schnitt_aktuellerStreak;
    	private JCheckBox jcb_schnitt_verlauf;
    	private JCheckBox jcb_wortloesungen;
    	
    	private JButton jb_nord;
    	private JButton jb_sued;
    	private JButton jb_west;
    	private JButton jb_ost;
    	private JButton jb_center;
    	
    	private static JLabel []jl_balken;
    	private static JLabel []jl_versuche;
    	private static JLabel []jl_num;
    	private static JLabel jl_versuch;
    	private JComboBox<String> jcb_streak;
    	
    	private static ArrayList<Point>points=new ArrayList<>();
    	private static ArrayList<Index>io=new ArrayList<>();
    	private static ArrayList<Index>iu=new ArrayList<>();
    	
    	private static int pixel=0;
    	private static int anzahlnull=0;
    	private static int bedienelemente=115;
    	private static int y_abstaende=5;
    	
    	private final static int _hoehepanels=115;
    	private final static int _jp_bereich_br=175;
    	private final static int _jp_schnitt_br=160;
    	private final static int _jp_streak_br=175;
    	private final static int _jp_scalierung_br=110;
    	private final static int _breite_balken=16;
    	private final static int _abstand_balken=6;
    	
    	private final static int _RESET=40; //grundabstand zwischen Lösungen va=40
    	private final static int _ks=12; //scala X-Achse Zwischenstriche
    	private final static int _ls=20; //scala X-Achse Hauptstriche
    	private final static int _z=20; //scala X-Achse Zahlen
    	private final static int _lr=26; //diagramm rand links
    	private final static int _rr=28; //diagramm rand rechts
    	private static int start_abstand=5; //abstand von oben 5, von links 5 
    	private static int va=_RESET; //abstand Linien zwischen den Versuchen
    	private static int y_start=110; //linie 6 versuche
    	private static int rand_unten_diagramm=45;
    	
    	
    	private static int schleifenstart=0;
    	
    	private final static int SCALIERUNG=130; //Scalierungsmöglichkeiten: 1=10 Pixel/Wort
    	private final static int SCAR_1=0; //2=5 Pixel/Wort
    	private final static int SCAR_2=1; //3=2 Pixel/Wort
    	private final static int SCAR_3=2; //4=1 Pixel/Wprt
    	private final static int SCAR_4=3; //scal= gewählte Scalierung
    	private static int scal=0; //SCALIERUNG=130 auf Basis scalierung 0 = 130 Worte möglich
    
    
    	private static boolean d_al=false; //durchschnitt über alles zeichen
    	private static boolean d_as=false; //durchschnitt aktueller Streak zeichen
    	private static boolean d_av=false; //durchschnittsverlauf zeichnen
    	private static boolean d_vw=true; //loesung pro Wort zeichnen
    	private static double d_al_d=0.0; //al_d= durchnittswert durchschnitt über alles als double
    	private static double d_as_d=0.0; //as_d= durchschnittswert aktueller Streak als double
    	
    	private static ArrayList<Integer>verlauf=new ArrayList<>();
    	private static ArrayList<Wort>worte=new ArrayList<>();
    	//private static int[]balken;
    	private static Integer[]balken;
    	private static int summebalken;
    	private static int gezeigterversuch=0;
    	private static int reihen;
    	private static int BALKENHOEHE_MAX=58;
    	
    	public DiagrammLoesungen(){
    		
    		initialisiere();
    
    
    		this.dialog=new JDialog();
    		this.dialog.setLayout(null);
    		this.dialog.setTitle("Diagramm -> Anzahl Versuche pro bisherige Lösungsworte");
    		this.dialog.setBounds(Fenster.START_X_FRAME, Fenster.START_Y_FRAME, 
    				Fenster.FENSTERBREITE, y_start+6*va+50+y_abstaende*3+bedienelemente+30);
    		this.dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    		this.dialog.setAlwaysOnTop(true);
    		
    		this.jp_diagramm=new ZeichneDiagramm(start_abstand,start_abstand,
    											 Fenster.FENSTERBREITE-2*start_abstand,y_start+6*va+rand_unten_diagramm);
    		
    		this.jp_scalierung=new JPanel(null);
    		this.jp_scalierung.setLayout(new BoxLayout(jp_scalierung,BoxLayout.Y_AXIS));
    		this.jp_scalierung.setBounds(start_abstand,this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, 
    									_jp_scalierung_br, _hoehepanels);
    		this.jp_scalierung.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Scaliere:"));
    		
    		this.bg_scalierung=new ButtonGroup();
    		this.jrb_scalierung=new JRadioButton[4];
    		
    		this.jrb_scalierung[0]=new JRadioButton("10 Pixel/Wort");
    		this.jrb_scalierung[1]=new JRadioButton("5 Pixel/Wort");
    		this.jrb_scalierung[2]=new JRadioButton("2 Pixel/Wort");
    		this.jrb_scalierung[3]=new JRadioButton("1 Pixel/Wort");
    		for(int i=0;i<jrb_scalierung.length;i++) {
    			this.jrb_scalierung[i].setFont(new Font("SanSerif",Font.BOLD,11));
    			this.jrb_scalierung[i].addActionListener(this);
    			this.bg_scalierung.add(this.jrb_scalierung[i]);
    			this.jp_scalierung.add(this.jrb_scalierung[i]);
    		}
    		
    		this.jrb_scalierung[scal].setSelected(true);
    		
    		this.jp_schnitt=new JPanel(null);
    		this.jp_schnitt.setLayout(new BoxLayout(jp_schnitt,BoxLayout.Y_AXIS));
    		this.jp_schnitt.setBounds(this.jp_scalierung.getLocation().x+this.jp_scalierung.getWidth()+5,
    				this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_schnitt_br, _hoehepanels);
    		this.jp_schnitt.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Durchschnitt:"));
    
    
    		this.jcb_schnitt_komplett=new JCheckBox("alle Lösungen : "+ Double.toString(d_al_d));
    		this.jcb_schnitt_komplett.setFont(new Font("SanSerif",Font.BOLD,11));
    		this.jcb_schnitt_komplett.setSelected(false);
    		this.jcb_schnitt_komplett.addActionListener(this);
    		d_al=false;
    
    
    		if(d_as_d>0) {
    			this.jcb_schnitt_aktuellerStreak=new JCheckBox("aktueller Streak : "+Double.toString(d_as_d));
    		}
    		else {
    			this.jcb_schnitt_aktuellerStreak=new JCheckBox("aktueller Streak : [-]");
    		}
    		this.jcb_schnitt_aktuellerStreak.setFont(new Font("SanSerif",Font.BOLD,11));
    		this.jcb_schnitt_aktuellerStreak.setSelected(false);
    		this.jcb_schnitt_aktuellerStreak.addActionListener(this);
    		d_as=false;
    		
    		this.jcb_schnitt_verlauf=new JCheckBox("Verlauf Durchschnitt");
    		this.jcb_schnitt_verlauf.setFont(new Font("SanSerif",Font.BOLD,11));
    		this.jcb_schnitt_verlauf.setSelected(false);
    		this.jcb_schnitt_verlauf.addActionListener(this);
    		d_av=false;
    		
    		this.jcb_wortloesungen=new JCheckBox("Versuche/Wort");
    		this.jcb_wortloesungen.setFont(new Font("SanSerif",Font.BOLD,11));
    		this.jcb_wortloesungen.setSelected(true);
    		this.jcb_wortloesungen.addActionListener(this);
    		d_vw=true;
    		
    		this.jp_schnitt.add(this.jcb_schnitt_komplett);
    		this.jp_schnitt.add(this.jcb_schnitt_aktuellerStreak);
    		this.jp_schnitt.add(this.jcb_schnitt_verlauf);
    		this.jp_schnitt.add(this.jcb_wortloesungen);
    		
    		this.jp_streak=new JPanel(null);
    		this.jp_streak.setBounds(this.jp_schnitt.getLocation().x+this.jp_schnitt.getWidth()+5,
    				this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_streak_br, _hoehepanels);
    		this.jp_streak.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Stat. Streaks"));
    		
    		reihen=BearbeiteVersuche.getAnzahlMisserfolge()+1;
    		String[] hilf=new String[reihen];
    		for(int i=0;i<reihen;i++) {
    			if(i==reihen-1) {
    				hilf[i]="Streak aktuell";
    			}
    			else 
    				{
    					hilf[i]=String.valueOf(i+1);
    				}
    		}
    
    
    		this.jcb_streak=new JComboBox<String>(hilf);
    		this.jcb_streak.setFont(new Font("SanSerif",Font.BOLD,10));
    		this.jcb_streak.addActionListener(this);
    		this.jcb_streak.setBounds(10, 16, 120, 15);
    		
    		gezeigterversuch=reihen-1;
    		this.jcb_streak.setSelectedIndex(gezeigterversuch);
    		erstelleBalkenStreak(gezeigterversuch);
    
    
    		int fusszeile=_hoehepanels-15;
    		int start=30;
    		double ergebnis;
    
    
    		jl_versuche=new JLabel[BearbeiteVersuche.ERFOLG];
    		jl_balken=new JLabel[BearbeiteVersuche.ERFOLG];
    		jl_num=new JLabel[BearbeiteVersuche.ERFOLG];
    		
    		jl_versuch=new JLabel("Anz:");
    		jl_versuch.setFont(new Font("SanSerif",Font.BOLD,11));
    		jl_versuch.setBounds(5, fusszeile, start, 10);
    		start+=_abstand_balken;
    		for(int i=0;i<balken.length;i++) {
    			if(summebalken*balken[i]>0) {
    				ergebnis=(double)(BALKENHOEHE_MAX/summebalken*balken[i]);
    			}
    			else {
    				ergebnis=0;
    			}
    			jl_num[i]=new JLabel(String.valueOf(i+1),JLabel.CENTER);
    			jl_num[i].setFont(new Font("Dialog",Font.BOLD,10));
    			jl_num[i].setBounds(start,fusszeile,_breite_balken,10);
    			
    			jl_versuche[i]=new JLabel(String.valueOf(balken[i]),JLabel.CENTER);
    			jl_versuche[i].setFont(new Font("Dialog",Font.BOLD,10));
    			if(ergebnis>0) {
    				jl_versuche[i].setBounds(start,(int)fusszeile-(int)ergebnis-10,_breite_balken,10);
    			}
    
    
    			jl_balken[i]=new JLabel("");
    			jl_balken[i].setOpaque(true);
    			if(ergebnis>0) {
    				jl_balken[i].setBounds(start,(int)fusszeile-(int)(ergebnis),_breite_balken,(int)BALKENHOEHE_MAX/summebalken*balken[i]);
    			}
    			else {
    				jl_balken[i].setBounds(start,(int)fusszeile-BALKENHOEHE_MAX,_breite_balken,BALKENHOEHE_MAX);
    			}
    			
    			jl_balken[i].setBackground(Color.GREEN);
    			start=start+_breite_balken+_abstand_balken;
    			if(i==3)jl_balken[i].setBackground(new Color(Farben.Farbe.LightRed.rot(),
    												  		 Farben.Farbe.LightRed.gruen(),
    												  		 Farben.Farbe.LightRed.blau()));
    			this.jp_streak.add(jl_num[i]);
    			this.jp_streak.add(jl_versuche[i]);
    			this.jp_streak.add(jl_balken[i]);
    		}
    		this.jp_streak.add(jcb_streak);
    		this.jp_streak.add(jl_versuch);
    
    
    		this.jp_bereich=new JPanel(null);
    		this.jp_bereich.setLayout(new BorderLayout(2,2));
    		this.jp_bereich.setBounds(this.jp_streak.getLocation().x+this.jp_streak.getWidth()+5,
    				this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_bereich_br, _hoehepanels);
    		this.jp_bereich.setBorder(BorderFactory.createTitledBorder
    				(BorderFactory.createEtchedBorder(), "Normandy SR-2 Bedienpult:"));
    		
    		JPanel jp_nord=new JPanel(null);
    		jp_nord.setLayout(new BoxLayout(jp_nord,BoxLayout.X_AXIS));
    		
    		this.jb_nord=new JButton("Y-Achse [+]");
    		this.jb_nord.setMargin(new Insets(3,0,3,0));
    		this.jb_nord.setToolTipText("+10 Pixel Y-Achse");
    		this.jb_nord.addActionListener(this);
    		jp_nord.add(Box.createRigidArea(new Dimension((jp_bereich.getWidth()-jb_nord.getPreferredSize().width)/2-5,2)));
    		jp_nord.add(jb_nord);
    		jp_bereich.add(jp_nord,BorderLayout.NORTH);
    		
    		JPanel jp_sued=new JPanel(null);
    		jp_sued.setLayout(new BoxLayout(jp_sued,BoxLayout.X_AXIS));
    
    
    		this.jb_sued=new JButton("Y-Achse [-]");
    		this.jb_sued.setMargin(new Insets(3,0,3,0));
    		this.jb_sued.setToolTipText("-10 Pixel Y-Achse");
    		this.jb_sued.addActionListener(this);
    		jp_sued.add(Box.createRigidArea(new Dimension((jp_bereich.getWidth()-jb_sued.getPreferredSize().width)/2-5,2)));
    		jp_sued.add(jb_sued);
    		this.jp_bereich.add(jp_sued,BorderLayout.SOUTH);
    		
    		this.jb_west=new JButton("<<Scroll");
    		this.jb_west.setMargin(new Insets(0,0,0,1));
    		this.jb_west.setToolTipText("Nach Links scrollen bis maximal 0 Worte");
    		this.jb_west.addActionListener(this);
    		this.jp_bereich.add(jb_west,BorderLayout.WEST);
    		
    		this.jb_ost=new JButton("Scroll>>");
    		this.jb_ost.setMargin(new Insets(0,1,0,0));
    		this.jb_ost.setToolTipText("Nach Rechts scrollen");
    		this.jb_ost.addActionListener(this);
    		this.jp_bereich.add(jb_ost,BorderLayout.EAST);
    
    
    		this.jb_center=new JButton("Reset");
    		this.jb_center.setMargin(new Insets(0,1,0,1));
    		this.jb_center.setToolTipText("Auf Ursprung setzen mit Start 0 Worte");
    		this.jb_center.addActionListener(this);
    		this.jp_bereich.add(jb_center,BorderLayout.CENTER);
    
    
    
    
    		this.dialog.add(jp_diagramm);
    		this.dialog.add(jp_scalierung);
    		this.dialog.add(jp_schnitt);
    		this.dialog.add(jp_streak);
    		this.dialog.add(jp_bereich);
    		
    		this.dialog.setVisible(true);
    		
    		zeichneDiagramm();
    		erstelleIndex();
    		erstelleBalkenneu();
    	}
    	
    	private void zeichneDiagramm() {
    		erstellePunkte();
    		erstelleIndex();
    		this.dialog.remove(jp_diagramm);
    		
    		this.jp_diagramm=new ZeichneDiagramm(start_abstand,start_abstand,
    				 							 Fenster.FENSTERBREITE-2*start_abstand,y_start+6*va+rand_unten_diagramm);
    		this.dialog.add(jp_diagramm);
    		this.jp_diagramm.repaint();
    	}
    	
    	private static void initialisiere() {
    		
    		d_al_d=BearbeiteVersuche.getDurchschnitt();
    		d_as_d=BearbeiteVersuche.berechneDurchschnittAS();
    		anzahlnull=0;
    		
    		worte.clear();
    		for(Wort worthilf:Worte.wortstatistik) {
    			if(worthilf.getGeloest()!=0)worte.add(worthilf);
    			if(worthilf.getGeloest()==0)anzahlnull++;
    		}
    
    
    		int anzahl=Worte.wortstatistik.size();
    		
    		anzahl-=anzahlnull;
    		
    		if(anzahl<(SCALIERUNG+1)) {
    			pixel=10;
    			scal=SCAR_1;
    		}
    		else if(anzahl<(SCALIERUNG*2+1)) {
    			pixel=5;
    			scal=SCAR_2;
    		}
    		else if(anzahl<(SCALIERUNG*5+1)) {
    			pixel=2;
    			scal=SCAR_3;
    		}
    		else {
    			pixel=1;
    			scal=SCAR_4;
    		}
    	}
    	
    	private static void erstelleBalkenStreak(int streaknummer) {
    		int anfang=0, ende = 0;
    		int start=0;
    		summebalken=0;
    		ArrayList<Wort>streak=new ArrayList<>();
    		balken=new Integer[BearbeiteVersuche.ERFOLG];
    		for(int i=0;i<balken.length;i++) {
    			balken[i]=0;
    		}
    		
    		for(int i=0;i<worte.size();i++) {
    			if(start==streaknummer)break;
    			
    			if(worte.get(i).getGeloest()==BearbeiteVersuche.MISSERFOLG+1)start++;
    			if(start==streaknummer&&start!=0) {
    				anfang=i+1;
    			}
    		}
    		
    		for(int i=anfang;i<worte.size();i++) {
    			if(worte.get(i).getGeloest()==BearbeiteVersuche.MISSERFOLG+1) {
    				ende=i;
    				break;
    				}
    			}
    		
    		if(ende==0)ende=worte.size();
    				
    		for(int i=anfang;i<ende;i++) {
    			streak.add(worte.get(i));
    		}
    		
    		for(Wort wort:streak) {
    			balken[wort.getGeloest()-1]++;
    		}
    		
    		for(int i=0;i<balken.length;i++)summebalken+=balken[i];
    	}
    	
    	private static void erstelleBalkenneu() {
    		int fusszeile=_hoehepanels-15;
    		int start=30;
    		double ergebnis;
    
    
    		start+=_abstand_balken;
    		
    		berechneBalkenrelation();
    		
    		//System.out.println(summebalken+" Balkenhoehe= "+BALKENHOEHE_MAX);
    		
    		for(int i=0;i<balken.length;i++) {
    			ergebnis=(double)BALKENHOEHE_MAX/summebalken*balken[i];
    			if(jl_versuche!=null) {
    				jl_versuche[i].setText(String.valueOf(balken[i]));
    				jl_versuche[i].setFont(new Font("Dialog",Font.BOLD,10));
    				if(ergebnis>0) {
    					jl_versuche[i].setBounds(start,(int)(fusszeile-ergebnis-10),_breite_balken,10);
    				}
    				else {
    					jl_versuche[i].setBounds(start,fusszeile-20,_breite_balken,10);
    				}
    			}
    
    
    			if(jl_balken!=null) {
    			jl_balken[i].setBounds(start,(int)(fusszeile-ergebnis),_breite_balken,	(int)ergebnis);
    			jl_balken[i].setBackground(Color.GREEN);
    			start=start+_breite_balken+_abstand_balken;
    			if(i==3)jl_balken[i].setBackground(new Color(Farben.Farbe.LightRed.rot(),
    												  		 Farben.Farbe.LightRed.gruen(),
    												  		 Farben.Farbe.LightRed.blau()));
    			}
    		}
    	}
    	
    	private static void berechneBalkenrelation() {
    		int max=Tools.Max.max(balken);
    		//System.out.println(max+" summebalken "+summebalken);
    		if(summebalken>0) {
    		
    			if(max<(int)summebalken/4) {
    				BALKENHOEHE_MAX=160;
    			}
    			
    			if(max<(int)summebalken/3) {
    				BALKENHOEHE_MAX=130;
    			}
    
    
    			if(max<(int)summebalken/2) {
    				BALKENHOEHE_MAX=110;
    			}
    		
    			if(max>=summebalken) {
    				BALKENHOEHE_MAX=58;
    			}
    		}
    	}
    	
    	private static void erstellePunkte() {
    		int i=0;
    		int geloest;
    		double y_verlauf;
    		ArrayList<Integer>hilf=new ArrayList<>();
    		ArrayList<Double>hilf2=new ArrayList<>();
    		hilf=Worte.getWortGeloestliste();
    		hilf2=BearbeiteVersuche.berechneDurchschnittVerlauf();
    
    
    		points.clear();
    		verlauf.clear();
    		for(int j=schleifenstart*10*(int)Math.pow(2, scal);j<hilf.size();j++) {
    			geloest=hilf.get(j);
    			y_verlauf=hilf2.get(j);
    			if(geloest!=7) {
    				points.add(new Point(i*pixel,y_start+6*va-geloest*va));
    				verlauf.add((int)(y_start+6*va-y_verlauf*va));
    			}
    			else {
    				points.add(new Point(i*pixel,-1));
    				verlauf.add(-1);
    			}
    		i++;
    		}
    	}
    	
    	
    	/*
    	 * Ermittelt die X-Koordinaten und die Zahlen für die Indexleiste oben und unten.
    	 */
    	private static void erstelleIndex() {
    		int ln=Worte.getIndexLetzteNichtgeloest();
    		int ls=10*(int)Math.pow(2, scal);
    		int ks=5*(int)Math.pow(2, scal);
    		int zaehler=SCALIERUNG*10/pixel;
    		int startwert=ln-schleifenstart*10*(int)Math.pow(2, scal);
    		int j=0;
    		int k=0;
    		io.clear();
    		iu.clear();
    		
    		for(int i=0+schleifenstart*ls;i<zaehler+1+schleifenstart*ls;i++) {
    			if(j==ls) {
    				io.add(new Index(k*pixel,Integer.toString(i),true,false)); //ko lang
    				j=0;
    			}
    			else if(j==ks) {
    					io.add(new Index(k*pixel,"",false,false)); //ko mittel
    			}
    			else if (j>0&&scal<2) {
    					io.add(new Index(k*pixel,"",false,true)); //ko kurz
    			}
    			j++;
    			k++;
    		}
    		if(startwert<0) {
    			startwert=ln-startwert;
    			k=(startwert-ln)%ls-2*ls;
    		}
    		else {
    			k=0;
    		}
    
    
    		j=k+startwert-ln;
    		for(int i=startwert;i<zaehler+1+(schleifenstart+2)*ls;i++) {
    			if(j%ls==0) {
    				if(startwert<=ln) {
    					iu.add(new Index((k+startwert)*pixel,Integer.toString(k),true,false));
    				}
    				else {
    					if(k*pixel>0) {
    						iu.add(new Index(k*pixel,Integer.toString(k+startwert-ln),true,false));
    						//System.out.println("j= "+j+" k= "+k);
    					}
    				}
    				j=0;
    			}
    			else if(j==ks) {
    				if(startwert<=ln) {
    					iu.add(new Index((k+startwert)*pixel,"",false,false));
    				}
    				else {
    					if(k*pixel>0) {
    						iu.add(new Index(k*pixel,"",false,false));
    					}
    				}
    			}
    			else if (j>0&&j<ls&&scal<2){
    				if(startwert<=ln) {
    					iu.add(new Index((k+startwert)*pixel,"",false,true));
    				}
    				else {
    					if(k*pixel>0) {
    						iu.add(new Index(k*pixel,"",false,true));
    					}
    				}
    			}
    			j++;k++;
    		}
    		
    		/*if(!io.isEmpty()&&!iu.isEmpty()) {
    			System.out.println("IO= "+io.get(0).index+"Anzahl= "+io.size()+" IU= "+iu.get(0).index+" Anzahl= "+iu.size()
    			+" Anzahl Punkte= "+points.size()+" Zähler= "+zaehler+" Startwert= "+startwert+" LN= "+ln+" LS= "+ls
    			+" Schleifenstart= "+schleifenstart+" Skalierung= "+SCALIERUNG);
    		}*/
    	}
    	
    	/*
    	 * Wenn Scalierung geändert wird, wird der Schleifenstart, 
    	 * wenn er über die Grenze ist, auf einen darstellbaren Wert geändert.
    	 */
    	private static void pruefeSchleifenstart() {
    		
    		while(schleifenstart*10*Math.pow(2, scal)+10>worte.size()){
    			schleifenstart--;
    		}
    	}
    	
    	private void setzePanels() {
    		this.dialog.setBounds(Fenster.START_X_FRAME, Fenster.START_Y_FRAME, 
    				Fenster.FENSTERBREITE, y_start+6*va+50+y_abstaende*3+bedienelemente+40);
    		this.jp_scalierung.setBounds(5,this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_scalierung_br, _hoehepanels);
    		this.jp_schnitt.setBounds(this.jp_scalierung.getLocation().x+this.jp_scalierung.getWidth()+5,
    				this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_schnitt_br, _hoehepanels);
    		this.jp_streak.setBounds(this.jp_schnitt.getLocation().x+this.jp_schnitt.getWidth()+5,
    				this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_bereich_br, _hoehepanels);
    		this.jp_bereich.setBounds(this.jp_streak.getLocation().x+this.jp_streak.getWidth()+5,
    				this.jp_diagramm.getLocation().y+this.jp_diagramm.getHeight()+5, _jp_bereich_br, _hoehepanels);
    		
    		dialog.repaint();
    	}
    
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		if (e.getSource()==this.jrb_scalierung[0]) {
    			pixel=10;
    			scal=SCAR_1;
    			pruefeSchleifenstart();
    			this.zeichneDiagramm();
    		}
    		
    		if (e.getSource()==this.jrb_scalierung[1]) {
    			pixel=5;
    			scal=SCAR_2;
    			pruefeSchleifenstart();
    			this.zeichneDiagramm();
    		}
    
    
    		if (e.getSource()==this.jrb_scalierung[2]) {
    			pixel=2;
    			scal=SCAR_3;
    			pruefeSchleifenstart();
    			this.zeichneDiagramm();
    		}
    
    
    		if (e.getSource()==this.jrb_scalierung[3]) {
    			pixel=1;
    			scal=SCAR_4;
    			pruefeSchleifenstart();
    			this.zeichneDiagramm();
    		}
    		
    		if (e.getSource()==this.jcb_schnitt_komplett) {
    			if(!d_al)d_al=true;
    			else d_al=false;
    			this.zeichneDiagramm();
    		}
    		
    		if (e.getSource()==this.jcb_schnitt_aktuellerStreak) {
    
    
    			if(!d_as)d_as=true;
    			else d_as=false;
    			
    			if(d_as_d>0) {
    			this.zeichneDiagramm();
    			}
    		}
    		
    		if (e.getSource()==this.jcb_schnitt_verlauf) {
    			if(!d_av)d_av=true;
    			else d_av=false;
    			this.zeichneDiagramm();
    		}
    		
    		if (e.getSource()==this.jcb_wortloesungen) {
    			if(!d_vw)d_vw=true;
    			else d_vw=false;
    			this.zeichneDiagramm();
    		}
    		
    		if (e.getSource()==this.jb_nord) {
    			va+=10;
    			if(va>80)va=80;
    			this.zeichneDiagramm();
    			this.setzePanels();			
    		}
    		
    		if (e.getSource()==this.jb_sued) {
    			va-=10;
    			if(va<20)va=20;
    			this.zeichneDiagramm();
    			this.setzePanels();			
    		}
    
    
    		if (e.getSource()==this.jb_center) {
    			va=_RESET;
    			schleifenstart=0;
    			this.zeichneDiagramm();
    			this.setzePanels();			
    		}
    		
    		if (e.getSource()==this.jb_ost) {
    			schleifenstart++;
    			if(schleifenstart*10*Math.pow(2, scal)+10>worte.size())schleifenstart--;
    			
    			this.zeichneDiagramm();
    			dialog.repaint();
    		}
    
    
    		if (e.getSource()==this.jb_west) {
    			schleifenstart--;
    			if(schleifenstart<0)schleifenstart++;
    			
    			this.zeichneDiagramm();
    			dialog.repaint();
    		}
    
    
    		if  (e.getSource()==this.jcb_streak) {
    
    
    			if(this.jcb_streak.getSelectedIndex()==-1) {
    				this.jcb_streak.setSelectedIndex(BearbeiteVersuche.getAnzahlMisserfolge());
    				gezeigterversuch=this.jcb_streak.getSelectedIndex();
    			}
    		else {
    			gezeigterversuch=this.jcb_streak.getSelectedIndex();
    		}
    			erstelleBalkenStreak(gezeigterversuch);
    			erstelleBalkenneu();
    			
    		}
    	}
    	
    	private static class ZeichneDiagramm extends JPanel{
    		/**
    		 * 
    		 */
    		private static final long serialVersionUID = 1L;
    		private int x=0;
    		private int y=0;
    		private int breite=0;
    		private int hoehe=0;
    
    
    		ZeichneDiagramm(int x, int y, int breite, int hoehe){
    			super();
    			this.x=x;
    			this.y=y;
    			this.breite=breite-20;
    			this.hoehe=hoehe-20;
    
    
    			setBounds(x, y, breite, hoehe);
    		}
    		
    		private int getMittig(String wort) {
    			return wort.length()*3;
    		}
    		
            @Override
            protected void paintComponent(final Graphics g) {
                super.paintComponent(g);
                
        		int y=y_start; //hoehe bei 6 Versuchen
        		int x=this.x+_lr;
                
                g.setColor(Color.WHITE);
                g.fillRect(this.x, this.y, this.breite-3, this.hoehe+15);
    
    
                for(int i=1;i<7;i++) {
                	if(i==3){
                		g.setColor(Color.GREEN);
                    	g.drawLine(x, y+1, this.breite-_rr, y+1);
                    	g.drawLine(x, y-1, this.breite-_rr, y-1);
                	}
                	else {
                		g.setColor(Color.BLACK);
                	}
                	g.drawLine(x, y, this.breite-_rr, y);
                	y+=va;
                }
    
    
               // von jetzt an ist y=y_start+6*va = hoehe indexlinie unten und hoehe nicht geloest Linie unten
    
    
                ArrayList<Integer>nichtgeloest=new ArrayList<>();
                
    
    
                for(int i=0;i<points.size()-1;i++) {
                	if(x+pixel+points.get(i+1).getX()<this.breite-_rr) {
                	if(points.get(i+1).getY()!=-1&&points.get(i).getY()!=-1) {
                		if(d_vw) {
                			g.setColor(Color.BLUE);
                			
                			
                			g.drawLine(x+pixel+points.get(i).getX(), points.get(i).getY(), 
                				   x+pixel+points.get(i+1).getX(), points.get(i+1).getY());
                			
                    		if(i+1==points.size()-1) {
                				g.fillOval(x+2*pixel+points.get(i+1).getX()-pixel/3-pixel, points.get(i+1).getY()-pixel/3, 
                    					pixel/2+1, pixel/2+1);
                				g.fillOval(x+2*pixel+points.get(i).getX()-pixel/3-pixel, points.get(i).getY()-pixel/3, 
                    					pixel/2+1, pixel/2+1);
                    		}
                        		else {
                   				g.fillOval(x+pixel+points.get(i+1).getX()-pixel/3-pixel, points.get(i).getY()-pixel/3, 
                    					pixel/2+1, pixel/2+1);
                        		}
                		}
                		
                		if(d_av) {
                			g.setColor(Color.BLACK);
                			g.drawLine(x+pixel+points.get(i).getX(),verlauf.get(i),
                					x+pixel+points.get(i+1).getX(),verlauf.get(i+1));
                			g.drawLine(x+pixel+points.get(i).getX(),verlauf.get(i)-1,
                					x+pixel+points.get(i+1).getX(),verlauf.get(i+1)-1);
                		}
                		
                	}
                	else if(points.get(i+1).getY()==-1&&points.get(i).getY()!=-1) {
                		if(d_vw) {
                			g.setColor(Color.BLUE);
                			g.fillOval(x+2*pixel+points.get(i).getX()-pixel/3-pixel, points.get(i).getY()-pixel/3, 
                					pixel/2+1, pixel/2+1);
                		}
        				
                		if(d_vw) {
                			g.setColor(Color.RED);
                			g.drawLine(x+points.get(i+1).getX()+pixel, y_start-20, x+points.get(i+1).getX()+pixel, y);
                		}
                		nichtgeloest.add(x+points.get(i+1).getX()+pixel);
                	}
                	else if(points.get(i).getY()==-1&&points.get(i+1).getY()!=-1) {
                		if(d_vw) {
                			g.setColor(Color.BLUE);
                			g.fillOval(x+2*pixel+points.get(i+1).getX()-pixel/3-pixel, points.get(i+1).getY()-pixel/3, 
                					pixel/2+1, pixel/2+1);
                		}
                	}
                	}
                }
                
                g.setColor(Color.BLACK);
                String hilf="Y-Achse -> Abstand Versuche: "+Integer.toString(va)+" Pixel";
                g.drawString(hilf, x/2, y+40);
                hilf="Maßstab: "+pixel+" Pixel / Wort";
                g.drawString(hilf, this.breite-150, y+40);
                
                //index oben und unten
            	int nullstelle=0; //darstellung index unten = aktueller Streak, Startpunkt
            	int mittig=6; //passendes raster zur mittigen Darstellung der Ziffern zu den Rasterlinien
    
    
            	g.setColor(Color.BLACK);
            	g.drawLine(x, y_start-60, this.breite-_rr, y_start-60); //index oben
            	
            	
            	int k=Worte.getIndexLetzteNichtgeloest()-Worte.getIndexLetzteNichtgeloest()%(10*(int)Math.pow(2, scal));
            	int x2=k*pixel;
            	
            	if(!nichtgeloest.isEmpty()) {
            		nullstelle=nichtgeloest.get(nichtgeloest.size()-1);
            		g.drawLine(nullstelle, y, this.breite-_rr, y);//index unten mit aktuellen streak
            	}
            	else {
            		if(!iu.isEmpty()) {
            			g.drawLine(x, y, this.breite-_rr, y);//index unten mit aktuellen streak ohne fehlversuch
            		}
            	}
    
    
            	
            	for(Index index:io) {
            		if(index.getLang()) {
            			mittig=getMittig(index.getScala());
            			g.drawString(index.getScala(), x+index.getIndex()-mittig, y_start-60+_z);
           				g.drawLine(x+index.getIndex(), y_start-60, x+index.getIndex(), y_start-60-_ls);
            		}
            		else if(index.getKurz()){
            			g.drawLine(x+index.getIndex(), y_start-60, x+index.getIndex(), y_start-60-_ks/2);
            		}
            		else {
            			g.drawLine(x+index.getIndex(), y_start-60, x+index.getIndex(), y_start-60-_ks);
            		}
            	}
            	
            	for(Index index:iu) {
            		//if(!iu.isEmpty()&&x+index.getIndex()>=io.get(0).index) {
            		if(index.getIndex()<this.breite-2*_rr) {
            			if(index.getLang()) {
            				mittig=getMittig(index.getScala());
            					g.drawString(index.getScala(), x+index.getIndex()-mittig, y+_z);
            					g.drawLine(x+index.getIndex(), y-_ls, x+index.getIndex(), y);
            			}
            			else if(index.getKurz()){
            				g.drawLine(x+index.getIndex(), y-_ks/2, x+index.getIndex(), y);
            			}
            			else {
            					g.drawLine(x+index.getIndex(), y-_ks, x+index.getIndex(), y);
            			}
            		}
            		//System.out.println("Index= "+index.getIndex()+" X= "+x);
            		//}
            	}
    
    
                //pfeilmarker
                int p=points.get(points.size()-1).getX();
            	
            	if(p+x+pixel-5<this.breite-_rr) {
            		int[]ko_x= {x+p+pixel-5,x+p+pixel,x+p+pixel+5,x+p+pixel-5};
            		int[]ko_y= {y-_ls-9, y-_ls-_ls,y-_ls-9,y-_ls-9};
            		
            		//pfeil index streak aktuell
            		g.setColor(Color.BLUE);
           			g.drawLine(x+p+pixel, y-_ls-_ls/2, x+p+pixel, y);
           			g.fillPolygon(ko_x, ko_y, ko_x.length);
            	
            		//pfeil index über alles
            		int[]ko_y2= {y_start+_ls+9-60, y_start+_ls+_ls-60,y_start+_ls+9-60,y_start+_ls+9-60};
            		g.fillPolygon(ko_x, ko_y2, ko_x.length);
            		g.drawLine(x+p+pixel, y_start+_ls+9-60, x+p+pixel, y_start-60);
            	}
            	
            	
            	//Anzahl Versuche Darstellung links und rechts
        		g.setColor(Color.BLACK);
        		for(int i=1;i<7;i++) {
        			g.drawString(Integer.toString(i), x/2, y-i*va+3);
        			g.drawString(Integer.toString(i), this.breite-_rr/2, y-i*va+3);
        		}
    
    
            	//durchschnitt Lösungen aktueller Streak
            	if(d_as) {
                	g.setColor(Color.ORANGE);
                	if(nullstelle>x) {
                		g.fillRect(nullstelle+1, (int)(y-d_as_d*va)-1, this.breite-_rr-nullstelle-1, 3);
                	}
                	else {
                		g.fillRect(x, (int)(y-d_as_d*va)-1, this.breite-_rr-this.x-_lr-x2, 3);
                	}
                }
                
            	//durchschnitt Lösungen über alle Worte
                if(d_al) {
                	g.setColor(Color.MAGENTA);
                	g.fillRect(x+1, (int)(y-BearbeiteVersuche.getDurchschnitt()*va)-1, this.breite-_rr-this.x-_lr-1, 3);
                }
                
            }
    	}
    	
    	private static class Index {
    		
    		int index=0;
    		String scala="";
    		boolean lang=false;
    		boolean kurz=false;
    		
    		public Index(int i, String s,boolean l, boolean k) {
    			
    			this.index=i;
    			this.scala=s;
    			this.lang=l;
    			this.kurz=k;
    		}
    		
    		protected int getIndex() {
    			return this.index;
    		}
    		
    		protected String getScala() {
    			return this.scala;
    		}
    		
    		protected boolean getLang() {
    			return this.lang;
    		}
    		
    		protected boolean getKurz() {
    			return this.kurz;
    		}
    	}	
    }
    Class Grosser_Filter
    Code:
    package Worte;
    
    
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    
    
    import javax.swing.BorderFactory;
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    public class Grosser_Filter implements ActionListener{
    	
    	JFrame frame;
    	JButton jb_ok;
    	JButton jb_reset;
    	JButton jb_letzte;
    	
    	private JCheckBox [] jcb_global;
    	private JCheckBox [] jcb_eins;
    	private JCheckBox [] jcb_zwei;
    	private JCheckBox [] jcb_drei;
    	private JCheckBox [] jcb_vier;
    	private JCheckBox [] jcb_fuenf;
    	
    	private JCheckBox [] jcb_eins_f;
    	private JCheckBox [] jcb_zwei_f;
    	private JCheckBox [] jcb_drei_f;
    	private JCheckBox [] jcb_vier_f;
    	private JCheckBox [] jcb_fuenf_f;
    	
    	private ArrayList<String> grosserFilter=new ArrayList<>();
    
    
    	
    	private final static int START_X_FRAME=250;
    	private final static int START_Y_FRAME=50;
    	private final static int FENSTERBREITE=955;
    	private final static int FENSTERHOEHE=650;
    	//private final static int PANELBREITE=280;
    	
    	private static int zaehler=0;
    	private final static int GRUPPEN=11;
    	private final static int GRENZE=15;
    	private ArrayList<Zustand> zustand=new ArrayList<>();
    	
    	public Grosser_Filter() {
    		this.frame=new JFrame("Großer Filter");
    		this.frame.setLayout(new FlowLayout(FlowLayout.LEFT));
    		this.frame.setBounds(START_X_FRAME, START_Y_FRAME, FENSTERBREITE, FENSTERHOEHE);
    		this.frame.setResizable(false);
    		this.frame.setAlwaysOnTop(true);
    		
    		JPanel[] panel=new JPanel[7];
    		
    		for(int i=0;i<panel.length;i++) {
    			panel[i]=new JPanel(null);
    			panel[i].setLayout(new FlowLayout(FlowLayout.LEFT));
    			panel[i].setPreferredSize(new Dimension(120,600));
    			if(i!=0 && i!=6) {
    				panel[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), Integer.toString(i)));
    				panel[i].setLayout(new FlowLayout(FlowLayout.LEFT));
    
    
    			}
    			else if (i==0) {
    				panel[i].setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Global"));
    			}
    			else if(i==6) {
    				panel[i].setLayout(new BoxLayout(panel[i],BoxLayout.Y_AXIS));
    			}
    		}
    
    
    		jcb_global=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_eins=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_zwei=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_drei=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_vier=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_fuenf=new JCheckBox[Wordle.ALPHABET.wert()];
    		
    		jcb_eins_f=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_zwei_f=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_drei_f=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_vier_f=new JCheckBox[Wordle.ALPHABET.wert()];
    		jcb_fuenf_f=new JCheckBox[Wordle.ALPHABET.wert()];
    
    
    		JLabel jl_global=new JLabel("Nicht vorhanden");
    		jl_global.setPreferredSize(new Dimension(100,15));
    		panel[0].add(jl_global);
    		JLabel jl_eins=new JLabel("möglich");
    		jl_eins.setPreferredSize(new Dimension(100,15));
    		panel[1].add(jl_eins);
    		JLabel jl_zwei=new JLabel("möglich");
    		jl_zwei.setPreferredSize(new Dimension(100,15));
    		panel[2].add(jl_zwei);
    		JLabel jl_drei=new JLabel("möglich");
    		jl_drei.setPreferredSize(new Dimension(100,15));
    		panel[3].add(jl_drei);
    		JLabel jl_vier=new JLabel("möglich");
    		jl_vier.setPreferredSize(new Dimension(100,15));
    		panel[4].add(jl_vier);
    		JLabel jl_fuenf=new JLabel("möglich");
    		jl_fuenf.setPreferredSize(new Dimension(100,15));
    		panel[5].add(jl_fuenf);
    
    
    		for(int i=0;i<Wordle.ALPHABET.wert();i++) {
    			jcb_global[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)));
    			jcb_global[i].addActionListener(this);
    			jcb_eins[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)),true);
    			jcb_eins[i].addActionListener(this);
    			jcb_zwei[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)),true);
    			jcb_zwei[i].addActionListener(this);
    			jcb_drei[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)),true);
    			jcb_drei[i].addActionListener(this);
    			jcb_vier[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)),true);
    			jcb_vier[i].addActionListener(this);
    			jcb_fuenf[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)),true);
    			jcb_fuenf[i].addActionListener(this);
    			
    			jcb_global[i].setPreferredSize(new Dimension(37,15));
    			jcb_eins[i].setPreferredSize(new Dimension(37,15));
    			jcb_zwei[i].setPreferredSize(new Dimension(37,15));
    			jcb_drei[i].setPreferredSize(new Dimension(37,15));
    			jcb_vier[i].setPreferredSize(new Dimension(37,15));
    			jcb_fuenf[i].setPreferredSize(new Dimension(37,15));
    			
    			panel[0].add(jcb_global[i]);
    			panel[1].add(jcb_eins[i]);
    			panel[2].add(jcb_zwei[i]);
    			panel[3].add(jcb_drei[i]);
    			panel[4].add(jcb_vier[i]);
    			panel[5].add(jcb_fuenf[i]);
    		}
    		
    		JLabel jl_eins_f=new JLabel("ist gleich");
    		jl_eins_f.setPreferredSize(new Dimension(100,15));
    		panel[1].add(jl_eins_f);
    		JLabel jl_zwei_f=new JLabel("ist gleich");
    		jl_zwei_f.setPreferredSize(new Dimension(100,15));
    		panel[2].add(jl_zwei_f);
    		JLabel jl_drei_f=new JLabel("ist gleich");
    		jl_drei_f.setPreferredSize(new Dimension(100,15));
    		panel[3].add(jl_drei_f);
    		JLabel jl_vier_f=new JLabel("ist gleich");
    		jl_vier_f.setPreferredSize(new Dimension(100,15));
    		panel[4].add(jl_vier_f);
    		JLabel jl_fuenf_f=new JLabel("ist gleich");
    		jl_fuenf_f.setPreferredSize(new Dimension(100,15));
    		panel[5].add(jl_fuenf_f);
    
    
    		for(int i=0;i<Wordle.ALPHABET.wert();i++) {
    			jcb_eins_f[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)));
    			jcb_eins_f[i].addActionListener(this);
    			jcb_zwei_f[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)));
    			jcb_zwei_f[i].addActionListener(this);
    			jcb_drei_f[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)));
    			jcb_drei_f[i].addActionListener(this);
    			jcb_vier_f[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)));
    			jcb_vier_f[i].addActionListener(this);
    			jcb_fuenf_f[i]=new JCheckBox(String.valueOf((char)(i+Tools.Ascii.ASCII_A)));
    			jcb_fuenf_f[i].addActionListener(this);
    			
    			jcb_eins_f[i].setPreferredSize(new Dimension(37,15));
    			jcb_zwei_f[i].setPreferredSize(new Dimension(37,15));
    			jcb_drei_f[i].setPreferredSize(new Dimension(37,15));
    			jcb_vier_f[i].setPreferredSize(new Dimension(37,15));
    			jcb_fuenf_f[i].setPreferredSize(new Dimension(37,15));
    			
    			panel[1].add(jcb_eins_f[i]);
    			panel[2].add(jcb_zwei_f[i]);
    			panel[3].add(jcb_drei_f[i]);
    			panel[4].add(jcb_vier_f[i]);
    			panel[5].add(jcb_fuenf_f[i]);
    		}
    
    
    		panel[6].setPreferredSize(new Dimension(170,590));
    		panel[6].add(new JLabel ("Global:"));
    		panel[6].add(new JLabel ("Buchstaben nicht im"));
    		panel[6].add(new JLabel ("gesuchten Wort."));
    		panel[6].add(Box.createRigidArea(new Dimension(0,10)));
    		panel[6].add(new JLabel ("1-5 möglich:"));
    		panel[6].add(new JLabel ("Mögliche Buchstaben"));
    		panel[6].add(new JLabel ("an Stelle X."));
    		panel[6].add(Box.createRigidArea(new Dimension(0,10)));
    		panel[6].add(new JLabel ("1-5 Ist gleich:"));
    		panel[6].add(new JLabel ("Buchstabe an Stelle X"));
    		panel[6].add(Box.createRigidArea(new Dimension(0,10)));
    		panel[6].add(new JLabel ("Letzte:"));
    		panel[6].add(new JLabel ("Ein Schritt zurück"));
    		panel[6].add(Box.createRigidArea(new Dimension(0,10)));
    		panel[6].add(new JLabel ("Reset:"));
    		panel[6].add(new JLabel ("Filter auf Anfang setzen"));
    
    
    		panel[6].add(Box.createVerticalGlue());
    
    
    		this.jb_letzte=new JButton("Letzte");
    		this.jb_letzte.setMargin(new Insets(2,8,2,8));
    		this.jb_letzte.addActionListener(this);
    		this.jb_reset=new JButton("Reset");
    		this.jb_reset.setMargin(new Insets(2,9,2,9));
    		this.jb_reset.addActionListener(this);
    		this.jb_ok=new JButton("Filtern");
    		this.jb_ok.setMargin(new Insets(2,8,2,8));
    		this.jb_ok.addActionListener(this);
    		panel[6].add(jb_letzte);
    		panel[6].add(Box.createRigidArea(new Dimension(0,20)));
    		panel[6].add(jb_reset);
    		panel[6].add(Box.createRigidArea(new Dimension(0,5)));
    		panel[6].add(jb_ok);
    		
    		for(int i=0;i<panel.length;i++) {
    			frame.add(panel[i]);
    		}
    
    
    		addiereZustaende();
    		this.jb_letzte.setEnabled(false);
    		this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		this.frame.setVisible(true);
    	}
    	
    	private void erstelleWortliste() {
    		ArrayList<String> hilf=new ArrayList<>();
    		char c;
    		grosserFilter.clear();
    		for(Wort wort:Worte.wortstatistik) {
    			grosserFilter.add(wort.getwort());
    			hilf.add(wort.getwort());
    		}
    		
    		for(String wort:grosserFilter) {
    			for(int i=0;i<jcb_global.length;i++) {
    				if(jcb_global[i].isSelected()) {
    					c=(char)(i+Tools.Ascii.ASCII_A);
    					if(wort.contains(""+c)){
    							hilf.remove(wort);
    					}
    				}
    			}
    		}
    
    
    		grosserFilter.clear();
    		for(String wort:hilf) {
    			grosserFilter.add(wort);
    		}
    
    
    		for(int i=0;i<jcb_eins.length;i++) {
    			for(String wort:grosserFilter) {
    				c=(char)(i+Tools.Ascii.ASCII_A);
    				if(!jcb_eins[i].isSelected()) {
    					if(wort.charAt(Wordle.STELLE_1.wert())==c){
    							hilf.remove(wort);
    					}
    				}
    				if(!jcb_zwei[i].isSelected()) {
    					if(wort.charAt(Wordle.STELLE_2.wert())==c){
    						hilf.remove(wort);
    					}
    				}
    				if(!jcb_drei[i].isSelected()) {
    					if(wort.charAt(Wordle.STELLE_3.wert())==c){
    						hilf.remove(wort);
    					}
    				}
    				if(!jcb_vier[i].isSelected()) {
    					if(wort.charAt(Wordle.STELLE_4.wert())==c){
    						hilf.remove(wort);
    					}
    				}
    				if(!jcb_fuenf[i].isSelected()) {
    					if(wort.charAt(Wordle.STELLE_5.wert())==c){
    						hilf.remove(wort);
    					}
    				}
    			}
    		}
    		grosserFilter.clear();
    		for(String wort:hilf) {
    			grosserFilter.add(wort);
    		}
    		
    		grosserFilter.sort(null);
    	}
    	
    	private void addiereZustaende() {
    		for(int i=0;i<Wordle.ALPHABET.wert();i++) {
    			zustand.add(new Zustand(jcb_global[i].isSelected(),jcb_global[i].isEnabled()));
    			zustand.add(new Zustand(jcb_eins[i].isSelected(),jcb_eins[i].isEnabled()));
    			zustand.add(new Zustand(jcb_eins_f[i].isSelected(),jcb_eins_f[i].isEnabled()));
    			zustand.add(new Zustand(jcb_zwei[i].isSelected(),jcb_zwei[i].isEnabled()));
    			zustand.add(new Zustand(jcb_zwei_f[i].isSelected(),jcb_zwei_f[i].isEnabled()));
    			zustand.add(new Zustand(jcb_drei[i].isSelected(),jcb_drei[i].isEnabled()));
    			zustand.add(new Zustand(jcb_drei_f[i].isSelected(),jcb_drei_f[i].isEnabled()));
    			zustand.add(new Zustand(jcb_vier[i].isSelected(),jcb_vier[i].isEnabled()));
    			zustand.add(new Zustand(jcb_vier_f[i].isSelected(),jcb_vier_f[i].isEnabled()));
    			zustand.add(new Zustand(jcb_fuenf[i].isSelected(),jcb_fuenf[i].isEnabled()));
    			zustand.add(new Zustand(jcb_fuenf_f[i].isSelected(),jcb_fuenf_f[i].isEnabled()));
    		}
    		
    		zaehler++;
    		if(!this.jb_letzte.isEnabled()) {
    			this.jb_letzte.setEnabled(true);
    		}
    		if(zaehler>GRENZE) {
    			for(int i=0;i<GRUPPEN*Wordle.ALPHABET.wert();i++) {
    				zustand.remove(0);
    			}
    			zaehler--;
    		}
    	}
    	
    	private void setzeZustandzurueck() {
    		if(zaehler>1) {
    			zaehler--;
    		}
    		if(zaehler==1) {
    			jb_letzte.setEnabled(false);
    		}
    		
    		int start=zustand.size()-GRUPPEN*Wordle.ALPHABET.wert()*2;
    
    
    		for(int i=0;i<Wordle.ALPHABET.wert();i++) {
    			jcb_global[i].setSelected(zustand.get(start).getHaken());
    			jcb_global[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_eins[i].setSelected(zustand.get(start).getHaken());
    			jcb_eins[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_eins_f[i].setSelected(zustand.get(start).getHaken());
    			jcb_eins_f[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_zwei[i].setSelected(zustand.get(start).getHaken());
    			jcb_zwei[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_zwei_f[i].setSelected(zustand.get(start).getHaken());
    			jcb_zwei_f[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_drei[i].setSelected(zustand.get(start).getHaken());
    			jcb_drei[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_drei_f[i].setSelected(zustand.get(start).getHaken());
    			jcb_drei_f[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_vier[i].setSelected(zustand.get(start).getHaken());
    			jcb_vier[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_vier_f[i].setSelected(zustand.get(start).getHaken());
    			jcb_vier_f[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_fuenf[i].setSelected(zustand.get(start).getHaken());
    			jcb_fuenf[i].setEnabled(zustand.get(start++).getNutzbar());
    			jcb_fuenf_f[i].setSelected(zustand.get(start).getHaken());
    			jcb_fuenf_f[i].setEnabled(zustand.get(start++).getNutzbar());
    		}
    		for(int i=0;i<GRUPPEN*Wordle.ALPHABET.wert();i++) {
    				zustand.remove(zustand.size()-1);
    		}		
    	}
    	
    	private void resetFilter() {
    		zaehler=0;
    		zustand.clear();
    		for(int i=0;i<jcb_global.length;i++) {
    			jcb_global[i].setEnabled(true);
    			jcb_global[i].setSelected(false);
    			
    			jcb_eins[i].setEnabled(true);
    			jcb_eins[i].setSelected(true);
    			
    			jcb_eins_f[i].setEnabled(true);
    			jcb_eins_f[i].setSelected(false);
    			
    			jcb_zwei[i].setEnabled(true);
    			jcb_zwei[i].setSelected(true);
    			
    			jcb_zwei_f[i].setEnabled(true);
    			jcb_zwei_f[i].setSelected(false);
    			
    			jcb_drei[i].setEnabled(true);
    			jcb_drei[i].setSelected(true);
    			
    			jcb_drei_f[i].setEnabled(true);
    			jcb_drei_f[i].setSelected(false);
    
    
    			jcb_vier[i].setEnabled(true);
    			jcb_vier[i].setSelected(true);
    			
    			jcb_vier_f[i].setEnabled(true);
    			jcb_vier_f[i].setSelected(false);
    
    
    			jcb_fuenf[i].setEnabled(true);
    			jcb_fuenf[i].setSelected(true);
    			
    			jcb_fuenf_f[i].setEnabled(true);
    			jcb_fuenf_f[i].setSelected(false);
    		}
    		
    		addiereZustaende();
    		jb_letzte.setEnabled(false);
    	}
    	
    	private void setzeJCB(JCheckBox[]jcb_f,JCheckBox[]jcb,int i) {
    		if(jcb_f[i].isSelected()) {
    			for(int j=0;j<Wordle.ALPHABET.wert();j++) {
    				jcb[j].setSelected(false);
    				jcb[j].setEnabled(false);
    			}
    			jcb[i].setSelected(true);
    			jcb[i].setEnabled(true);
    			this.jcb_global[i].setSelected(false);
    			this.jcb_global[i].setEnabled(false);
    		}
    		else {
    			for(int j=0;j<Wordle.ALPHABET.wert();j++) {
    				if(!jcb_global[j].isSelected()) {
    					jcb[j].setEnabled(true);
    					jcb[j].setSelected(true);
    				}
    			}
    			jcb[i].setEnabled(true);
    			this.jcb_global[i].setEnabled(true);
    		}
    	}
    	
    	private void setzeJCBItem(JCheckBox[]jcb_f,JCheckBox[]jcb,int i,boolean aktiv,boolean isSelected) {
    		if(isSelected) {
    			jcb[i].setSelected(aktiv);
    			jcb[i].setEnabled(aktiv);
    
    
    			jcb_f[i].setSelected(aktiv);
    			jcb_f[i].setEnabled(aktiv);
    		}
    		else {
    			jcb[i].setEnabled(!aktiv);
    			jcb_f[i].setEnabled(!aktiv);
    		}
    	}
    
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		boolean isSelected=false;
    		
    		if (e.getSource()==this.jb_ok) {
    			erstelleWortliste();
    			new GrosserFilterListe(grosserFilter);
    		}
    		
    		else if (e.getSource()==this.jb_letzte) {
    			setzeZustandzurueck();
    		}
     
    		
    		else if (e.getSource()==this.jb_reset) {
    			resetFilter();
    		}
    		
    		else {
    			for(int i=0;i<Wordle.ALPHABET.wert();i++) {
    				if (e.getSource()==this.jcb_global[i]) {
    					isSelected=this.jcb_global[i].isSelected();
    					setzeJCBItem(jcb_eins_f, jcb_eins, i, false,isSelected);
    					setzeJCBItem(jcb_zwei_f, jcb_zwei, i, false,isSelected);
    					setzeJCBItem(jcb_drei_f, jcb_drei, i, false,isSelected);
    					setzeJCBItem(jcb_vier_f, jcb_vier, i, false,isSelected);
    					setzeJCBItem(jcb_fuenf_f, jcb_fuenf, i, false,isSelected);
    				}
    			
    				if (e.getSource()==this.jcb_eins_f[i]) {
    					setzeJCB(jcb_eins_f, jcb_eins, i);
    				}
    			
    				if (e.getSource()==this.jcb_zwei_f[i]) {
    					setzeJCB(jcb_zwei_f, jcb_zwei, i);
    				}
    			
    				if (e.getSource()==this.jcb_drei_f[i]) {
    					setzeJCB(jcb_drei_f, jcb_drei, i);
    				}
    			
    				if (e.getSource()==this.jcb_vier_f[i]) {
    					setzeJCB(jcb_vier_f, jcb_vier, i);
    				}
    
    
    				if (e.getSource()==this.jcb_fuenf_f[i]) {
    					setzeJCB(jcb_fuenf_f, jcb_fuenf, i);
    				}
    			}
    			
    			addiereZustaende();
    		}
    		//System.out.println("Zaehler= "+zaehler+"Anzahl= "+zustand.size());
    	}
    
    
    	private static class Zustand{
    			private boolean haken=false;
    			private boolean nutzbar=false;
    			
    			public Zustand(boolean haken,boolean nutzbar) {
    				this.haken=haken;
    				this.nutzbar=nutzbar;
    			}
    
    
    			protected boolean getHaken() {
    				return this.haken;
    			}
    
    
    			protected boolean getNutzbar() {
    				return this.nutzbar;
    			}
    		}
    }
    Class GrosserFilterListe
    Code:
    package Worte;
    
    
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableColumn;
    
    
    import Renderer.TableWorteSortiertRenderer;
    
    
    public class GrosserFilterListe implements ActionListener{
    	JFrame frame;
    	JPanel panel;
    	JButton jb_schliessen;
    	
    	JTable jt_table;
    	private DefaultTableModel dtm_worte_sortiert;
    	private ArrayList<String> worte;
    	
    	private final static int START_X_FRAME=1210;
    	private final static int START_Y_FRAME=50;
    	private final static int FENSTERBREITE=280;
    	private final static int FENSTERHOEHE=650;
    
    
    	
    	public GrosserFilterListe(ArrayList<String> worte) {
    
    
    		this.worte=new ArrayList<>();
    		
    		for(String wort:worte) {
    			this.worte.add(wort);
    		}
    		
    		this.frame=new JFrame("Großer Filter Liste");
    		this.frame.setBounds(START_X_FRAME, START_Y_FRAME, FENSTERBREITE, FENSTERHOEHE);
    		this.frame.setResizable(false);
    		this.frame.setAlwaysOnTop(true);
    		
    		this.panel=new JPanel(null);
    		this.panel.setBounds(5, 5, 290, 640);
    		
    		erstelle_sortierte_WortTabelle();
    		
    		if(!worte.isEmpty()) {
    			aktualisiereTabelle();
    		}
    		
    		jb_schliessen=new JButton("Schliessen");
    		jb_schliessen.setBounds(140, 575, 100, 25);
    		jb_schliessen.addActionListener(this);
    		
    		this.panel.add(jb_schliessen);
    		
    		this.frame.add(panel);
    		
    		this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		this.frame.setVisible(true);
    
    
    		
    	}
    	
    	private void erstelle_sortierte_WortTabelle() {
    		Worte.sortiereWorte();
    		
    		String[] titel={"Nr. ","Worte sortiert","Anz."};
    		
    		this.dtm_worte_sortiert=new DefaultTableModel(titel,0);
    		this.jt_table=new JTable(this.dtm_worte_sortiert);
    		
    		for(int i=0;i<this.worte.size();i++) {
    			this.addRow(dtm_worte_sortiert);
    		}
    		this.jt_table.setFont(new Font("Serif",Font.PLAIN,16));
    		
    		this.jt_table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    		TableColumn nummer = this.jt_table.getColumnModel().getColumn(Wordle.COL1.wert()); 
    		TableColumn worte = this.jt_table.getColumnModel().getColumn(Wordle.COL2.wert());
    		TableColumn nummerbuchstabe = this.jt_table.getColumnModel().getColumn(Wordle.COL3.wert());
    		nummer.setPreferredWidth(40);
    		worte.setPreferredWidth(80);
    		nummerbuchstabe.setPreferredWidth(40);
    
    
    		JScrollPane scrollbar=new JScrollPane(this.jt_table,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
    				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    		scrollbar.setBounds(30, 10, 200, 560);
    		
    		this.panel.add(scrollbar);
    	}
    	
    	private void addRow(DefaultTableModel model) {
    		int anzahlspalten=model.getColumnCount();
    		model.addRow(new Object[anzahlspalten]);
    	}
    
    
    private void aktualisiereTabelle() {
    		for(int i=0;i<worte.size();i++) {
    			this.jt_table.setValueAt(i+1, i, Wordle.COL1.wert());
    			this.jt_table.setValueAt(this.worte.get(i), i, Wordle.COL2.wert());
    		}
    		
    		this.hervorheben();
    	}
    	
    	private void hervorheben() {
    		char wert1,wert2;
    		int zaehler=1;
    		
    		for(int i=1;i<worte.size();i++) {
    			this.jt_table.setValueAt("", i-1, Wordle.COL3.wert());//anzahl jeweiliger Buchstaben auf "" setzen
    			wert1=worte.get(i-1).charAt(0);
    			wert2=worte.get(i).charAt(0);
    			zaehler++;
    			if(wert2>wert1) {
    				this.jt_table.setValueAt(--zaehler, i-1, Wordle.COL3.wert());//anzahl der Worte, die mit jeweils gleichen Buchstaben anfangen
    				zaehler=1;
    			}
    		}
    		
    		TableColumn[] column=new TableColumn[this.jt_table.getColumnCount()];
    		
    		for(int i=0;i<this.jt_table.getColumnCount();i++) {
    			column[i]=this.jt_table.getColumnModel().getColumn(i);			
    			column[i].setCellRenderer(new TableWorteSortiertRenderer());
    		}
    		
    		this.jt_table.setValueAt(zaehler, dtm_worte_sortiert.getRowCount()-1, Wordle.COL3.wert());
    	}
    	
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		if (e.getSource()==this.jb_schliessen) {
    			this.frame.setVisible(false);
    			this.frame.dispose();
    		}
    	}
    }
    Fortsetzung package Renderer für die Darstellung der Tabellen
    Stiller Leser is offline Last edited by Stiller Leser; 13.11.2022 at 13:37.

  3. #3 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    packade Renderer

    class FilterRenderer
    Code:
    package Renderer;
    
    import java.awt.Color;
    import java.awt.Component;
    
    
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    
    import Farben.Farbe;
    
    
    public class FilterRenderer extends DefaultTableCellRenderer{
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
    
        public FilterRenderer() {
            super();
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,   boolean hasFocus, int row, int column) {
              Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
              
              switch (column) {
                  case 0:
                      setHorizontalAlignment(JLabel.LEFT);
                      break;
                  case 1,2,3,4,5:
                      setHorizontalAlignment(JLabel.CENTER);
                      break;
                  default:
                      break;
              }
              
              switch(column) {
                  case 0,2,4:
                      cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
                      break;
                  case 1,3,5:
                      cell.setBackground(new Color(Farbe.LightSkyBlue1.rot(),Farbe.LightSkyBlue1.gruen(),Farbe.LightSkyBlue1.blau()));
                      break;
                  default:
                      break;
              }
              
              /*if(row==table.getRowCount()-1) {
                  cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
              }*/
              
              return cell;
           }
    }
    class TableBuchstabenhaeufigkeitRenderer
    Code:
    package Renderer;
    
    import java.awt.Color;
    import java.awt.Component;
    
    
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    
    import Farben.Farbe;
    
    
    public class TableBuchstabenhaeufigkeitRenderer extends DefaultTableCellRenderer{
    
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        public TableBuchstabenhaeufigkeitRenderer() {
            super();
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,   boolean hasFocus, int row, int column) {
              Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
              
              switch (column) {
                  case 0,1:
                      setHorizontalAlignment(JLabel.CENTER);
                      break;
                  case 2,3:
                      setHorizontalAlignment(JLabel.RIGHT);
                      break;
                  default:
                      break;
              }
              
              switch(column) {
                  case 0:
                      cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
                      break;
                  case 1,2,3:
                      cell.setBackground(new Color(Farbe.LightSkyBlue1.rot(),Farbe.LightSkyBlue1.gruen(),Farbe.LightSkyBlue1.blau()));
                      break;
                  default:
                      break;
              }
              
              if(row==table.getRowCount()-1) {
                  cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
              }
              
              return cell;
           }
    
    
    }
    classTableStelleRenderer
    Code:
    package Renderer;
    
    import java.awt.Color;
    import java.awt.Component;
    
    
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    
    import Farben.Farbe;
    
    
    public class TableStelleRenderer extends DefaultTableCellRenderer{
        
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
    
        public TableStelleRenderer() {
            super();
        }
        
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,   boolean hasFocus, int row, int column) {
              Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
              
              switch (column) {
                  case 0,1,4,7,10,13:
                      setHorizontalAlignment(JLabel.CENTER);
                      break;
                  case 2,3,5,6,8,9,11,12,14,15:
                      setHorizontalAlignment(JLabel.RIGHT);
                      break;
                  default:
                      break;
              }
              
              switch(column) {
                  case 0:
                      cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
                      break;
                  case 1,2,3,7,8,9,13,14,15:
                      cell.setBackground(new Color(Farbe.LightSkyBlue1.rot(),Farbe.LightSkyBlue1.gruen(),Farbe.LightSkyBlue1.blau()));
                      break;
                  default:
                      cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
                      break;
              }
              
              if(row==table.getRowCount()-1) {
                  cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
              }
              
              return cell;
           }
    }
    class TableWorteRenderer
    Code:
    package Renderer;
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
    
    
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    
    import Farben.Farbe;
    
    
    public class TableWorteRenderer extends DefaultTableCellRenderer{
    
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	private Font bold=new Font("Serif",Font.BOLD,14);
    	private Font plain=new Font("Serif",Font.PLAIN,14);
    	
    	public TableWorteRenderer() {
    		super();
    	}
    	
    	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,   boolean hasFocus, int row, int column) {
    	      Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    	      
    	      switch (column) {
    	      	case 2:
    	      		setHorizontalAlignment(JLabel.CENTER);
    	      		if(value.equals("X")) {
    	      			cell.setBackground(new Color(Farbe.LightRed.rot(),Farbe.LightRed.gruen(),Farbe.LightRed.blau()));
    	      			cell.setFont(bold);
    	      		}
    	      		else {
    	      			if(!isSelected) {
    	      			cell.setBackground(new Color(Farbe.White.rot(),Farbe.White.gruen(),Farbe.White.blau()));
    	      			cell.setFont(plain);
    	      			}
    	      		}
    	      		break;
    	      	default:
    	      		break;
    	      }
    	      
    	      return cell;
    	   }
    }
    class TableWorteSortiertRenderer
    Code:
    package Renderer;
    
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
    
    
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
    
    
    import Farben.Farbe;
    
    
    public class TableWorteSortiertRenderer extends DefaultTableCellRenderer {
    
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        private Font bold=new Font("Serif",Font.BOLD,16);
        private Font plain=new Font("Serif",Font.PLAIN,16);
        
        public TableWorteSortiertRenderer() {
            super();
        }
        
           public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,   boolean hasFocus, int row, int column) {
                  Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    
    
                  if(row==0&&column==1) {
                      cell.setFont(bold);
                  }
                  else if(row<table.getRowCount()-1&&column==1){
                      char vergleich= table.getValueAt(row-1, column).toString().charAt(0);
                  
                      if(value.toString().charAt(0)>vergleich) {
                          cell.setFont(bold);
                      }
                  }      
                  else if(row==table.getRowCount()-1&&column==1){
                      cell.setFont(plain);
                  }
                  
                  switch(column) {
                      case 0,2:
                          cell.setBackground(new Color(Farbe.LightGoldenRod2.rot(),Farbe.LightGoldenRod2.gruen(),Farbe.LightGoldenRod2.blau()));
                          break;
                      default:
                          cell.setBackground(new Color(Farbe.LightSkyBlue1.rot(),Farbe.LightSkyBlue1.gruen(),Farbe.LightSkyBlue1.blau()));
                          break;
                  }
                  
                  return cell;
           }
    }
    Fortsetzung package Farben
    Stiller Leser is offline Last edited by Stiller Leser; 10.07.2022 at 13:09.

  4. #4 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    package Farben

    enum Farbe
    Code:
    public enum Farbe {    
        AliceBlue(240,248,255),
        CornflowerBlue(100,149,237),
        LightBlue(173,216,230),
        LightBlue1(191,239,255),
        LightBlue2(178,223,238),
        LightBlue3(154,192,205),
        LightBlue4(104,131,139),
        LightSkyBlue(135,206,250),
        LightSkyBlue1(176,226,255),
        LightSkyBlue2(164,211,238),
        LightSkyBlue3(141,182,205),
        LightSkyBlue4(96,123,139),
        LightGoldenRodYellow(250,250,210),
        LightGoldenRod(255,255,224),
        LightGoldenRod2(238,238,209),
        LightGoldenRod3(205,205,180),
        LightGoldenRod4(139,139,122),
        White(255,255,255),
        WhiteSmoke(245,245,245);
        
        
        private final int rot;
        private final int gruen;
        private final int blau;
        
        Farbe(int rot,int gruen, int blau){
            this.rot=rot;
            this.gruen=gruen;
            this.blau=blau;
        }
    
    
        public int rot() {return rot;}
        public int gruen() {return gruen;}
        public int blau() {return blau;}
    
    
    }
    package Tools

    class Ascii
    Code:
    package Tools;
    
    public class Ascii {
        public static final int ASCII_0=48;
        public static final int ASCII_9=57;
        public static final int ASCII_Punkt=46;
        public static final int ASCII_Komma=44;
    
    
        public static int ASCII_a=97;
        public static int ASCII_z=122;
        public static int ASCII_A=65;
        public static int ASCII_Z=90;
        public static int ASCII_MINUS=45;
    
    
        private Ascii() {
            
        }
    }
    class ABC_Zif
    Code:
    package Tools;
    
    public class IstABC_Zif {
        
        public static boolean istABC_Zif(String abc) {
            if(abc==null || abc.length()==0)return false;
            
            for(int i=0;i<abc.length();i++) {
                if(abc.charAt(i)<Ascii.ASCII_0) return false;
                
                if(abc.charAt(i)>Ascii.ASCII_9) {
                
                    if(abc.charAt(i)<Ascii.ASCII_A || abc.charAt(i)>Ascii.ASCII_z) return false;
                
                    if(abc.charAt(i)>Ascii.ASCII_Z && abc.charAt(i)<Ascii.ASCII_a)return false;
                }
            }
            
            return true; //wenn String aus 0-9 oder A-Z oder a-z besteht
        }
    }
    class IstABC
    Code:
    package Tools;
    
    
    public class IstABC {
    	
    	public static boolean istABC(String abc) {
    		if(abc==null || abc.length()==0)return false;
    		
    		for(int i=0;i<abc.length();i++) {
    			if(abc.charAt(i)<Ascii.ASCII_A || abc.charAt(i)>Ascii.ASCII_z) return false;
    			
    			if(abc.charAt(i)>Ascii.ASCII_Z && abc.charAt(i)<Ascii.ASCII_a)return false;
    		}
    		
    		return true;
    	}
    }
    class IstZahl
    Code:
    package Tools;
    
    
    public class IstZahl {
    	public static boolean isInteger(String integer) {
    		if(integer==null ||integer.length()==0)return false;
    
    
    		for(int i=0;i<integer.length();i++) {
    			if(i==0&&integer.charAt(i)==Ascii.ASCII_MINUS&&integer.length()>1)i++; 
    				if(integer.charAt(i)<Ascii.ASCII_0 || integer.charAt(i)>Ascii.ASCII_9) {
    					return false;
    				}
    		}
    		return true;
    	}
    
    
    }
    class Point
    Code:
    package Tools;
    
    public class Point {
        
        private int x=0;
        private int y=0;
        
        public Point (int x, int y) {
            this.x=x;
            this.y=y;
        }
        
        public Point () {
            this.x=0;
            this.y=0;
        }
    
    
        
        public Point getPoint() {
            return new Point(this.x,this.y);
        }
    
    
        public int getX() {
            return this.x;
        }
        
        public int getY() {
            return this.y;
        }
    
    
        public void setPoint(int x, int y) {
            this.x=x;
            this.y=y;
        }
    
    
        public void setX(int x) {
            this.x=x;
        }
        
        public void setY(int y) {
            this.y=y;
        }
    }
    Class Max

    Code:
    package Tools;
    
    
    public class Max {
    	
    	public static <T extends Number & Comparable<T>> T max(T []feld) {
    		
    		T max=feld[0];
    		int ergebnis=0;
    		int zaehler=0;
    		
    		for(T e:feld) {
    			if(e.compareTo(max)>0) {
    				max=e;
    				ergebnis=zaehler;
    			}
    			zaehler++;
    		}
    		
    		return feld[ergebnis];
    	}
    	
    	public static <T extends Number & Comparable<T>> T min(T []feld) {
    		
    		T max=feld[0];
    		int ergebnis=0;
    		int zaehler=0;
    		
    		for(T e:feld) {
    			if(max.compareTo(e)>0) {
    				max=e;
    				ergebnis=zaehler;
    			}
    			zaehler++;
    		}
    		
    		return feld[ergebnis];
    	}
    
    
    	
    	public static <T extends Number & Comparable<T>> T minmax(T []feld, boolean groesser) {
    		if(groesser) {
    			return max(feld);
    		}
    		else {
    			return min(feld);
    		}
    	}
    }
    Fortsetzung vorbereitete Listen
    Stiller Leser is offline Last edited by Stiller Leser; 13.11.2022 at 13:43.

  5. #5 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    Diese Worte in eine Textdatei worte.txt speichern. Das Lösungswort vom 13.11. ist noch nicht drin.
    Code:
    GANZE0
    IHRER0
    MENGE0
    WERTE5
    STETS5
    WEIST5
    AUTOS3
    DEINE6
    EBENE3
    ESSEN5
    STOCK4
    BRETT4
    KOMIK5
    NYLON4
    AGENT4
    IRDEN6
    HEBEN4
    WOMIT5
    SIPPE4
    KARTE4
    TRIST3
    DRAMA4
    BARDE6
    GRIFF4
    DEKOR5
    MUTIG3
    LARVE7
    THESE4
    MALER3
    FAMOS4
    PRIMA3
    LAUTE6
    ASIAT3
    WOLLE6
    HAUCH5
    ANRUF3
    MAERZ4
    AUGEN5
    TOSEN4
    MAGER3
    ALBUM3
    GENAU4
    EILIG4
    LAUBE6
    BARKE4
    MONAT3
    ROSIG3
    LOIPE4
    LACHE5
    LEINE4
    BOGEN4
    RUHIG3
    SEKTE4
    WOGEN4
    DOGMA4
    INSEL2
    LIEGE4
    JOKER4
    DRALL3
    LEGAL3
    GEBEN3
    KUGEL4
    HEBEL4
    BEIGE5
    RAMPE3
    AXIAL4
    KARRE3
    ZWEIG4
    LEHEN4
    KRUMM4
    RACHE6
    NICHT3
    OELIG3
    JUWEL4
    BAHRE4
    LEFZE4
    THEMA4
    KEGEL4
    RIESE3
    IMMER4
    QUERE3
    BOTEN3
    NONNE5
    UNSER3
    PILZE4
    FEUER4
    NISSE5
    KREBS5
    NUDEL4
    KLANG3
    NETTO3
    FROST5
    KOPIE3
    WRACK5
    LINKE5
    BETON2
    NATUR2
    NELKE3
    GLEIS3
    WANZE5
    KEHLE5
    GALLE3
    SECHS4
    DATEI2
    ZUCHT6
    RENTE3
    ANGEL2
    BRAUE2
    MITTE4
    STARR4
    TREND3
    BODEN5
    SPAET3
    ARMUT3
    LEHNE4
    STIEL4
    ANGST3
    MORAL3
    DEKAN3
    FABEL3
    ECKIG3
    ZUNFT4
    FRUST3
    ETHIK3
    GLATT4
    WEICH4
    STAMM3
    OCHSE3
    MOLCH3
    MODER4
    BIBER7
    FRAGE2
    KRANK3
    LIPPE4
    MAUER5
    FEIND4
    HERAB3
    JETZT3
    KNALL3
    TITAN3
    BRISE4
    BOMBE4
    STIFT4
    SONNE3
    GABEL2
    EIFER4
    EBNEN4
    VIRUS3
    BEUTE3
    TREUE2
    GEHEN4
    TROLL3
    GROSS3
    FERNE4
    TONNE1
    STEIN3
    ZIEGE6
    HITZE5
    TEILS3
    KASSA5
    HORDE4
    AREAL3
    NAGEN3
    OSTEN1
    HILFE4
    ROETE5
    SAGEN4
    ERNST3
    SCHAM4
    BLUME4
    TORTE4
    DUNST3
    HECHT4
    AORTA3
    FEGEN4
    BOXEN5
    SAITE6
    PUPPE5
    PISTE6
    MANKO3
    LUCHS3
    FORUM3
    STURM4
    GARDE5
    BLOED3
    FRIST3
    STERN2
    GNADE3
    STUMM6
    ERDEN3
    RASCH4
    JUBEL3
    ZUDEM3
    ENDEN3
    ENKEL3
    SPASS4
    FLOTT4
    PANIK4
    HORST4
    INDEX3
    RODEL3
    SACHT5
    LOEWE3
    BRIEF3
    GEIGE4
    INNEN4
    HAGER3
    KOHLE4
    PFEIL4
    RASUR5
    LENDE3
    FRONT2
    PAKET3
    DOLCH3
    RUEBE4
    HENNE6
    KAMPF5
    ANMUT2
    LOBEN3
    HEIDE6
    WORTE3
    PEGEL3
    STUFE5
    PERLE3
    STEIF3
    RUEDE4
    TRUPP4
    GLIED3
    REISE3
    DARUM4
    PIRAT4
    WOCHE6
    GAMBE4
    BLOND3
    WEBER3
    ALLEE2
    KRAUT3
    MENSA3
    WIESO3
    ACRYL4
    ELEND3
    UNRAT0
    HEUTE0
    WUCHT0
    PSALM4
    SCHEU0
    EMPOR0
    PAUSE0
    RIEGE0
    PATER0
    KERBE3
    VIRAL3
    ABBAU3
    FAKIR3
    STIER3
    FRACK3
    SOHLE3
    EICHE4
    SAUNA4
    MAGMA3
    SONDE3
    KRIMI3
    ATLAS2
    KANTE2
    SPATZ3
    KAPER6
    FALKE3
    GLANZ3
    LODEN3
    LAMPE3
    URBAN3
    SUCHT4
    HETZE5
    RASER6
    SPOTT4
    UMHER5
    SALBE4
    EITER3
    AXIOM2
    BUCHT3
    DEGEN4
    DAMIT4
    KROPF3
    LADEN4
    DARIN3
    TORUS4
    VOKAL3
    MODUS4
    FROMM3
    HIRSE3
    SEIDE3
    AESEN5
    Die Zahl hinter den Worten ist die Anzahl der Versuche für die Lösung.
    Dabei bedeutet die 0, dass das Wort nicht versucht wurde.
    1-6 die Anzahl der Versuche bei einer erfolgreichen Lösung.
    7 bedeutet, versucht zu lösen, aber nicht geschafft.

    Speicherorte in eine Textdatei worte.xxx speichern. Diese Datei muss diesen Namen tragen, ist quasi die ini-Datei.

    Als erstes den Pfad. Stelle 2 ist die wortliste, also worte.txt, 3 ist die sortierte Wortliste und 4 ist die eigene Ratestatistik.
    Kann man aber auch im Programm einstellen.

    Code:
    d:\daten\test\wordle\Speicher
    worte.txt
    worte_sortiert.txt
    statistik.txt
    Stiller Leser is offline Last edited by Stiller Leser; 13.11.2022 at 13:48.

  6. #6 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    Hab das ganze überarbeitet. Bisschen was hinzugekommen. So sieht das ganze jetzt aus:

    Spoiler:(zum lesen bitte Text markieren)


    Spoiler:(zum lesen bitte Text markieren)


    Spoiler:(zum lesen bitte Text markieren)


    Dafür, dass das Diagramm hinzugekommen ist, benötigt man eine Liste mit der richtigen Reihenfolge der Worte, wie die Aufgaben erschienen sind. Am Ende wird dann, wie im Beitrag zuvor beschrieben, noch die Anzahl der Lösungsversuche angefügt, bzw. ob man die Lösung nicht geschafft hat (7) oder das Wort gar nicht versucht wurde (0).

    Da ich auch noch ein paar neue Sachen mit Swing probiert habe, hat sich auch einiges an den anderen Klassen geändert, bzw. musste auch angepasst werden.

    Viel Spaß
    Stiller Leser is offline Last edited by Stiller Leser; 08.06.2022 at 16:56.

  7. #7 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    Die letzte Überarbeitung. Hinzugekommen ist auch noch ein Mausmenü für die unsortierte Wortliste. Dort können per Rechtsklick Worte eingefügt, geändert oder gelöscht werden.

    Hier zu hab ich die Klassen Worte, Wort, Buchstaben, BearbeiteVersuche, Fenster und TableWorteRenderer etwas angepasst, weil mit den obigen Möglichkeiten zusätzliche Funktionen reingebracht wurden.

    Das ganze sieht so aus.

    Spoiler:(zum lesen bitte Text markieren)


    Damit ist es für mich erledigt. Hab viel gelernt über Java Swing und für mich erfüllt das Programm nun alle Punkte, die ich haben wollte. Was euch nicht dran hindern sollte, falls ihr Spaß dran habt, noch mehr hinzuzufügen.
    Stiller Leser is offline

  8. #8 Reply With Quote
    Auserwählter
    Join Date
    Jul 2017
    Posts
    6,847
    Es gibt noch eine Überarbeitung.

    Einmal bei der Diagrammdarstellung. Da kann man sich jetzt noch unten anhand eines kleinen Balkendiagramms die Lösungen der jeweiligen Streaks anschauen.
    Voreingestellt ist der aktuelle Streakverlauf.

    Zum anderen einen zusätzlichen Filter. Aufrufbar über die Menüleiste mit Großer Filter. Dieser ist sehr viel flexibler, als der normale Filter. Der normale Filter ist dadurch
    zwar nicht überflüssig, aber durch die Vielseitigkeit des großen Filters wird man den jetzt wohl weniger nutzen.

    Dann habe ich noch das Balkendiagramm angepasst. Die maximale Balkenhöhe ist jetzt abhängig von der Anzahl für einen Balken in Abhängigkeit von der Gesamtzahl aller Lösungsversuche. Der Hintergrund hierfür ist, dass gerade bei einem neuen Streak die ersten Versuche durchaus 100 Prozent der Gesamtzahl haben kann. So dass ich vorher
    die max. Balkenhöhe per se klein gehalten habe. Jetzt passt die sich an.

    Und ein paar Bugs habe ich auch noch eliminiert.

    Das ganze sieht jetzt so aus:

    Hier die veränderte Balkendarstellung
    Spoiler:(zum lesen bitte Text markieren)


    Hier der große Filter
    Spoiler:(zum lesen bitte Text markieren)


    Hier das Diagramm mit dem zusätzlichen Balkendiagramm für die einzelnen Streaks.
    Spoiler:(zum lesen bitte Text markieren)


    Neue Klassen:
    Class Grosser_Filter
    Class GrosserFilterListe
    im package Worte
    und
    Class Max
    im Package Tools

    Anpassungen:
    Class BearbeiteVersuche
    Class DiagrammLoesungen
    Class Fenster
    Class Worte
    im Package Worte

    Class IstABC
    Class IstZahl
    im Package Tools

    Beim Diagramm ist unten noch ein wenig Platz. Vermutlich fällt mir noch ein wenig was ein. Aber erst mal reicht es auch so

    Viel Spaß
    Stiller Leser is offline

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •