import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* Erzeugt ein neues DartPane, Quasi die Sicht auf die Daten , hier enthält diese Klasse auch
* alles an Logik was nötig ist und diese Daten auszuwerten, und zu manipulieren.
*
* Was genau passiert habe ich an den einzelnen Methoden kommentiert.
*
* @author kaoz
* @version 1.0
*
*/
public class DartPane extends JPanel {
private static final long serialVersionUID = 1L;
private GridBagConstraints cons = new GridBagConstraints();
private static Dimension fieldSize = new Dimension(120,25);
private final static Dimension PANEL_SIZE = new Dimension(400,300);
private JLabel currentTryLabel;
private JLabel currentHighScoreLabel;
private JLabel currentAverageLabel;
private int currentTry;
private int currentHighScore;
private int currentAverage;
private JTextField[] fields;
private JButton button;
private ArrayList<int[]> resultList;
private int maxTrys;
private JLabel[] label;
private String[] labeling =
{
"Wie hoch ist ihr aktueller Score ?",
"Wie oft haben Sie die 20 verfehlt ?",
"Wie oft haben Sie die T20 getroffen ?",
"Aktueller Durchgang :",
"Würfe > 100 :",
"Aktueller Average :"
};
/**
* Konstruktor
*/
public DartPane(int maxTrys) {
this.maxTrys = maxTrys;
init();
addComponents();
}
/**
* Initialisiert alle Komponenten
*/
private void init(){
this.currentTryLabel = new JLabel("1");
this.currentHighScoreLabel = new JLabel("0");
this.currentAverageLabel = new JLabel("0");
this.currentTry = 1;
this.currentHighScore = 0;
this.currentAverage = 0;
resultList = new ArrayList<>();
fields = new JTextField[3];
//Textfelder erstellen und größe setzen
for (int i = 0; i < fields.length; i++) {
fields[i] = new JTextField();
fields[i].setPreferredSize(fieldSize);
}
label = new JLabel[6];
//Label erzeugen und beschriften
for (int i = 0; i < label.length; i++) {
label[i] = new JLabel(labeling[i]);
}
button = new JButton("Nächster Durchgang");
button.addActionListener(new ButtonListener(this));
//Panelgröße festlegen und WICHTIG Layout setzen
setPreferredSize(PANEL_SIZE);
setLayout(new GridBagLayout());
}
/**
* Legt die Position der einzelnen Komponenten fest
*/
private void addComponents(){
cons.insets = new Insets(5, 5, 5, 5);
cons.anchor = GridBagConstraints.LINE_START;
//setUp Y Components
cons.gridx = 0;
cons.gridy = 0;
this.add(label[0], cons);
cons.gridx = 0;
cons.gridy = 1;
this.add(label[1], cons);
cons.gridx = 0;
cons.gridy = 2;
this.add(label[2], cons);
cons.insets = new Insets(20, 5, 5, 5);
cons.gridx = 0;
cons.gridy = 3;
this.add(label[3], cons);
cons.insets = new Insets(5, 5, 5, 5);
cons.gridx = 0;
cons.gridy = 4;
this.add(label[4], cons);
cons.gridx = 0;
cons.gridy = 5;
this.add(label[5], cons);
//setUp X Components
cons.anchor = GridBagConstraints.LINE_END;
cons.gridx = 1;
cons.gridy = 0;
this.add(fields[0], cons);
cons.gridx = 1;
cons.gridy = 1;
this.add(fields[1], cons);
cons.gridx = 1;
cons.gridy = 2;
this.add(fields[2], cons);
cons.insets = new Insets(20, 5, 5, 5);
cons.anchor = GridBagConstraints.CENTER;
cons.gridx = 1;
cons.gridy = 3;
this.add(currentTryLabel, cons);
cons.insets = new Insets(5, 5, 5, 5);
cons.gridx = 1;
cons.gridy = 4;
this.add(currentHighScoreLabel, cons);
cons.gridx = 1;
cons.gridy = 5;
this.add(currentAverageLabel, cons);
cons.gridx = 0;
cons.gridy = 6;
cons.gridwidth = 2;
cons.fill = GridBagConstraints.HORIZONTAL;
this.add(button, cons);
}
/*
* liefert den Punktestand
*/
private int getFinalScore(){
int score = 0;
for (int i = 0; i < resultList.size(); i++) {
score += resultList.get(i)[0];
}
return score;
}
/*
* liefert den Average aller Durchgänge
*/
private int getAverage(){
int res = 0;
for (int i = 0; i < resultList.size(); i++) {
res += resultList.get(i)[0];
}
return res / resultList.size();
}
/*
* liefert die Anzahl an allen verfehlten Würfen
*/
private int getMisses(){
int misses = 0;
for (int i = 0; i < resultList.size(); i++) {
misses += resultList.get(i)[1];
}
return misses;
}
/*
* Setzt den aktuellen Score, Würfe über 100 und den Aktuellen Average
*/
private void getRunResults(){
currentTryLabel.setText(String.valueOf(currentTry));
currentHighScoreLabel.setText(String.valueOf(currentHighScore));
currentAverageLabel.setText(String.valueOf(currentAverage));
}
/*
* Felder zurücksetzen, und Focus auf Feld 1 legen
*/
private void resetFields(){
for (int i = 0; i < fields.length; i++) {
fields[i].setText("");
}
fields[0].requestFocus();
}
/*
* Alle Felder zurücksetzen, liste mit Druchlaufergebnissen leeren
*/
private void resetAll(){
resetFields();
resultList.clear();
}
/*
* Getter für den Button
*/
public JButton getDefaultButton() {return this.button;}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// Trennlinie zeichnen
g.setColor(Color.GRAY);
g.drawLine(10,145,395,145);
}
// Listener als Innere Klasse ( Controller )
class ButtonListener implements ActionListener{
private JComponent comp;
public ButtonListener(JComponent comp){
this.comp = comp;
}
@Override
public void actionPerformed(ActionEvent e) {
int[] res = new int[3];
// Abbruchbedingung / parsen der Inhalte , anzeige eines OptionsPanes bei dessen Erreichen
if (currentTry <= maxTrys) {
try {
res[0] = InputUtil.checkInput(fields[0].getText());
res[1] = InputUtil.checkInput(fields[1].getText());
res[2] = InputUtil.checkInput(fields[2].getText());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(comp, "Es werden nur Ganzzahlen akzeptiert !");
return;
}
resultList.add(res); // Rundenergebniss der Liste hinzufügen
currentTry++; // Aktuellen Druchgang um + 1 erhöhen
currentAverage = getAverage(); // Average berechnen
if (res[0] > 100) {
currentHighScore++; // Anzahl an Würfen über 100 zählen
}
// Werte setzen und Felder reseten
getRunResults();
resetFields();
}
else{
// Auswahlfenster bei erreichen der maximalen Durchgänge
Object[] options = {"Neu Starten", "Auswerten"};
String text = "Sie haben die Maximale Anzahl an Durchläufen erreicht, was wollen Sie tun ?";
String title = "Keine Weiteren Versuche übrig !";
int val = JOptionPane.showOptionDialog(comp, text, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, null);
if (val == 0 ) {
resetAll();
}
else{
JFrame f = new JFrame("Auswertung");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.add(new ScorePane(getFinalScore(), getMisses(), getAverage()));
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
}
}
}