diff --git a/spaceinvaders/GameProject/bin/.gitignore b/spaceinvaders/GameProject/bin/.gitignore deleted file mode 100644 index 15c18ec..0000000 --- a/spaceinvaders/GameProject/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/ui/ diff --git a/spaceinvaders/GameProject/log/log4j.log b/spaceinvaders/GameProject/log/log4j.log index e837921..52972a5 100644 --- a/spaceinvaders/GameProject/log/log4j.log +++ b/spaceinvaders/GameProject/log/log4j.log @@ -5582,3 +5582,22 @@ 2022-07-01 21:11:12,787 INFO base.GameLoop - GUI starts 2022-07-01 21:11:13,582 INFO ui.GameUIWithLogin - added new MenuItem 2022-07-01 21:11:26,152 INFO ui.GameUIWithLogin - added new MenuItem +2022-07-01 21:48:56,071 INFO base.GameLoop - GUI starts +2022-07-01 21:48:56,767 INFO ui.GameUIWithLogin - added new MenuItem +2022-07-01 21:48:59,803 INFO ui.GameUIWithLogin - added new MenuItem +2022-07-01 21:49:28,814 INFO base.GameLoop - GUI starts +2022-07-01 21:49:29,336 INFO ui.GameUIWithLogin - added new MenuItem +2022-07-01 21:49:30,272 INFO ui.GameUI - click +2022-07-01 21:49:30,273 INFO base.GameLoop - GUI NEW +2022-07-01 21:49:30,273 INFO playground.SpaceInvadersLevel - PREPARE +2022-07-01 21:49:30,351 INFO playground.Animation - img added .\video/sweetAlien0.png +2022-07-01 21:49:30,361 INFO playground.Animation - img added .\video/sweetAlien1.png +2022-07-01 21:49:30,366 INFO playground.Animation - img added .\video/sweetAlien2.png +2022-07-01 21:49:30,370 INFO playground.Animation - img added .\video/sweetAlien3.png +2022-07-01 21:49:30,379 INFO playground.Animation - img added .\video/sweetAlien4.png +2022-07-01 21:49:30,384 INFO playground.Animation - img added .\video/sweetAlien5.png +2022-07-01 21:49:30,390 INFO playground.Animation - img added .\video/sweetAlien6.png +2022-07-01 21:49:30,394 INFO playground.Animation - img added .\video/sweetAlien7.png +2022-07-01 21:49:30,410 INFO playground.Animation - img added .\video/heart0.png +2022-07-01 21:49:30,413 INFO playground.Animation - img added .\video/heart1.png +2022-07-01 21:49:30,422 INFO playground.SpaceInvadersLevel - HIGHSCORE17200 diff --git a/spaceinvaders/gui/.classpath b/spaceinvaders/gui/.classpath new file mode 100644 index 0000000..4fc7955 --- /dev/null +++ b/spaceinvaders/gui/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/spaceinvaders/gui/.gitignore b/spaceinvaders/gui/.gitignore new file mode 100644 index 0000000..fbd5a69 --- /dev/null +++ b/spaceinvaders/gui/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/doc/ diff --git a/spaceinvaders/gui/.project b/spaceinvaders/gui/.project new file mode 100644 index 0000000..3c9f1a7 --- /dev/null +++ b/spaceinvaders/gui/.project @@ -0,0 +1,17 @@ + + + GuiProjectW11 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/spaceinvaders/gui/src/gui/MainGui.java b/spaceinvaders/gui/src/gui/MainGui.java new file mode 100644 index 0000000..4900953 --- /dev/null +++ b/spaceinvaders/gui/src/gui/MainGui.java @@ -0,0 +1,228 @@ +package gui; + + +import javax.swing.*; +import java.awt.event.*; +import java.util.*; + + +/** + * a simple GUI that simulates a slow database for name, email entries. For details see constructor {@link MainGui#MainGui() }. + * This class provides a simple static {@link #main(String[])} to start/run the GUI window. + */ +public class MainGui { + + private JFrame frame = null; + private JPanel cp = new JPanel(); + private JPanel topPanel = new JPanel(); + private JPanel middlePanel = new JPanel(); + private JPanel bottomPanel = new JPanel(); + + private JTextField tfName = new JTextField("", 20); + private JTextField tfMail = new JTextField("", 20); + + private JButton btBack = new JButton("<--"); + private JButton btForward = new JButton("-->"); + private JButton btAdd = new JButton("Neu"); + private ArrayList database = new ArrayList(); + + private int index = 0; + + private JMenuItem menuNew = new JMenuItem("Neu"); + private JMenuItem menuEnd = new JMenuItem("Ende"); + + /** inner class representing one entry to DB */ + private class DBEntry { + String name; + String email; + } + + /** inner class to be used for ActionListener back */ + private class BackAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + // always save current entry before loading next + DBEntry entry = new DBEntry(); // we create a new DBEntry object instead manipulating the + // existing one to simulate real new reference to a new object. + entry.name = tfName.getText(); + entry.email = tfMail.getText(); + saveFieldsToDB(entry, index); + + if (index >= 1) { + index--; + DBEntry entryLoaded = getEntryFromDB(index); + tfName.setText(entryLoaded.name); + tfMail.setText(entryLoaded.email); + } + } + } + + /** inner class to be used for ActionListener forward */ + private class ForwardAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + + // always save current entry before loading next + DBEntry entry = new DBEntry(); // we create a new DBEntry object instead manipulating the + // existing one to simulate real new reference to a new object. + entry.name = tfName.getText(); + entry.email = tfMail.getText(); + saveFieldsToDB(entry, index); + + if (index < database.size() - 1) { + index++; + DBEntry entryLoaded = getEntryFromDB(index); + tfName.setText(entryLoaded.name); + tfMail.setText(entryLoaded.email); + } + } + } + + + + /** inner class to be used for ActionListener exit program */ + private class EndAction implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + } + + /** inner class to be used for ActionListener add */ + private class AddAction implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + // always save current entry before loading next + DBEntry entry = new DBEntry(); // we create a new DBEntry object instead manipulating the + // existing one to simulate real new reference to a new object. + entry.name = tfName.getText(); + entry.email = tfMail.getText(); + saveFieldsToDB(entry, index); + + addEmptyEntryToDB(); + index = database.size() - 1; + DBEntry entryLoaded = getEntryFromDB(index); + tfName.setText(entryLoaded.name); + tfMail.setText(entryLoaded.email); + } + } + + + + /** manipulation of DB and simulates slow connection by Thread.wait() */ + private void saveFieldsToDB(DBEntry entry, int index) { + database.set(index, entry); + doWait(); + } + + /** add an empty entry at end of db (quickly) */ + private void addEmptyEntryToDB() { + DBEntry dbEntry = new DBEntry(); + dbEntry.name = ""; + dbEntry.email = ""; + database.add(dbEntry); + } + + /** reads from DB (quickly) */ + private DBEntry getEntryFromDB(int index) { + return this.database.get(index); + } + + + + /** performing a Thread.wait() for 3 sec */ + private void doWait() { + try { + synchronized (database) { + database.wait(3 * 1000); // simulates "slow" database by waiting 3sec before this Thread + // continues. wait needs monitor of the object, thus synchronized + } + } catch (InterruptedException e1) { + // intentionally blank; wait did not work or was earlier interrupted. No problem for us. + } + } + + + /** + * constructor that configures and shows the GUI window. It contains two text inputs for name and + * email address and three buttons BACK, ADD and FORWARD. For each button own inner classes are + * defined as {@link ActionListener}: {@link BackAction}, {@link ForwardAction }, {@link AddAction + * }, which all three call the {@link #doWait()} method, which simulates a slow database. Thus, it + * will have an effect to move the code of the ActionListeners to extra Threads in order to keep + * the GUI responsive. + * + * @see Runnable + * @see Thread + * @see ActionListener + * + */ + public MainGui() { + + // dummy data to "database" + DBEntry e1 = new DBEntry(); + e1.name = "Max Muster"; + e1.email = "max.muster@hs-fulda.de"; + DBEntry e2 = new DBEntry(); + e2.name = "Jane Doe"; + e2.email = "jane.doe@somewhere.com"; + this.database.add(e1); + this.database.add(e2); + + // setup the GUI + this.frame = new JFrame("SimpleDB"); + this.frame.setContentPane(this.cp); + this.cp.setLayout(new BoxLayout(this.cp, BoxLayout.Y_AXIS)); + + this.topPanel.add(new JLabel("Name")); + this.topPanel.add(this.tfName); + this.middlePanel.add(new JLabel("E-Mail-Adresse")); + this.middlePanel.add(this.tfMail); + this.cp.add(this.topPanel); + this.cp.add(this.middlePanel); + + this.bottomPanel.add(this.btBack); + this.bottomPanel.add(this.btAdd); + this.bottomPanel.add(this.btForward); + this.cp.add(this.bottomPanel); + + // set menu + JMenuBar jmb = new JMenuBar(); + JMenu menu = new JMenu("Datei"); + this.frame.setJMenuBar(jmb); + jmb.add(menu); + menu.add(menuNew); + menu.addSeparator(); + menu.add(menuEnd); + + // register all ActionListeners to GUI components + this.btBack.addActionListener(new BackAction()); + this.btForward.addActionListener(new ForwardAction()); + + ActionListener actionAdd = new AddAction(); + this.btAdd.addActionListener(actionAdd); + this.menuNew.addActionListener(actionAdd); + + menuEnd.addActionListener(new EndAction()); + + // initially show current db fields (of index 0) + DBEntry entry = getEntryFromDB(index); + tfName.setText(entry.name); + tfMail.setText(entry.email); + + + this.frame.setSize(800, 200); + this.frame.setVisible(true); + } + + /** + * a simple main which only creates an instance of {@link MainGui}. + * + * @param args cmd line arguments (ignored) + */ + public static void main(String[] args) { + new MainGui(); + } +} +