import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class A_Speiseplanverwaltung extends JPanel implements ActionListener{
private Statement st;
private JButton button1, button2;
private JFormattedTextField TF_Datum;
private JPanel p2;
private JScrollPane AnzeigeScrollen;
private DecimalFormat DF;
public A_Speiseplanverwaltung(Statement st) {
this.st = st;
//Panels
JPanel p0 = new JPanel();
JPanel p1 = new JPanel();
p2 = new JPanel();
//Layout festlegen
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
p0.setLayout(gbl);
p1.setLayout(gbl);
p2.setLayout(null);
this.setLayout(gbl);
//Komponenten erstellen
//Labels
JLabel L_Beschreibung = new JLabel("Beschreibung:", JLabel.LEFT);
JLabel L_Preis = new JLabel("Preis (in \u20AC):", JLabel.LEFT);
JLabel L_Kategorie = new JLabel("Kategorie:", JLabel.LEFT);
JLabel L_Vegetarisch = new JLabel("Vegetarisch:", JLabel.LEFT);
JLabel L_Datum = new JLabel("<html>Datum: <font size=2>(JJJJ-MM-TT)</font></html>", JLabel.LEFT);
JLabel L_Datum2 = new JLabel("Datum:");
//Datumsfeld
TF_Datum = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
TF_Datum.setPreferredSize(new Dimension(70,20));
TF_Datum.addFocusListener(new FocusAdapter(){
public void focusLost(FocusEvent e){
//Damit ein leeres Feld moeglich ist, nachdem schon mal ein korrektes eingegeben wurde
if(TF_Datum.getText().length()==0){
TF_Datum.setValue(null);
}
}
});
TF_Datum.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyChar() == KeyEvent.VK_ENTER)
//Umleiten auf actionPerformed Methode
button1.doClick();
}
});
//Buttons
button1 = new JButton("Anzeigen");
button1.setToolTipText("Leer lassen um alle anzuzeigen, 1111-11-11 f\u00fcr dauerhafte Daten im System");
//... Listener hinzufügen
button1.addActionListener(this);
// JScrollPane
AnzeigeScrollen = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
AnzeigeScrollen.setPreferredSize(new Dimension(800,600));
AnzeigeScrollen.add(p2);
AnzeigeScrollen.setViewportView(p2);
AnzeigeScrollen.setBorder(BorderFactory.createTitledBorder("Speisepl\u00e4ne"));
AnzeigeScrollen.getVerticalScrollBar().setUnitIncrement(10); //Scrollgeschwindigkeit
AnzeigeScrollen.getVerticalScrollBar().setBlockIncrement(10); //Scrollgeschwindigkeit an den pfeilen
// Objekte auf dem Panel Ueberschriften platzieren
L_Beschreibung.setBounds(30, 0, 200, 20);
L_Preis.setBounds(300, 0, 200, 20);
L_Kategorie.setBounds(400, 0, 100, 20);
L_Vegetarisch.setBounds(500, 0, 100, 20);
L_Datum2.setBounds(610, 0, 100, 20);
JPanel Ueberschriften = new JPanel();
Ueberschriften.setLayout(null);
Ueberschriften.setPreferredSize(new Dimension(770,20));
Ueberschriften.add(L_Beschreibung);
Ueberschriften.add(L_Preis);
Ueberschriften.add(L_Kategorie);
Ueberschriften.add(L_Vegetarisch);
Ueberschriften.add(L_Datum2);
AnzeigeScrollen.setColumnHeaderView(Ueberschriften);
Insets i = new Insets(5, 5, 5, 5); //Minimale Entfernung der Komponenten zum Rand (oben,links,unten,rechts)
Insets j = new Insets(15, 50, 0, 50);
int a = 5;
int b = 10;
//Layout festlegen für p0 und Komponenten hinzufügen
//Constraints festlgen: Component x y w h wx wy fill anchor ipad x y insets
Init.buildConstraints(p0, gbl, gbc, L_Datum, 0, 0, 1, 1, 0, 0, GridBagConstraints.NONE, GridBagConstraints.WEST, 0, a, i);
Init.buildConstraints(p0, gbl, gbc, TF_Datum, 1, 0, 1, 1, 0, 0, GridBagConstraints.NONE, GridBagConstraints.WEST, 0, a, i);
Init.buildConstraints(p0, gbl, gbc, button1, 0, 1, 2, 1, 0, 0, GridBagConstraints.NONE, GridBagConstraints.CENTER, 0, a, i);
//Layout festlegen für p1 und p0 p1 hinzufügen
//Constraints festlgen: Component x y w h wx wy fill anchor ipad x y insets
Init.buildConstraints(p1, gbl, gbc, p0, 0, 0, 1, 1, 0, 0, GridBagConstraints.NONE, GridBagConstraints.NORTH, 0, 0, i);
//Layout festlegen für this und Komponenten hinzufügen
//Constraints festlgen: Component x y w h wx wy fill anchor ipad x y insets
Init.buildConstraints(this, gbl, gbc, p1, 0, 0, 1, 1, 100, 5, GridBagConstraints.HORIZONTAL, GridBagConstraints.NORTH, 0, 0, j);
Init.buildConstraints(this, gbl, gbc, AnzeigeScrollen, 0, 2, 1, 1, 100, 50, GridBagConstraints.BOTH, GridBagConstraints.NORTH, 0, 0, new Insets(0,150,50,150));
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == button1.getText()){
holeEssen(TF_Datum.getText());
}
}
public void holeEssen(final String Datum){
p2.removeAll();
ResultSet res = null;
try{
if (Datum.length() == 10){
res = st.executeQuery("SELECT * FROM speiseplan WHERE Datum = '"+Datum+"' order by Datum ASC, Kategorie ASC, Speiseplan_ID ASC;");
}
// Wenn Datumstextfeld leer ist, hole alle Daten
if (Datum.equals("")){
res = st.executeQuery("SELECT * FROM speiseplan order by Datum ASC, Kategorie ASC, Speiseplan_ID ASC;");
}
// j wird benoetigt um die Datenarray zu initialisieren
int j = 0;
while (res.next()){
j++;
}
if(j == 0){
JOptionPane.showConfirmDialog(null,"<html>Fehler!
Keine Speiseplandaten f\u00FCr das Datum "+Datum+" vorhanden!</html>", "Fehler", JOptionPane.CLOSED_OPTION, JOptionPane.ERROR_MESSAGE);
p2.setPreferredSize(new Dimension(600,20));
}
res.first();
//Benoetigte Objekte definieren
JButton[] B_Loeschen = new JButton[j];
JButton[] B_Aendern = new JButton[j];
final JTextField[][] Daten = new JTextField[j][2];
final JTextArea[] Beschreibung = new JTextArea[j];
final String[] Speiseplan_ID = new String[j];
final JRadioButton[][] Kategorie = new JRadioButton[j][3];
ButtonGroup[] g = new ButtonGroup[j];
final JCheckBox[] Vegetarisch = new JCheckBox[j];
DF = new DecimalFormat();
DF.setMaximumIntegerDigits(2); // maximal 2 zeichen vor dem Komma
DF.setMaximumFractionDigits(2); //maximal 2 zeichen nach dem Komma
DF.setGroupingUsed(false); //keine Trennpunkte z.B. 1.000
final JFormattedTextField[] TF_Preis = new JFormattedTextField[j];
final JFormattedTextField[] TF_Datum = new JFormattedTextField[j];
// Objekte erzeugen und mit Daten fuellen
for(int i = 0; i < j; i++){
final String DB_Speiseplan_ID = res.getString("Speiseplan_ID");
String DB_Beschreibung = res.getString("Beschreibung");
final String DB_Preis = res.getString("Preis");
String DB_Kategorie = res.getString("Kategorie");
String DB_Vegetarisch = res.getString("Vegetarisch");
final String DB_Datum = res.getString("Datum");
//Button um Menues zu loeschen
B_Loeschen[i] = new JButton(new ImageIcon(getClass().getResource("Delete24.gif")));
B_Loeschen[i].setBounds(700, 73 + i * 200, 24, 24);
B_Loeschen[i].setFocusPainted(false);
B_Loeschen[i].setContentAreaFilled(false);
B_Loeschen[i].setToolTipText("L\u00f6scht die Daten aus der Datenbank");
B_Loeschen[i].setActionCommand(""+i);
B_Loeschen[i].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
loescheEssen(Speiseplan_ID[Integer.parseInt(e.getActionCommand())]);
p2.removeAll();
p2.updateUI();
holeEssen(Datum);
}});
//Button um Aenderungen an den Menues zu speichern
B_Aendern[i] = new JButton(new ImageIcon(getClass().getResource("Save24.gif")));
B_Aendern[i].setBounds(740, 73 + i * 200, 24, 24);
B_Aendern[i].setFocusPainted(false);
B_Aendern[i].setContentAreaFilled(false);
B_Aendern[i].setToolTipText("Speichert die \u00c4nderungen");
B_Aendern[i].setActionCommand(""+i);
B_Aendern[i].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//Damit die richtigen Daten geholt werden
int zahl = Integer.parseInt(e.getActionCommand());
//Wert aus der Checkbox als konkrete Zahl in die DB speichern
String tempVegetarisch;
if(Vegetarisch[zahl].isSelected()){
tempVegetarisch = "1";
}else{
tempVegetarisch = "0";
}
//Werte aus den RadioButtons als konkrete Zahlen in die DB speichern
String tempKategorie;
if(Kategorie[zahl][0].isSelected()){
tempKategorie = "1";
}else{
if(Kategorie[zahl][1].isSelected()){
tempKategorie = "2";
}else{
tempKategorie = "3";
}
}
updateEssen(Speiseplan_ID[zahl], Beschreibung[zahl].getText(), A_SpeisenEinstellen.preisKommaToPoint(TF_Preis[zahl].getText()),tempKategorie, tempVegetarisch);
p2.removeAll();
p2.updateUI();
holeEssen(Datum);
}});
//Speiseplan_ID, nur fuer Abfrage in den Buttons wichtig
Speiseplan_ID[i] = new String(DB_Speiseplan_ID);
//Preis TextFeld
TF_Preis[i] = new JFormattedTextField(DF);
TF_Preis[i].setText(A_SpeisenEinstellen.preisPointToKomma(DB_Preis));
TF_Preis[i].setHorizontalAlignment(JTextField.RIGHT);
TF_Preis[i].setBounds(280,75 + i * 200, 100, 20);
TF_Preis[i].setBackground(p2.getBackground());
TF_Preis[i].setName(""+i); //Damit das Feld beim FocusListener identifiziert werden kann
TF_Preis[i].addFocusListener(new FocusAdapter(){
public void focusLost(FocusEvent e){
int Zahl = Integer.parseInt(e.getComponent().getName());
TF_Preis[Zahl].setText(A_SpeisenEinstellen.nonNegativ(TF_Preis[Zahl].getText()));
}
});
// Datums TextFeld
TF_Datum[i] = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
TF_Datum[i].setText(DB_Datum);
TF_Datum[i].setBounds(600,75 + i * 200, 70, 20);
TF_Datum[i].setBackground(p2.getBackground());
// Beschreibungs TextArea
Beschreibung[i] = new JTextArea(DB_Beschreibung);
Beschreibung[i].setBounds(10, 10 + i * 200, 200, 150);
Beschreibung[i].setBackground(p2.getBackground());
Beschreibung[i].setBorder(BorderFactory.createEtchedBorder());
//Beschreibung[i].setCaretPosition(1);
//Beschreibung[i].setCaretColor(Color.BLUE);
//Kategorie Radiobuttons + Group
Kategorie[i][0] = new JRadioButton("Men\u00fc");
Kategorie[i][0].setBounds(400, 45 + i * 200, 100, 20);
Kategorie[i][1] = new JRadioButton("Getr\u00e4nk");
Kategorie[i][1].setBounds(400, 75 + i * 200, 100, 20);
Kategorie[i][2] = new JRadioButton("Dessert");
Kategorie[i][2].setBounds(400, 105 + i * 200, 100, 20);
g[i] = new ButtonGroup();
g[i].add(Kategorie[i][0]);
g[i].add(Kategorie[i][1]);
g[i].add(Kategorie[i][2]);
Kategorie[i][Integer.parseInt(DB_Kategorie)-1].setSelected(true);
// Vegetarisch Checkbox
Vegetarisch[i] = new JCheckBox("ja");
if(Integer.parseInt(DB_Vegetarisch) == 1){
Vegetarisch[i].setSelected(true);
}
Vegetarisch[i].setBounds(520, 75 + i*200, 40, 20);
//Objekte zu p2 hinzufuegen
p2.add(Beschreibung[i]);
p2.add(TF_Preis[i]);
p2.add(Vegetarisch[i]);
p2.add(TF_Datum[i]);
p2.add(B_Loeschen[i]);
p2.add(B_Aendern[i]);
for(int k = 0; k < 3; k++){
p2.add(Kategorie[i][k]);
}
JSeparator linie = new JSeparator();
linie.setBounds(5, 185 + i*200, 760, 1);
p2.add(linie);
p2.setPreferredSize(new Dimension(770, (200*j)-30));
res.next();
}
p2.updateUI();
//Beschreibung[0].setCaretPosition(1); //Focus auf das erste Feld, damit der Scrollbalken oben ist
AnzeigeScrollen.getVerticalScrollBar().setValue(1);
}catch(SQLException error){
System.out.println("Fehler in DBStorno");
JOptionPane.showConfirmDialog(null,"<html>Fehler!
Keine Datum angegeben!
Oder keine Speisepl\u00e4ne f\u00fcr das Datum bekannt!</html>", "Fehler", JOptionPane.CLOSED_OPTION, JOptionPane.ERROR_MESSAGE);
}
}
public void loescheEssen(String SpeiseplanID){
try {
st.executeUpdate("Delete From speiseplan Where speiseplan.Speiseplan_ID = "+SpeiseplanID+";");
} catch (SQLException e) {
System.out.println("Fehler in loescheEssen");
}
}
public void updateEssen(String SpeiseplanID, String Beschreibung, String Preis, String Kategorie, String Vegetarisch){
try {
st.executeUpdate("UPDATE `speiseplan` SET `Beschreibung` = '" +Beschreibung+"', Preis = '"+Preis+"', Kategorie = '"+Kategorie+"', Vegetarisch = '"+Vegetarisch+"'Where Speiseplan_ID = "+SpeiseplanID+";" );
} catch (SQLException e) {
System.out.println("Fehler in updateEssen");
}
}
public long timestamp(String tempDatum){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
long time;
try{
time = sdf.parse(tempDatum).getTime();
}catch(ParseException e){
time = 0;
}
return time;
}
//Zurücksetzen bzw. aktualisieren und fokussieren
public void zuruecksetzen() {
TF_Datum.setText("");
p2.removeAll();
p2.setPreferredSize(new Dimension(0,0));
}
}