# GUI - Eingabe-und Ausgabefenster



## anfaenger5 (20. Jun 2016)

Hallo liebe Community,
ich bin ganz neu hier und habe ein paar Fragen zum obig genannten Thema.
Ich muss als Teil meiner mündlichen Prüfung ein Beispiel in Java(also objektorientiert) programmieren.
Leider ist das Thema so lange her, dass ich mich sehr schwer damit tue.
Ich habe einen Programmcode geschrieben in dem man die Quadratmeterzahl seines Ackers und den möglichen Verkaufspreis errechnen lassen kann.
Ausgewählt habe ich ihn nur, weil ich dazu ein prozedural programmiertes Beispiel aus dem Internet habe ( und mein Prüfungsthema: Prozedurale versus objektorientierte Programmierung ist) .
Ich möchte nun mit der Nutzeroberfläche eine Eingabe von Länge und Breite des Ackers ermöglichen und das Ergebnis des Verkaufspreises anzeigen lassen.
Da selbst mein Code Errors anzeigt und ich diese nicht weg kriege, hoffe ich jemand kann mir helfen.
Bitte nicht auf Google oder ein Youtube Tutorial verweisen, da ich schon alles mögliche eingegeben habe und versucht habe.
Ich habe bereits verstanden wie ich eine Nutzeroberfläche machen kann(mit Frame) und auch wie ich Textfelder und Buttons einfüge, aber wie ich Dinge darauf schreiben kann wie ,,Bitte Länge eingeben'' oder wie ich das Ergebnis dort ausgeben kann habe ich einfach nicht verstanden.

Anbei meine Main-Methode:


```
public class Landwirtschaft {
  public static void main(String[] args) {
  public Landwirtschaft (int laenge, int breite, int preis, int flaeche, int gesamtpreis) {
    this.laenge=laenge;
    this.breite=breite;                                       
    this.preis=preis;
    this.flaeche=flaeche;
    this.gesamtpreis=gesamtpreis;
  }
  public int getLaenge() {
    return laenge;
  }
  public void setLaenge(int laenge) {
    this.laenge=laenge;
  }
  public int getBreite() {
    return breite;
  }
  public void setBreite(int breite) {
    this.breite=breite;
  }
  public int getPreis() {
    return preis;
  }
  public void setPreis(int preis) {
    this.preis=preis;
  }
  public int berechneFlaeche() {
    int flaeche;
    flaeche=this.breite * this.laenge;
    return flaeche;
  }
  public int berechneGesamtpreis() {
    int gesamtpreis;
    gesamtpreis=this.flaeche * this.preis;
    return gesamtpreis;
  }
}
```


ps. Ich habe es zuerst mit IOTools gemacht aber ich darf keine ''neue'' Klasse auf dem Schulcomputer importieren, deshalb muss ich das jetzt mit dem GUI machen.

Liebe Grüße,
anfaenger5


----------



## Sugan (20. Jun 2016)

Hi,

erstmal ein paar Kleinigkeiten:
Java-Code bitte als solchen einfügen! (obere Zeile "Einfügen..." -> "Code" -> Sprache = Java)
Und stell bitte in Zukunft etwas komkretere Fragen, wie z.B. Wie kann ich Objekten der GUI (JButton, JTextfield...) beschriften?

Dann zu deinem Problem:

Alsoooo
Du bist neu, das merkt man, ist aber nicht schlimm, das waren wir alle mal. Dennoch: Der Name Objektorientierte Programmierung kommt nicht von ungefähr, du solltest dir bewusst sein, was das heißt. In deinem Fall lässt sich prima ein Objekt von der Klasse Landwirtschaft erzeugen. Das "public static void main(String[] args) {}" hat meiner Meinung nach aber nichts in dieser Klasse verloren. (Es ist die Methode, die bei Programmstart zuerst ausgeführt wird.) Stattdessen brauchst du eine neue Klasse ( z.B. MainClass), die über diese Methode ein neues Objekt der Landwirtschaft erzeugt:


```
public class MainClass  {
   
    public static void main (String args[]){       
        Landwirtschaft landwirtschaft = new Landwirtschaft(10, 10, 100);   
    }                   
}
```

Nicht über die Parameter wundern, ich habe für mich "int flaeche, int gesamtpreis" aus den zu übergebenen Parametern gelöscht, weil es unsinnig wäre, wenn der Benutzer die Fläche und Gesamtpreis erst dem Programm nennen müsste. Das Programm soll diese Werte ja selber erechnen aus den nötigen (und daher im Konstruktor zu übergebenen) Parametern. Die Klasse MainClass muss dem Konstruktor natürlich auch irgendwelche Werte übergeben, die Werte 10, 10 und 100 sind von mir frei gewählt und können aber durch deine Setter ( setLaenge(), setBreite(),usw...) geändert werden.

Jetzt sollte deinn Programm immerhin keine Errors mehr ausspucken.

Du solltest dir dann überlegen, wie der Nutzer werte ändern soll, bzw, wie das Programm die Errechneten Werte ausgibt. Es gibt mindestens 2 Grundlegende Möglichkeiten: 

1. über die Konsole
2. über ein Fenster

Das erste ist viel leichter und schneller, das zweite wirkt natürlich schöner, benötigt aber eineges mehr an Wissen, denn du müsstest ein JFrame öffnen
wieder 2 Möglichkeiten: 
a) eigene Klasse schreiben, die von der Klasse JFrame erbt z.B. "public class MeinFenster extends JFrame{...}"
b) in der Klasse MainClass ein neues Objekt der Klasse JFrame öffnen: "Jframe meinJFrame = new JFrame();"

a ist eleganter 
dann musst du die Komponenten (alles Objekte), die angezeigt werden sollen zu deinem JFrame hinzufügen über "meinJFrame.add(button)" (vorher natürlich das Objekt button erzeugen)

Dann zurück zu deiner eigentlichen Frage: Werte ausgeben tust du am besten über ein JLabel, Werte eingeben über ein JTextField. Beschriften kannst du am besten Auch über JLabel...

Du hast zwar gesagt, du willst keine Links, aber ich empfehle dir diese Reihe an YoutubeVideos (auf Deutsch), die haben mir sehr gut geholfen und erklären alles was du wissen musst für jeden Anfänger sehr verständlich: 





LG
Sugan


----------



## StarSheriff (21. Jun 2016)

Kurzfassung:


```
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Landwirtschaftsrechner extends JPanel
{
   private JButton btnBerechne = new JButton();
   private JLabel lblLaenge = new JLabel();
   private JLabel lblBreite = new JLabel();
   private JLabel lblQmPreis = new JLabel();
   private JTextField txtLaenge = new JTextField();
   private JTextField txtBreite = new JTextField();
   private JTextField txtQmPreis = new JTextField();
   private JLabel lblFlaeche = new JLabel();
   private JLabel lblFlaecheErgebnis = new JLabel();
   private JLabel lblGesamtPreis = new JLabel();
   private JLabel lblGesamtPreisErgebnis = new JLabel();
   
   public Landwirtschaftsrechner()
   {
     initPanel();
     initControls();
   }

   private void initPanel()
   {
     GridBagLayout layout = new GridBagLayout();
     this.setLayout(layout);
     GridBagConstraints cc = new GridBagConstraints();
     
     cc.gridx = 0;
     cc.gridy = 0;
     lblLaenge.setText("Länge");
     this.add(lblLaenge, cc);
     
     cc.gridx = 1;
     lblBreite.setText("Breite");
     this.add(lblBreite, cc);
     
     cc.gridx = 2;
     lblQmPreis.setText("qm-Preis");
     this.add(lblQmPreis, cc);
     
     
     cc.gridx = 0;
     cc.gridy = 1;
     txtLaenge.setPreferredSize(new Dimension(100, 40));
     this.add(txtLaenge, cc);
     
     cc.gridx = 1;
     txtBreite.setPreferredSize(new Dimension(100, 40));
     this.add(txtBreite, cc);
     
     cc.gridx = 2;
     txtQmPreis.setPreferredSize(new Dimension(100, 40));
     this.add(txtQmPreis, cc);
     
     cc.gridx = 0;
     cc.gridwidth = 3;
     cc.gridy = 2;
     btnBerechne.setText("Berechne Landwirtschaft");
     this.add(btnBerechne, cc);
     
     cc.gridwidth = 1;
     cc.gridy = 3;
     lblFlaeche.setText("Fläche der Landwirtschaft");
     this.add(lblFlaeche, cc);
     
     cc.gridx = 2;
     lblGesamtPreis.setText("Gesamtwert der Landwirtschaft");
     this.add(lblGesamtPreis, cc);
     
     cc.gridx = 0;
     cc.gridy = 4;
     this.add(lblFlaecheErgebnis, cc);
     
     cc.gridx = 2;
     this.add(lblGesamtPreisErgebnis, cc);
     
     
     
     
   }

   private void initControls()
   {
     btnBerechne.addActionListener(new ActionListener()
     {
       
       @Override
       public void actionPerformed(ActionEvent e)
       {
         try
         {
           double laenge = Double.parseDouble(txtLaenge.getText());
           double breite = Double.parseDouble(txtBreite.getText());
           double preis = Double.parseDouble(txtQmPreis.getText());
           
           lblFlaecheErgebnis.setText((laenge * breite) + " qm");
           lblGesamtPreisErgebnis.setText((laenge * breite * preis) + " EURO");
         }
         catch (NumberFormatException nfe)
         {
           System.out.println("Doldie.... gib halt Zahlen ein");
         }
         
       }
     });
     
   }
}
```

Achtung: Das ist noch nicht die geforderte Lösung. Du solltest dir über ein Objekt Landwirtschaft Gedanken machen, dass du bei Drücken des Knopfes erzeugst/aufrufst. In diesem Objekt kannst du dann deine Methoden aufrufen/ausimplementieren, die dir die Gesamtfläche, den Gesamtwert oder sonst irgendwelche Dinge deiner Landwirtschaft berechnen.

Ich denke aber dass dir das Beispiel zeigt, wie du Komponenten in Swing referenzierst und ihnen Werte zuweist zur Ausgabe.


----------



## AndiE (21. Jun 2016)

Momentan erscheint mir das Ganze noch nicht recht klar. Wenn du das Programm objektorientiert schreibst, brauchst du mehrere Klassen. dabei ist eines die Klasse, die berechnet(Landwirtschaft), und eine die Klasse die die andere Klasse aufruft(Start). Das widerspricht aber deiner Aussage, dass du keine neue Klasse erstellen darfst. Habe ich da was falsch verstanden? Das Interessante bei der OOP ist dann, dass du die Klasse Start so umschreiben kannst, dass sie eine Klasse "Anzeige" aufruft, die dann die GUI in sich kapselt und mit "Landwirtschaft" kommuniziert.


----------



## anfaenger5 (21. Jun 2016)

Vielen Dank für die Antworten!
Ich darf kein neues Java Paket in Java importieren.Damit meine ich, dass ich IOTools zuhause heruntergeladen und in mein Java importiert habe und sowas darf ich in der Schule nicht.
Es soll am Lehrplan entlang verlaufen, deshalb kann ich auch nicht mit Swing arbeiten.
Ich habe mich für die Konsolenausgabe mit Hilfe des Scanners entschieden und das hat sehr gut funktioniert.
Danke trotzdem für die Anregungen und Möglichkeiten 
Ich werde mich nach meiner Prüfung noch etwas besser damit auseinandersetzen, da mich meine Unwissenheit in manchen Dingen doch sehr nervt und mich die Möglichkeiten die Java mit sich bringt sehr interessieren.

Ganz liebe Grüße,
Anfaenger5


----------

