jkonert
2 years ago
4 changed files with 253 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<classpath> |
|||
<classpathentry kind="src" path="src"/> |
|||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> |
|||
<classpathentry kind="output" path="bin"/> |
|||
</classpath> |
@ -0,0 +1,2 @@ |
|||
/bin/ |
|||
/doc/ |
@ -0,0 +1,17 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<projectDescription> |
|||
<name>GuiProjectW11</name> |
|||
<comment></comment> |
|||
<projects> |
|||
</projects> |
|||
<buildSpec> |
|||
<buildCommand> |
|||
<name>org.eclipse.jdt.core.javabuilder</name> |
|||
<arguments> |
|||
</arguments> |
|||
</buildCommand> |
|||
</buildSpec> |
|||
<natures> |
|||
<nature>org.eclipse.jdt.core.javanature</nature> |
|||
</natures> |
|||
</projectDescription> |
@ -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<DBEntry> database = new ArrayList<DBEntry>(); |
|||
|
|||
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(); |
|||
} |
|||
} |
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue