# 3 Schichten Architektur



## WLanKabel (11. Jan 2011)

Hallo alle zusammen,

ich habe folgendes Problem:

Ich muss für die Schule ein Projekt machen , bzw fertigstellen.
Das Projekt soll eine art "Taskbar" werden, was bis jetzt das kleinere Problem war.
Das alles soll in der  3 Schichten Architektur gestaltet werden , was das Hauptproblem für mich ist, da ich Anfänger auf dem Gebiet Java bin.

Ich habe nun alles struktoriert gemacht und wäre sehr dankbar für Ideen bzw. Hinweiße wie ich das ganze jetzt auf 3 Schichten bekomme. 

Zudem hätte ich noch eine Frage, 

wie ist es möglich per runtime ein externes Programm (.exe) mit Hilfe eines Buttons auszuführen?.

Natürlich habe ich bis hierhin gegoogelt etc, was mich aber mehr verwirrt als weiter gebracht hat.

Ich bin jedem sehr dankbar für einen Vorschlag.


Der Quellcode : 

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.io.*;
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 29.06.2010
  * @author
  */

public class GUI extends JFrame {
  // Anfang Attribute
  private JButton jButton1 = new JButton();
  private JButton jButton2 = new JButton();
  private JButton jButton3 = new JButton();
  private JButton jButton5 = new JButton();
  JMenuBar menu = new JMenuBar();

  private JTextField txtnewtask = new JTextField();
  private JLabel lblnewtask = new JLabel();
  private JButton btnnewtask = new JButton();
  private JTextArea txttask = new JTextArea("");
  private JButton jButton4 = new JButton();
  // Ende Attribute

  public GUI(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 521;
    int frameHeight = 706;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten

    jButton1.setBounds(8, 8, 91, 91);
    ImageIcon bild = new ImageIcon("Icons/eplorer.jpg");
     jButton1.setIcon(bild);
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
        


      }
    });
    cp.add(jButton1);
    jButton2.setBounds(112, 8, 91, 91);
    ImageIcon ie = new ImageIcon("Icons/calc.jpg");
     jButton2.setIcon(ie);
    jButton2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton2_ActionPerformed(evt);
      }
    });
    cp.add(jButton2);
    jButton3.setBounds(256, 288, 179, 33);
    jButton3.setText("Browser");
    jButton3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton3_ActionPerformed(evt);
      }
    });
    cp.add(jButton3);
    jButton5.setBounds(104, 640, 91, 25);
    jButton5.setText("Beenden");
    jButton5.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton5_ActionPerformed(evt);
        
        dispose();
      }
    });
    cp.add(jButton5);
    
    cp.add(btnnewtask);
    txttask.setBounds(8, 264, 177, 153);
    txttask.setText("current tasks");
    cp.add(txttask);
    
    
    jButton4.setBounds(224, 8, 91, 91);
    jButton4.setMargin(new Insets(2, 2, 2, 2));
    ImageIcon klndr = new ImageIcon("Icons/kalender.gif");
     jButton4.setIcon(klndr);
     
    jButton4.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton4_ActionPerformed(evt);
      }
    });
    
    
    setJMenuBar(menu);                     // Menubar

    JMenu datei = new JMenu("Datei");
    JMenu optionen = new JMenu("Optionen"); // Menus
    JMenu help = new JMenu("?");
        menu.add(datei);
        menu.add(optionen);
        menu.add(help);

        JMenuItem speichern = new JMenuItem("Speichern");  //Menuitems
        JMenuItem reset = new JMenuItem("Reset");           // datei
        JMenuItem beenden = new JMenuItem("Beenden");
        datei.add(speichern);
        datei.add(reset);
        datei.add(beenden);
        
        beenden.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
        dispose();
          }
          
         });
       



        JMenuItem erweitert = new JMenuItem("erweiterte Optionen");
        JCheckBoxMenuItem uhr = new JCheckBoxMenuItem("Uhr anzeigen");          //Menuitems optionen
        JCheckBoxMenuItem kalender = new JCheckBoxMenuItem("Kalender anzeigen");
        JCheckBoxMenuItem calc = new JCheckBoxMenuItem("Rechner anzeigen");
        JCheckBoxMenuItem taskplaner = new JCheckBoxMenuItem("Taskplaner anzeigen");
        JCheckBoxMenuItem links = new JCheckBoxMenuItem("Eingabe-Links anzeigen");
        optionen.add(erweitert);
        optionen.add(uhr);
        optionen.add(kalender);
        optionen.add(calc);
        optionen.add(taskplaner);
        optionen.add(links);
        uhr.setState(true);
        kalender.setState(true);
        calc.setState(true);
        taskplaner.setState(true);
        links.setState(true);

        JMenuItem faq = new JMenuItem("F.A.Q.");
        help.add(faq);


    txtnewtask.setBounds(8, 224, 137, 24);
    txtnewtask.setText("");
    cp.add(txtnewtask);
    lblnewtask.setBounds(48, 192, 114, 24);
    lblnewtask.setText("newTask:");
    lblnewtask.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(lblnewtask);
    btnnewtask.setBounds(144, 224, 33, 25);
    btnnewtask.setText("+");
    btnnewtask.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        btnnewtask_ActionPerformed(evt);
      }
    });

    cp.add(jButton4);
    // Ende Komponenten

    setResizable(true);
    setVisible(true);
  }

  // Anfang Methoden
  public void jButton1_ActionPerformed(ActionEvent evt) {
         try  {
          Runtime rt = Runtime.getRuntime();
          Process proc = rt.exec("explorer");            //Funktion - Explorer
         } catch (Throwable t){
         t.printStackTrace();
         }
  }

  public void jButton2_ActionPerformed(ActionEvent evt) {
    try  {
          Runtime rt = Runtime.getRuntime();
          Process proc = rt.exec("calc");            //Funktion - Rechner
         } catch (Throwable t){
         t.printStackTrace();
         }
  }

  public void jButton3_ActionPerformed(ActionEvent evt) {

         try  {
          Runtime rt = Runtime.getRuntime();
          Process proc = rt.exec("firefox");            //Funktion - Internet
         } catch (Throwable t){
         t.printStackTrace();
         }

  }

  public void jButton4_ActionPerformed(ActionEvent evt) {
     try  {
          Runtime rt = Runtime.getRuntime();
          Process proc = rt.exec("/Uhr32/Uhr32.exe");            //Funktion - Kalender
         } catch (Throwable t){
         t.printStackTrace();
         }
         

         
         
         
  }

  public void jButton5_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  public void btnnewtask_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
  }

  // Ende Methoden

  public static void main(String[] args) {
    new GUI("GUI");
  }
}
```


----------



## MQue (11. Jan 2011)

Also wenn du das ganze in 3 Schichten unterteilen willst, musst du dich zuerst mal mit dem Observer- Pattern auseinandersetzen, 
Dann musst du aus deiner GUI- Klasse alles, was einer Logik entspricht, in eine Klasse (namens GUIController) geben. Im Model befinden sich die Daten, welche du in der GUI anzeigen/manipulieren/... willst.
Schau dir am Besten mal den MVC- Code hier an: Index of /german_examples/hfdesignpatger - da ist es ganz gut erklärt.
Ich würde aber mal sagen, dass es ein häftiger Einstieg für einen Anfänger ist, aber man soll sich eh hohe Ziele stecken.

Das mit der Runtime, vielleicht hilft dir das weiter:


```
import java.io.IOException; 
public class RuntimeExec{
    public static void main(String[] args){
    try
    {
    Process process = Runtime.getRuntime()
.exec("notepad.exe");
    }catch (IOException e)
    {
     e.printStackTrace();
    }
  }
}
```


----------



## WLanKabel (11. Jan 2011)

Ja das mit der Runtime hatte ich so ähnlich schon versucht bzw. gefunden, hat nich ganz sooo geklappt,
wie genau bezieh ich das auf ein Button? , per Action Listener? Wozu dann die Klasse "Runtime"?.

Systemprozesse funktionieren , oben im QC hab ich ja auch mehrere Runtime Funktionen mit nem Button, 
der Unterschied ist, die Funktionen im QC sprechen Windows "Programme" an, sowas wie Calc , oder Explorer, ist ja vordefiniert , nur wie auch immer ich das mit einem externen Programm mach also in meinem Fall einer reinen .exe.

Aber ich danke dir für deine Hilfe!!


----------



## CroniD (12. Jan 2011)

Bezüglich dem ausführen externer Programme:
Galileo Computing :: Java ist auch eine Insel – 11.5 Ausführen externer Programme *

Das komplette Buch "Java ist auch eine Insel Auflage 9" ist online komplett einsehbar. Wird dir mit Sicherheit weiterhelfen, weil unglaublich viele Code Beispiele integriert sind und diese anschaulich für einen Alltagsprogrammierer und auch Anfänger beschrieben sind.


----------



## Gast2 (12. Jan 2011)

MQue hat gesagt.:


> Also wenn du das ganze in 3 Schichten unterteilen willst, musst du dich zuerst mal mit dem Observer- Pattern auseinandersetzen,
> Dann musst du aus deiner GUI- Klasse alles, was einer Logik entspricht, in eine Klasse (namens GUIController) geben. Im Model befinden sich die Daten, welche du in der GUI anzeigen/manipulieren/... willst.
> Schau dir am Besten mal den MVC- Code



MVC hat aber nichts mit 3 Schichten Architektur zu tun, das sollte man nicht verwechseln.
MVC ist nur ein Architekturmuster für die GUI Programmierung.

Im wiki steht grob was die 3 Schichten sein sollten.
Schichtenarchitektur ? Wikipedia

1. Präsentationschicht(MVC)
2. ServiceSchicht(Logik, evt. entfernte Aufrufe)
3. Datenhaltung Schicht/DB Schicht(PerstizenzSchicht)


----------



## WLanKabel (12. Jan 2011)

Danke für die Hilfe, 

ja was die 3 Schichten Architektur macht und bringt ist mir auch klar,  nur wie ich diese in Java umsetze verstehe ich nicht , habe auch leider noch keien Beispiele im Netz finden können , ich stell mir das in etwa vor wie bei Css / php ?

Wäre nett wenn mir jemand einfach nur den QC geben könnte bzw. ein Beispiel zur umsetzung in Java,

Danke


----------



## Gast2 (12. Jan 2011)

WLanKabel hat gesagt.:


> Danke für die Hilfe,
> 
> ja was die 3 Schichten Architektur macht und bringt ist mir auch klar,  nur wie ich diese in Java umsetze verstehe ich nicht , habe auch leider noch keien Beispiele im Netz finden können , ich stell mir das in etwa vor wie bei Css / php ?
> 
> ...



Hab dir mal ein jar (mit src) zusammengebaut das ist eine einfache Möglichkeit es umzusetzen und soll dir nur als Bsp. dienen. Natürlich sind keine Serveraufrufe und DBKlassen implementiert aber druch das packaging angedeutet wie es sein könnte.

1. Päsentationschicht ist mit MVC umgesetzt die controller sind jeweils anonyme Listener an den GUI Klassen... In den package view ist die GUI in den package model das DomainModel!!! 
2. Logikschicht ist in den package controller und service (hier könnten externe service aufrufe rein)
3. PersitenzSchicht in den package dao wo du auf deine Daten zugreifen könntest ist auch nur angedeutet und müsste fertig entwickelt werden.


----------



## WLanKabel (12. Jan 2011)

Puh , ich danke dir für die Mühe , nur is das ein wenig zu "heftig" für mich.

Hatten das im Unterricht schlicht mit 3 Klassen bzw. Objekten? 

Gui , Speicher , Funktionen.

Das zu erstellen ist kein Problem nur wie verknüpfe ich das ganze?

Sprich , wie kann ich meine Oberfläche rein auf der Gui laufen lassen , Buttons etc , und deren Funktionen separat auslagern?

Hoffe das macht das gesamtkonzept ein bisschen einfacher, sprich wie bekomme ich den QC von mir oben in diese 3 Schichten?

Aber nochmals Danke für die Jar , geholfen hat sie nur der Überblick fällt mir ein wenig schwer.


----------



## Gast2 (12. Jan 2011)

WLanKabel hat gesagt.:


> Puh , ich danke dir für die Mühe , nur is das ein wenig zu "heftig" für mich.
> 
> Hatten das im Unterricht schlicht mit 3 Klassen bzw. Objekten?
> 
> ...



Der Code ist einfach schau ihn dir in Ruhe an dann siehst du es...
Pattern brauchst Observer und MVC das musst dir halt aneignen.


----------

