//Das eigentliche Programm, ist auch wirklich nur so groß.
public class Main {
public static void main(String[] args) {
System.setProperty("file.encoding", "UTF-8");
TypingTrainer trainer = new TypingTrainer();
View v = new SwingView(trainer);
trainer.setView(v);
v.showAndRun();
trainer.terminate();
}
}
//Die Programmlogik. Nimmt Benutzereingaben entgegen, liefert den String den der Benutzer abtippen soll,
//prüft auf Richtigkeit, zählt Fehler und ermittelt die Tippgeschwindigkeit.
//Nimmt auch Benutzereinstellungen entgegen und passt ihr Verhalten entsprechend an.
public class TypingTrainer {
private int errors = 0;
private int characterCounter = 0;
private int calculatedTypeSpeed = 0;
private Timer typeSpeedTimer;
private final long typeSpeedIntervall = 1500; // Time in ms for type speed measurement
private View view;
public TypingTrainer() {
//...
setTypeSpeedTimer();
}
private void setTypeSpeedTimer() {
typeSpeedTimer = new Timer();
typeSpeedTimer.scheduleAtFixedRate(new TimerTask() {
private long speedCorrectionFactor = 60000 / typeSpeedIntervall;
@Override
public void run() {
calculatedTypeSpeed = (int) (characterCounter * speedCorrectionFactor);
characterCounter = 0;
}
}, 0, typeSpeedIntervall);
}
void terminate() {
if (typeSpeedTimer != null) {
typeSpeedTimer.cancel();
typeSpeedTimer.purge();
typeSpeedTimer = null;
}
}
}
//Swingview zeigt nur Dinge an. Was sie wie anzeigt, wird von der TypingTrainer-Klasse gesteuert.
public class SwingView implements View {
private final int statisticsRefreshDelay = 200;
private boolean isClosed;
public SwingView(TypingTrainer trainer) {
this.trainer = trainer;
isClosed = false;
}
private void initGUI() {
//...baue GUI...
windowFrame.addWindowListener(new WindowListener() {
@Override
public void windowClosing(WindowEvent e) {
isClosed = true;
});
}
@Override
public void showAndRun() {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(SwingView.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
initGUI();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
windowFrame.setVisible(true);
}
});
while (!isClosed) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}