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