/*
* ClientGUI.java
*
* Created on 15. Januar 2008, 14:45
*/
package gui;
import data.Duell;
import data.User;
import db.Datenbank;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.SwingWorker;
import javax.swing.Timer;
import javax.swing.UIManager;
/**
*
* @author Kevin
*/
public class ClientGUI extends javax.swing.JFrame
{
private User loggedUser = null;
private List<User> onlineUsers = new LinkedList<User>();
private List<Duell> duelle = new LinkedList<Duell>();
DefaultListModel model = new DefaultListModel();
private Duell duell = null;
/* Timer damit dauernd überprüft wird, wer online ist.Delay ist die
* Verzögerung in Millisekunden, der ActionListener ist was passieren
* soll (model updaten). Sobald ein User eingeloggt ist, wird der Timer
* gestartet, beim ausloggen wieder gestoppt. */
private int delay = 3000;
ActionListener aktualisiereOnline = new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
/* TODO: Bessere Variante statt model.clear!! Vor allem weil beim
* Model leeren auch die Selektion wegfällt!
*/
model.clear();
(new UpdateListWorker()).execute();
}
};
Timer timer = new Timer(delay, aktualisiereOnline);
/** Creates new form ClientGUI */
public ClientGUI()
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (Exception ex)
{
}
initComponents();
getRootPane().setDefaultButton(btStart);
listSpieler.setModel(model);
}
/** This method is called from within the constructor to
* initialize the form.8
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
hauptpanel = new javax.swing.JPanel();
jPanel1 = new javax.swing.JPanel();
btStart = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
listSpieler = new javax.swing.JList();
menuBar = new javax.swing.JMenuBar();
menuDatei = new javax.swing.JMenu();
miLogin = new javax.swing.JMenuItem();
miLogout = new javax.swing.JMenuItem();
jSeparator1 = new javax.swing.JSeparator();
miBeenden = new javax.swing.JMenuItem();
menuStatistiken = new javax.swing.JMenu();
menuInfo = new javax.swing.JMenu();
miGrundidee = new javax.swing.JMenuItem();
miAnleitung = new javax.swing.JMenuItem();
miAbout = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("DieLämma");
setMinimumSize(new java.awt.Dimension(79, 70));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
onX(evt);
}
});
hauptpanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
hauptpanel.setLayout(new java.awt.BorderLayout());
jPanel1.setLayout(new java.awt.GridBagLayout());
btStart.setText("Start");
btStart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onStart(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 0);
jPanel1.add(btStart, gridBagConstraints);
hauptpanel.add(jPanel1, java.awt.BorderLayout.SOUTH);
jScrollPane1.setViewportView(listSpieler);
hauptpanel.add(jScrollPane1, java.awt.BorderLayout.CENTER);
getContentPane().add(hauptpanel, java.awt.BorderLayout.CENTER);
menuDatei.setMnemonic('D');
menuDatei.setText("Datei");
miLogin.setText("Login");
miLogin.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onLogin(evt);
}
});
menuDatei.add(miLogin);
miLogout.setText("Logout");
miLogout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onLogout(evt);
}
});
menuDatei.add(miLogout);
menuDatei.add(jSeparator1);
miBeenden.setText("Beenden");
miBeenden.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onBeenden(evt);
}
});
menuDatei.add(miBeenden);
menuBar.add(menuDatei);
menuStatistiken.setMnemonic('S');
menuStatistiken.setText("Statistiken");
menuBar.add(menuStatistiken);
menuInfo.setMnemonic('I');
menuInfo.setText("Info");
miGrundidee.setText("Grundidee");
miGrundidee.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onGrundidee(evt);
}
});
menuInfo.add(miGrundidee);
miAnleitung.setText("Anleitung");
miAnleitung.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onAnleitung(evt);
}
});
menuInfo.add(miAnleitung);
miAbout.setText("About");
miAbout.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
onAbout(evt);
}
});
menuInfo.add(miAbout);
menuBar.add(menuInfo);
setJMenuBar(menuBar);
pack();
}// </editor-fold>//GEN-END:initComponents
private void onBeenden(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onBeenden
// Wie beim ausloggen
if (loggedUser != null)
{
loggedUser.setOnline(false);
(new UpdateOnlineWorker(loggedUser)).execute();
}
dispose();
}//GEN-LAST:event_onBeenden
private class UpdateListWorker extends SwingWorker
{
public UpdateListWorker()
{
}
protected Object doInBackground()
throws Exception
{
try
{
onlineUsers = Datenbank.getInstance().getOnlineUsers();
for (User user : onlineUsers)
{
model.addElement(user.getNick());
}
}
catch (SQLException ex)
{
ex.printStackTrace();
}
catch (ClassNotFoundException ex)
{
ex.printStackTrace();
}
return null;
}
protected void done()
{
try
{
get();
}
catch (InterruptedException ex)
{
}
catch (ExecutionException ex)
{
JOptionPane.showMessageDialog(null, ex.getCause().getMessage(),
"Fehler", JOptionPane.ERROR_MESSAGE);
}
}
}
private void onLogin(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onLogin
if (loggedUser == null)
{
LoginDlg dlg = new LoginDlg(this, true);
dlg.setVisible(true);
if (dlg.isOk())
{
// Eingeloggter User wird in der Titelleiste angezeigt
loggedUser = dlg.getNewUser();
loggedUser.setOnline(true);
(new UpdateOnlineWorker(loggedUser)).execute();
this.setTitle("DieLämma - (Eingeloggt als: " + loggedUser.getNick() + ")");
timer.start();
}
}
else
{
JOptionPane.showMessageDialog(this, "Es ist bereits ein Benutzer eingeloggt!",
"Fehler", JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_onLogin
private class UpdateOnlineWorker extends SwingWorker
{
private final User user;
public UpdateOnlineWorker(User user)
{
this.user = user;
}
protected Object doInBackground()
throws Exception
{
//TODO: umändern, da der Server jegliche Kommunikation erhalten muss und der Server
//hat die Erlaubnis auf die Datenbank zuzugreifen!
Datenbank.getInstance().updateOnlineAndIp(user);
return null;
}
protected void done()
{
try
{
get();
}
catch (InterruptedException ex)
{
}
catch (ExecutionException ex)
{
JOptionPane.showMessageDialog(null, ex.getCause().getMessage(),
"Fehler", JOptionPane.ERROR_MESSAGE);
}
}
}
private void onLogout(java.awt.event.ActionEvent evt) {
// Status wird auf offline und Titel wieder auf DieLämma gesetzt
try
{
if (loggedUser != null)
{
loggedUser.setOnline(false);
(new UpdateOnlineWorker(loggedUser)).execute();
}
this.setTitle("DieLämma");
loggedUser = null;
timer.stop();
model.clear();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private class AddDuellWorker extends SwingWorker
{
private final Duell duell;
public AddDuellWorker(Duell duell)
{
this.duell = duell;
}
protected Object doInBackground()
throws Exception
{
Datenbank.getInstance().addDuell(duell);
return null;
}
protected void done()
{
try
{
get();
}
catch (InterruptedException ex)
{
}
catch (ExecutionException ex)
{
JOptionPane.showMessageDialog(null, ex.getCause().getMessage(),
"Fehler", JOptionPane.ERROR_MESSAGE);
}
}
}
private void onStart(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onStart
if (loggedUser != null)
{
try
{
int selSpieler = listSpieler.getSelectedIndex();
String nick2 = model.get(selSpieler).toString();
String ip = Datenbank.getInstance().getIpFromUser(nick2);
duell = new Duell(loggedUser.getNick(), nick2, 0, 0, 0, 0, 0, 0, 0,
false, false, 0, 0, false);
(new AddDuellWorker(duell)).execute();
DuellDlg dlg = new DuellDlg(this, true);
dlg.setVisible(true);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else
{
JOptionPane.showMessageDialog(this, "Kein Benutzer eingeloggt!",
"Fehler", JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_onStart
// <editor-fold defaultstate="collapsed" desc="Textdialoge">
private void onGrundidee(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onGrundidee
TextDlg dlg = new TextDlg(this,true,
"Das Gefangenendilemma \n\n" +
"Zwei Gefangene werden verdächtigt, gemeinsam eine Straftat begangen zu haben. Die Höchststrafe für das Verbrechen beträgt fünf \n" +
"Jahre. Beiden Gefangenen wird nun ein Handel angeboten, worüber auch beide informiert sind. Wenn einer gesteht und somit seinen \n" +
"Partner mitbelastet, kommt er ohne Strafe davon – der andere muss die vollen fünf Jahre absitzen. Entscheiden sich beide zu \n" +
"schweigen, bleiben nur Indizienbeweise, die aber ausreichen, um beide für zwei Jahre einzusperren. \n\n" +
"Gestehen aber beide die Tat, erwartet jeden eine Gefängnisstrafe von vier Jahren."+
"Nun werden die Gefangenen unabhängig voneinander\n" +
"befragt. Weder vor noch während der Befragung haben die beiden die Möglichkeit, sich untereinander abzusprechen." +
"\n\n---------------------------------------------------------------\n\n" +
"Schuld und Unschuld\n\n" +
"Im Gefangenendilemma spielt die Frage von tatsächlicher Schuld oder Unschuld für das Resultat keine Rolle. Das wirkt sich so aus,\n " +
"dass auch der Unschuldige besser wegkommt, wenn er gesteht – in dem Fall etwas, das er nicht getan hat. Da moralische Bedenken \n" +
"und die Hoffnung auf Erweis der Unschuld den Unschuldigen davon abhalten, zu gestehen, was er nicht getan hat, muss er dann oft die \n" +
"schlechtere Stellung einnehmen, die sich aus dem Nichtgeständnis ergibt. Wenn die Strafe für Nichtgestehen sehr hoch ist, gestehen \n" +
"auch viele Unschuldige alles. Das Dilemma kommt insbesondere bei Schauprozessen zum Tragen."
,"Grundidee");
dlg.setVisible(true);
}//GEN-LAST:event_onGrundidee
private void onAnleitung(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onAnleitung
TextDlg dlg = new TextDlg(this,true,
"Im Grunde stehen jedem Spieler nur 2 Möglichkeiten zur Verfügung, entweder kooperieren oder nicht kooperieren. \n" +
"Dadurch entstehen nur 4 mögliche Szenarien: \n\n" +
"\tSpieler 1: kooperiert\tSpieler 2: kooperiert nicht\n" +
"\tSpieler 1: kooperiert nicht\tSpieler 2: kooperiert\n" +
"\tSpieler 1: kooperiert\tSpieler 2: kooperiert\n" +
"\tSpieler 1: kooperiert nicht\tSpieler 2: kooperiert nicht" +
"\n\n---------------------------------------------------------------\n\n" +
"Berechnet wird wie folgt:\n"+
"0\t„Versuchung” (temptation)– Belohnung für einseitigen Verrat (Freiheit)\n"+
"-2\t„Belohnung” (reward) – Belohnung für Kooperation von A und B (nur zwei Jahre Strafe)\n"+
"-4\t„Bestrafung” (punishment) – Bestrafung für gegenseitigen Verrat (vier Jahre Strafe)\n"+
"-5\t„Des Gutgläubigen Belohnung” (sucker's payoff) – Bestrafung für Vertrauen, \n" +
"\tdas Vertrauen wurde einseitig durch den Partner gebrochen (fünf Jahre Strafe)"
,"Anleitung");
dlg.setVisible(true);
}//GEN-LAST:event_onAnleitung
private void onAbout(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_onAbout
TextDlg dlg = new TextDlg(this,true,"About","About");
dlg.setVisible(true);
}//GEN-LAST:event_onAbout
//</editor-fold>
private void onX(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_onX
//ausloggen, wenn auf das X gedrückt wird
if (loggedUser != null)
{
loggedUser.setOnline(false);
(new UpdateOnlineWorker(loggedUser)).execute();
}
}//GEN-LAST:event_onX
/**
* @param args the command line arguments
*/
public static void main(String args[])
{
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new ClientGUI().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btStart;
private javax.swing.JPanel hauptpanel;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JList listSpieler;
private javax.swing.JMenuBar menuBar;
private javax.swing.JMenu menuDatei;
private javax.swing.JMenu menuInfo;
private javax.swing.JMenu menuStatistiken;
private javax.swing.JMenuItem miAbout;
private javax.swing.JMenuItem miAnleitung;
private javax.swing.JMenuItem miBeenden;
private javax.swing.JMenuItem miGrundidee;
private javax.swing.JMenuItem miLogin;
private javax.swing.JMenuItem miLogout;
// End of variables declaration//GEN-END:variables
}