Class-übergreifende GUI

Hi,

ich bin gerade am Erstellen eines kleines Programms, dass ein paar kleine Funktionen haben soll. Dies möchte ich gerne über verschiedene Klassen lösen, da ich das für übersichtlicher halte. Da ich das ganze gerne über eine GUI machen würde, habe ich jedoch ein Problem - ich weiss nicht wie ich die Texteingabe über mehrere Klassen ermöglichen kann.

  1. Klasse (um alles unnötige reduziert)
import static SonstigeOperationen.Wiederstaende.wiederstande;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Jeannie implements KeyListener{
    
    JFrame hauptprogramm = new JFrame();    
    final JTextField eingabeaufforderung = new JTextField();
    
    
    public static void main (String [] args){
         Jeannie start = new Jeannie();
    }
    
    public Jeannie () {
            
            //Groesse setzen
                //Bildschrimaufloesung abgragen
                Toolkit tk = Toolkit.getDefaultToolkit();
                Dimension d = tk.getScreenSize();
                //Frame 300 Pixel breit und 40 Pixel kleiner als der Maxiamaler Bildschirm
                hauptprogramm.setSize(d.width-500, 100);
            //Ort setzen
            hauptprogramm.setLocation(75,d.height-120);
            //Kein Rahmen
            hauptprogramm.setUndecorated(true);
            //Keine Groessenveraenderung
            hauptprogramm.setResizable( false );
            //Hintergrundfarbe
            eingabeaufforderung.addKeyListener((KeyListener) this);
            hauptprogramm.add(eingabeaufforderung);
            hauptprogramm.setVisible(true);    
    }

    
    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER){
            String eingabe = eingabeaufforderung.getText();            
            antwortUntersuchen(eingabe);
            eingabeaufforderung.setText("");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
            }
    
   private void antwortUntersuchen(String eingabe){
       if (eingabe.equalsIgnoreCase("Ende")){
           System.out.println(eingabe);
           System.exit(0);
           
       }
       else{
           if else if (eingabe.equalsIgnoreCase("Wiederstand")){
               System.out.println(eingabe);               
               wiederstande ();
           }
           else{
               //Hier kommt noch was hin
               }
       }
   }
    
}

und die zweite Klasse

import java.util.Scanner;

public class Wiederstaende extends javax.swing.JFrame{

       
    public static void wiederstande (){
       int i = 0;
       int [] wiederstandswerte = new int [2];
       String farbcode = "";
       String toleranz = "";
       
              
       while (i < 4){
           System.out.println("Bitte geben sie die " + (i+1) + " farbe an."); 
           String farbe = eingabeaufforderung.getText();    
            if (i == 0 || i ==1){
               umrechnen(farbe, wiederstandswerte, i);
               i++;     
            }
            else if (i == 2){
               farbcode = farbcode(farbe, wiederstandswerte);
               i++;    
            }
            else if (i == 3){
               toleranz = toleranz(farbe);
               i++;    
            }       
           
            
            
       }
       
       System.out.println("Der Wiederstand hat einen Wert von " + farbcode +" \u2126 \u00B1 einer Toleranz von " + toleranz);
       
    }
    
    private static void umrechnen (String farbe, int [] wiederstandswerte, int i){
        if (farbe.equalsIgnoreCase("schwarz")){
            wiederstandswerte** = 0;
        }
        else if (farbe.equalsIgnoreCase("braun")){
            wiederstandswerte** = 1;
        }
        else if (farbe.equalsIgnoreCase("rot")){
            wiederstandswerte** = 2;
        }
        else if (farbe.equalsIgnoreCase("orange")){
            wiederstandswerte** = 3;
        }
        else if (farbe.equalsIgnoreCase("gelb")){
            wiederstandswerte** = 4;
        }
        else if (farbe.equalsIgnoreCase("gruen")){
            wiederstandswerte** = 5;
        }
        else if (farbe.equalsIgnoreCase("blau")){
            wiederstandswerte** = 6;
        }
        else if (farbe.equalsIgnoreCase("violett")){
            wiederstandswerte** = 7;
        }
        else if (farbe.equalsIgnoreCase("grau")){
            wiederstandswerte** = 8;
        }
        else if (farbe.equalsIgnoreCase("weiss")){
            wiederstandswerte** = 9;
        }
        
    }
    
    private static String farbcode (String farbe, int [] wiederstandswerte){
        String farbcode = "";
        
        if (farbe.equalsIgnoreCase("schwarz")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "";
        }
        else if (farbe.equalsIgnoreCase("braun")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "0";
        }
        else if (farbe.equalsIgnoreCase("rot")){
             farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "00";
        }
        else if (farbe.equalsIgnoreCase("orange")){
             farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "000";
        }
        else if (farbe.equalsIgnoreCase("gelb")){
             farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "0000";
        }
        else if (farbe.equalsIgnoreCase("gruen")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "00000";
        }
        else if (farbe.equalsIgnoreCase("blau")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "000000";
        }
        else if (farbe.equalsIgnoreCase("violett")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "0000000";
        }
        else if (farbe.equalsIgnoreCase("grau")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "00000000";
        }
        else if (farbe.equalsIgnoreCase("weiss")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "000000000";
        }
        else if (farbe.equalsIgnoreCase("gold")){
            farbcode = wiederstandswerte[0] + "," + wiederstandswerte[1];
        }
        else if (farbe.equalsIgnoreCase("silber")){
             farbcode = "0," + wiederstandswerte[0] + "" + wiederstandswerte[1];
        }
        
        return farbcode;
        
    }
    
    private static String toleranz(String farbe){
       String toleranz = "";
        
        if (farbe.equalsIgnoreCase("gold")){
            toleranz = "5 %";
        }
        else if (farbe.equalsIgnoreCase("silber")){
            toleranz = "10 %";
        }
        else if (farbe.equalsIgnoreCase("keine")){
            toleranz = "20 %";
        }
        
        return toleranz;
    }

    
}

Doch das Funktioniert nicht. Kann mir jemand helfen?

[QUOTE=WNABS]

Doch das Funktioniert nicht. Kann mir jemand helfen?[/QUOTE]

Was genau funktioniert nicht? Ein wenig mehr Text zum Sinn deines Codes wäre nicht schlecht.

mehr Erklärung schadet nicht, wenn aber ein Auto mit platten Reifen in die Werkstatt kommt ist es ja doch irgendwie klar,
man kann den Code 5 Min. anschauen, muss man letztlich sowieso,
dann ist das eine große auffallene Problem, was auch noch ganz gut zum vagen Text passt, recht offensichtlich :wink:

alles in der Klasse Wiederstaende, Ausgabe von Fragen und Einlesen von Werten, ist noch auf Konsole eingestellt,
nicht in die GUI eingebunden

da muss man nun überlegen, was daraus werden soll,
man kann auch mit der GUI einfach Nachrichten ausgeben und Zeilen in Textfeld ‚eingabeaufforderung‘ lesen,
allerdings nicht allzu GUI-mäßig, eine Konsole nachzubauen,
schadet aber auch nicht:
für die Ausgabe deiner Nachrichten eine mehrzeilige TextArea oder im einfachsten Fall ein Label (alles in Tutorials einzeln zu lernen),
per Schleife Text ausgeben, User tippen lassen,
KeyListener nicht unbedingt benötigt, wird aber wohl auch funktionieren,
ActionListener reagiert nur bei Enter, etwas einfacher

Unterschied zur Konsole ist die Auftrennung in verschiedene Codestellen,
um zu wissen was zu tun ist helfen Attribute, in irgendeiner Form merken was gerade dran ist,
ein int für 1-4 usw., wiederstandswerte-Array sicher auch,

am Anfang nach Start die erste Ausgabe setzen, bei Verarbeitung der x-ten Antwort die nächste Frage setzen,


als Alternative zur Konsole kann man hier bei knappen Beispiel nicht allzu kreativ werden,
offensichtlich möglich ist aber gleich 4 Textfelder anzubieten, davor jeweils Label ‚hier erste Farbe eintippen‘,
unten ein Fertig-Button

→ das nennt sich ein Formular


noch zur zweiten Klasse:
ein Array einen langen Namen zu geben ist ganz gut,
in Methoden wo dieser zig Mal benötigt wird ist es aber auch nicht verboten, eine lokale Variable w anzulegen,
macht deinen Code viel kürzer

andere Tricks helfen auch:

            wiederstandswerte** = 0;
        }
        else if (farbe.equalsIgnoreCase("braun")){
            wiederstandswerte** = 1;
        }
...

-> 
int n = -1;
        if (farbe.equalsIgnoreCase("schwarz")){
            n = 0;
        }
        else if (farbe.equalsIgnoreCase("braun")){
            n = 1;
        }
...
if (n < 0) das gibt Ärger;
wiederstandswerte** = n;

sowie

            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "";
        }
        else if (farbe.equalsIgnoreCase("braun")){
            farbcode = wiederstandswerte[0] + "" + wiederstandswerte[1] + "0";
        }
.....

-> 


String w0w1 = wiederstandswerte[0] + "" + wiederstandswerte[1];
        if (farbe.equalsIgnoreCase("schwarz")){
            farbcode = w0w1 + "";
        }
        else if (farbe.equalsIgnoreCase("braun")){
            farbcode = w0w1 + "0";
        }
.....

bei ‚gold‘ wegen Komma dazwischen Hilfsvariable nicht zu verwenden, aber nicht schlimm

Sollzustand und Istzustand, bitte, und Wiederstand oder Widerstand? [kein troll, kein spam, kein ungefragtes einfügen]. :slight_smile:

[quote=WNABS]Dies möchte ich gerne über verschiedene Klassen lösen, da ich das für übersichtlicher halte.[/quote]Also in der Lernphase ist es wohl besser, die Anzahl der Dateien, über die man die Funktionalität verteilt klein zu halten.

[quote=WNABS;112235]Da ich das ganze gerne über eine GUI machen würde, habe ich jedoch ein Problem - ich weiss nicht wie ich die Texteingabe über mehrere Klassen ermöglichen kann.[/quote]Dei Zauberworte hier heißen “Binding” und “MVC-Pattern”. Wenn Du Dich da einliest wird Dich das wahrscheinlich erstmal erschlagen.
Aber im wesentlichen geht es darum, Java möglichst viel Arbeit übernehmen zu lassen und nur auf bestimmte Ereignisse (wie z.B. das Drücken der Entertaste, den Klick auf einen Button oder die Auswahl eines Eintragen in einer Auswahlliste) zu reagieren.

Zum Programm allgemein ist zu sagen, dass dein Array-Ansatz leider sehr schlecht lesbar ist. Durch die vielen Wiederholungen mit jeweils nur geringen Änderungen ist die Logik deines Programms sehr schwierig zu erkennen. Die Lesbarkeit ist aber (nach der funktionalen Korrektheit) das wichtigste Kriterium eines guten Programms.

Ich habe hier mal ein Beispiel, wie ich das als Swing-GUI umsetzen würde:[SPOILER]```package test.bytewelt;

import static org.junit.Assert.assertEquals;

import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

import org.junit.Test;

public class WiderStaendeTest {

static final String RING_1 = "Ring 1";
static final String RING_2 = "Ring 2";
static final String RING_3 = "Ring 3";
static final String RING_4 = "Ring 4";

static final String EINHEIT = "\u2126 \u00B1";

// in komplexeren Programmen besteht das Model auf mehreren eigenständigen Klassen
private final Map<String, Farbcode> farbcodeModel = new HashMap<>();

public static void main(String[] args) {
    new WiderStaendeTest().ausfuehren();
}

public WiderStaendeTest() {
    // initialisiere das Model
    farbcodeModel.put(RING_1, Farbcode.schwarz);
    farbcodeModel.put(RING_2, Farbcode.schwarz);
    farbcodeModel.put(RING_3, Farbcode.schwarz);
    farbcodeModel.put(RING_4, Farbcode.silber);
}

private void ausfuehren() {
    JFrame jFrame = guiZusammenbauen();
    starteEventDispatchThread(jFrame);
}

private void starteEventDispatchThread(JFrame jFrame) {
    jFrame.setVisible(true);
}

private JFrame guiZusammenbauen() {
    JFrame jFrame = new JFrame("Widerstandswert");
    jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jFrame.setLayout(new GridLayout(1, 0));

    jFrame.add(erzeugeFarbcodeEingabe());
    jFrame.add(erzeugeBerechnung());
    jFrame.setSize(600, 300);
    return jFrame;
}

// wenn feste Wertemenge -> keine freie Eingabe 
private JPanel erzeugeFarbcodeEingabe() {
    JPanel farbCodePanel = new JPanel(new GridLayout(0, 1, 5, 5));
    farbCodePanel.add(erzeugeWerteingabe(RING_1));
    farbCodePanel.add(erzeugeWerteingabe(RING_2));
    farbCodePanel.add(erzeugeExponentEingabe(RING_3));
    farbCodePanel.add(erzeugeToleranzEingabe(RING_4));
    return farbCodePanel;
}

// AuswahlFelder gehoeren zur View, der daran gebundene Listener zum Controller
private JComboBox<Farbcode> erzeugeAuswahlFeld(final String title) {
    final JComboBox<Farbcode> comboBox = new JComboBox<Farbcode>();
    comboBox.setBorder(BorderFactory.createTitledBorder(title));
    comboBox.addItemListener(new FarbcodeAuswahlListener(title, comboBox, farbcodeModel));
    return comboBox;
}

// auch hier sin alle Elemente Teil der View, bis auf den Listener, der zum Controller gehoert.
private Component erzeugeBerechnung() {
    JPanel jPanel = new JPanel(new GridLayout(0, 1));
    final JTextField jTextFieldWert = new JTextField();
    jPanel.add(jTextFieldWert);
    JButton jButton = new JButton();
    jButton.setAction(new BerechneButtonAction("berechne", jTextFieldWert, farbcodeModel));
    jPanel.add(jButton);
    jPanel.setBorder(BorderFactory.createTitledBorder("Ergebnis"));
    return jPanel;
}

private JComboBox<Farbcode> erzeugeExponentEingabe(String title) {
    return erzeugeEingabeMitWerten(title, Farbcode.values());
}

private Component erzeugeToleranzEingabe(String title) {
    return erzeugeEingabeMitWerten(title, Farbcode.silber, Farbcode.gold);
}

private JComboBox<Farbcode> erzeugeWerteingabe(String eingabeName) {
    //@formatter:off
    return erzeugeEingabeMitWerten(eingabeName,Farbcode.schwarz, Farbcode.braun, Farbcode.rot, Farbcode.orange, Farbcode.gelb, Farbcode.gruen, Farbcode.blau, Farbcode.violett, Farbcode.grau, Farbcode.weiss);
    //@formatter:on
}

private JComboBox<Farbcode> erzeugeEingabeMitWerten(String title, Farbcode... farbcodes) {
    JComboBox<Farbcode> comboBox = erzeugeAuswahlFeld(title);
    for (Farbcode farbcode : farbcodes) {
        comboBox.addItem(farbcode);
    }
    return comboBox;
}

@Test
public void testExponiere_schwarz_keineErgaenzung() throws Exception {
    assertEquals("55.0", Farbcode.schwarz.exponiere("55"));
    // problem mit wiss. Darstellung

// assertEquals(“55000000000.0”, Farbcode.weiss.exponiere(“55”));
assertEquals(“0.55”, Farbcode.silber.exponiere(“55”));
assertEquals(“5.5”, Farbcode.gold.exponiere(“55”));
}

@Test
public void testGetMultiplikator_0bis9_alsExponentVon10() throws Exception {
    assertEquals(1.0, Farbcode.schwarz.getMultiplikator(), 0.0001);
    assertEquals(100.0, Farbcode.rot.getMultiplikator(), 0.0001);
    assertEquals(1000000000.0, Farbcode.weiss.getMultiplikator(), 0.0001);
    assertEquals(.01, Farbcode.silber.getMultiplikator(), 0.0001);
    assertEquals(.1, Farbcode.gold.getMultiplikator(), 0.0001);
}

}

enum Farbcode {
silber {

    @Override
    public String getToleranz() {
        return "10";
    }

},
gold {

    @Override
    public String getToleranz() {
        return "5";
    }
},
schwarz, braun, rot, orange, gelb, gruen, blau, violett, grau, weiss;
public String exponiere(String string) {
    return String.valueOf(Double.parseDouble(string)
            * getMultiplikator());
}

public String getToleranz() {
    return "";
}

String getEinheit() {
    return 2 > ordinal() ? "MOhm" : "Ohm";
}

double getMultiplikator() {
    return Math.pow(10, ordinal() - 2);
}

String getWert() {
    return String.valueOf(ordinal() - 2);
}

}

class BerechneButtonAction extends AbstractAction {
private final JTextField _jTextFieldWert;
private final Map<String, Farbcode> _farbcodeModel;

BerechneButtonAction(String name, JTextField jTextFieldWert, Map<String, Farbcode> farbcodeModel) {
    super(name);
    _jTextFieldWert = jTextFieldWert;
    _farbcodeModel = farbcodeModel;
}

@Override
public void actionPerformed(ActionEvent e) {
    String wertRing1und2 = _farbcodeModel.get(WiderStaendeTest.RING_1).getWert()
            + _farbcodeModel.get(WiderStaendeTest.RING_2).getWert();
    String wert = _farbcodeModel.get(WiderStaendeTest.RING_3).exponiere(wertRing1und2);
    _jTextFieldWert.setText(wert
            + WiderStaendeTest.EINHEIT
            + _farbcodeModel.get(WiderStaendeTest.RING_4).getToleranz()
            + "%");
}

}

class FarbcodeAuswahlListener implements ItemListener {
private final String _title;
private final JComboBox _comboBox;
private final Map<String, Farbcode> _farbcodeModel;

FarbcodeAuswahlListener(String title, JComboBox<Farbcode> comboBox, Map<String, Farbcode> farbcodeModel) {
    _title = title;
    _comboBox = comboBox;
    _farbcodeModel = farbcodeModel;
}

@Override
public void itemStateChanged(ItemEvent e) {
    _farbcodeModel.put(_title, (Farbcode) _comboBox.getSelectedItem());
}

}```[/SPOILER]

Ich gehe davon aus, dass Du noch nicht alle Details meines Codes verstehts, aber ich hofe, dass einige Konzepte wie sich wiederholenden Code in parametrisierte Methoden auszulagern und das Listener-Konzept von Swing deutlich werden.
Spiele einfach etwas damit rum, und wenn Fragen auftauchen: einfach fragen!

Eine Lösung mit Java-FX wird sich nur in details unterscheiden.

bye
TT

Hallo und vielen Dank fuer die zahlreichen Antworten.

Timothy_Truckle ich habe mir Dein Programm angesehen und viel gesehen womit ich mich noch naeher beschaefitigen muss. Erfreulich ist dabei, dass ich den Code verstehe, auch wenn ich ihn selbst (noch) nicht so hingebkommen wuerde.

Dir natuerlich auch vielen Dank SlaterB, Deine Erklaerungen sind immer erhellend.

Jedoch muss ich mir wohl vorwerfen, dass ich mein Anliegen nicht richtig erklaeren konnte. Daher versuche ich es nochmal.

Ich habe ein Hauptprogramm bei dem ich auswaehle was ich tun moechte. Die Eingabe erfolgt bei Diesem durch ein JTextField, die Ausgabe auf der Konsole. Daneben habe ich nun einige andere Klassen wie beispielsweise die Farbcode für Widerstände (die ich auf jeden Fall noch verbessern muss). Hier wuerde ich ebenfalls gerne die Ausgabe ueber die Konsole regeln, die Eingabe jedoch ueber die selbe GUI wie die der Hauptseite.

Und genau hier komme ich nicht weiter. Es erscheint mir nicht sinnig die GUI im Hauptprogramm zu schliessen und im anderen eine neue (gleiche) GUI zu starten - vor allem dann nicht, wenn ich etwas aenern will (Farbe, Groesse, etc) und viele Klassen habe (haette). Daher dachte ich, dass ich die Classe einfach mit der “alten” GUI laufen lassen kann. Und hier habe ich meine Probleme.

Sobald ich das Programm aufrufe bleibt die GUI, ich kann jedoch nicht mit ihr machen. Dazu weiss ich leider auch nicht, wie ich es moeglich machen kann die Frage auf der Konsole zu stellen und die Antwort von der GUI einzulesen und dann die naechte Frage zu stellen und deren Antwort einzulesen, etc.

bisher ist von Wiederstaende (richtigerweise in der Tat ohne e) Jeannie noch gar nicht referenziert/ bekannt,
da musst du irgendwas tun, extends JFrame ist jedenfalls falsch, Widerstaende erzeugt sich Jeannie oder bekommt das per set-Methode oder irgendwas,

Wiederstaende könnte in der GUI in irgendeinem TextFeld etwas setzen, das dürfte nun wirklich bekannt sein,
Objekt holen gut setText() als einfachste Variante

wie schon ausführlich erklärt musst du auf die Eingabe reagieren,
Jeannie könnte Wiederstaende kennen und dort etwas aufrufen, evtl. boolean-gesteuert (ist gerade Wiederstaende dran? -> dann dieses informieren)

mit Interface könnte man eine Art simples Plugin bauen,
jedenfalls der Ablauf wie schon geschrieben: auf die Eingabe muss im Listener Code erfolgen der

  • weiß, welche Eingabe gerade ist (Zustand gemerkt)
  • die Eingabe gut aufhebt
  • die nächste Frage setzt, soweit nötig

Hallo zusammen,

lange habe ich mich nicht gemeldet, da ich kaum noch Zeit zum Programmieren hatte. Jetzt versuche ich weiterhin mein Glueck. Da ich die Widerstaende nicht mehr sehen konnte, versuche ich das Ganze jetzt mit Wein - es kommt ja weniger auf das Programm an, als auf das Prinzip…
Ich habe es geschafft eine Abfrage mittels einer GUI zu erstellen, bei der die Frage auf der Konsole erscheint, und die Antwort in einer GUI eingegen wird. So weit so gut. Aber ich habe ja noch mein Hauptprogramm mit dem ich das ganze verbinden moechte und genau hier komme ich nach einigen Tagen googlen und probieren immer noch nicht weiter.

**Noch mal kurz was ich machen moechte: ** Ich habe ein Hauptprogramm (Jeannie.java), das auf der Konsole frage was ich tun moechte. Nun gebe ich ueber eine GUI die antwort ein. Je nach antwort ruft es entweder ein anderes Programm auf, dass Dialogbasiert ein paar Dinge ausfuehrt - oder beendet das Programme.

Das Problem: Ich moechte, dass das Ganze ueber die selbe GUI laeuft und nach Ausfuehrung des Dialogs wieder zum Ausgangsprogramm zurueckkehrt. Und ich bekomme dies nicht hin.

import Wein.Weinsuche;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Jeannie implements KeyListener{
    
    JFrame hauptprogramm = new JFrame();    
    final JTextField eingabeaufforderung = new JTextField();
    
    
    public static void main (String [] args){
        System.out.println("Hi");
        Jeannie start = new Jeannie();
    }
    
    public Jeannie () {
            
            //Groesse setzen
                //Bildschrimaufloesung abgragen
                Toolkit tk = Toolkit.getDefaultToolkit();
                Dimension d = tk.getScreenSize();
                //Frame 300 Pixel breit und 40 Pixel kleiner als der Maxiamale Bildschirm
                hauptprogramm.setSize(d.width-500, 100);
            //Ort setzen
            hauptprogramm.setLocation(75,d.height-120);
            //Kein Rahmen
            hauptprogramm.setUndecorated(true);
            //Keine Groessenveraenderung
            hauptprogramm.setResizable( false );
            //Hintergrundfarbe
            eingabeaufforderung.setBackground(Design.Farben.farbe2());
            eingabeaufforderung.setForeground(Design.Farben.farbe1());
            eingabeaufforderung.setFont( new Font("Serif", Font.BOLD, 18) );
            eingabeaufforderung.addKeyListener((KeyListener) this);
            hauptprogramm.add(eingabeaufforderung);
            hauptprogramm.setVisible(true);    
    }

    
    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER){
            String eingabe = eingabeaufforderung.getText();            
            antwortUntersuchen(eingabe);
            eingabeaufforderung.setText("");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
            }
    
   private void antwortUntersuchen(String eingabe){
       if (eingabe.equalsIgnoreCase("Jeannie beenden")){
           System.out.println(eingabe);
           System.out.println(Zeit.Tageszeit.verabschieden());
           System.exit(0);
           
       }
       else{
           if (eingabe.equalsIgnoreCase("Ich moechte eine Weinempfehlung")){
               System.out.println(eingabe);             
               Weinsuche st = new Weinsuche();
           }
           else{
               System.out.println(eingabe);
                System.out.println("Ok.");
               }
       }
   }
    
}
import java.util.ArrayList;

import Hauptprogramm.Jeannie.*;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JTextField;




public class Weinsuche implements KeyListener{
    ArrayList <Weinempfehlung> wein = new ArrayList <Weinempfehlung>();
    ArrayList <Weinsorten> weinsorten = new ArrayList <Weinsorten>();  
    ArrayList <Weinempfehlung> moeglicheWeine = new ArrayList <>();
    
    String eingabe;
    int eingabenzaehlen = 0;
    
    JFrame hauptprogramm = new JFrame();    
    final JTextField eingabeaufforderung = new JTextField();
    
        
    public Weinsuche (){
        
        //Groesse setzen
                //Bildschrimaufloesung abgragen
                Toolkit tk = Toolkit.getDefaultToolkit();
                Dimension d = tk.getScreenSize();
                //Frame 300 Pixel breit und 40 Pixel kleiner als der Maxiamale Bildschirm
                hauptprogramm.setSize(d.width-500, 100);
            //Ort setzen
            hauptprogramm.setLocation(75,d.height-120);
            //Kein Rahmen
            hauptprogramm.setUndecorated(true);
            //Keine Groessenveraenderung
            hauptprogramm.setResizable( false );
            //Hintergrundfarbe
            eingabeaufforderung.setBackground(Design.Farben.farbe2());
            eingabeaufforderung.setForeground(Design.Farben.farbe1());
            eingabeaufforderung.setFont( new Font("Serif", Font.BOLD, 18) );
            eingabeaufforderung.addKeyListener((KeyListener) this);
            hauptprogramm.add(eingabeaufforderung);
            hauptprogramm.setVisible(true); 
        
        
        System.out.println("Wie schmeckt das Gericht?");  
        ladeDaten();
    }
    
    private void ladeDaten(){        
        wein.add(new Weinempfehlung("Kraeftig", "koerperreich","Rotwein"));
        wein.add(new Weinempfehlung("Chili", "trocken", "Rotwein"));
        wein.add(new Weinempfehlung("Suesslich-scharf", "fruchtig", "Rose"));
        wein.add(new Weinempfehlung("Suesslich-scharf", "restsueß", "Weiswein"));
        wein.add(new Weinempfehlung("Cremig", "Suess", "Weiswein"));
        wein.add(new Weinempfehlung("Fruchtig", "Suess", "Weiswein"));
        wein.add(new Weinempfehlung("Schokoladig", "kraeftig", "Rotwein"));
        wein.add(new Weinempfehlung("Mehlspeise", "kraeftig", "Rotwein"));
        wein.add(new Weinempfehlung("Fruechte", "Suess", "Rotwein"));
        wein.add(new Weinempfehlung("Fisch", "Suess", "Weiswein"));
        wein.add(new Weinempfehlung("Gemuese", "kraeftig", "Weiswein"));
        
        weinsorten.add(new Weinsorten("Rotwein", "kraeftig", "Shiraz"));
    }
                
    private void frageAb(){
         
       String geschmack = eingabe;
        
       System.out.println("Moegliche Weine:");    
         for (Weinempfehlung p : wein){             
             if (p.getGerichtsgeschmack().equalsIgnoreCase(geschmack)){
                  System.out.println("Ein " + p.getWeingeschmack()+"er " + p.getWeinart());
                  moeglicheWeine.add(p);
             } 
         }
         
       System.out.println("Wuenschen Sie eine konkrete Empfehlung?");   
       
       
    }
    
    private void frageEmpfehlung(){
       String antwort = eingabe;
       
       if (antwort.equalsIgnoreCase("Nein")){            
       }
       else if (antwort.equalsIgnoreCase("Ja")){
            komplettEmpfehlung();
       }
    }
    
    private void komplettEmpfehlung(){
        
        for (Weinempfehlung we : moeglicheWeine){
            for (Weinsorten ws : weinsorten){
                if ((we.getWeinart() == ws.getWeinart()) && (we.getWeingeschmack() == ws.getWeingeschmack())){
                    System.out.println(ws.getWeinname());
                }
            }
        }
               
        
    }    
    
    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {               
        if (e.getKeyCode() == KeyEvent.VK_ENTER){
           eingabe =  eingabeaufforderung.getText();
           eingabeaufforderung.setText("");
           abfrageReihenfolge();
           eingabenzaehlen++;
           
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
    
    private void abfrageReihenfolge(){
        if (eingabenzaehlen == 0){
            frageAb();
        }
        else if (eingabenzaehlen == 1){
            frageEmpfehlung();
        }
    }
    
}
public class Weinsorten {
    
    private final String weinart;
    private final String weingeschmack;
    private final String weinname;

  
//Konstruktor
    Weinsorten (String weinart, String weingeschmack, String weinname){
       this.weinart = weinart;
       this.weingeschmack = weingeschmack;
       this.weinname = weinname;      
    }


// getter-Methoden
    String getWeinart() {
        return this.weinart;
    }
     String getWeingeschmack() {
        return this.weingeschmack;
    }
     String getWeinname() {
        return this.weinname;
    } 
    
    
    
}
public class Weinempfehlung {
    
private final String gerichtsgeschmack;
private final String weingeschmack;
private final String weinart;

  
//Konstruktor
    Weinempfehlung (String gerichtsgeschmack, String weingeschmack, String weinart){
       this.gerichtsgeschmack = gerichtsgeschmack;
       this.weingeschmack = weingeschmack;
       this.weinart = weinart;      
    }


// getter-Methoden
    String getGerichtsgeschmack() {
        return this.gerichtsgeschmack;
    }
     String getWeingeschmack() {
        return this.weingeschmack;
    }
     String getWeinart() {
        return this.weinart;
    } 
    
 
}

[quote=WNABS]Ich habe ein Hauptprogramm (Jeannie.java), das auf der Konsole frage was ich tun moechte. Nun gebe ich ueber eine GUI die antwort ein[/quote]Entscheide Dich!
Entweder baust Du eine Konsolenanwendung oder eine GUI.
Die beiden Konzepte passen nicht zu einander und sollten nicht gemischt werden.

[quote=WNABS;113493]Und ich bekomme dies nicht hin.[/quote]Was genau heist das?
(Ich denke, dass Du generell nicht weist, wie man die Konzepte GUI und Console mischt, aber genau dass solltest Du auch nicht tun.)

bye
TT

ich habe es doch schon mehrfach geschrieben, das zweite Programm braucht Zugriff auf das JFrame,
muss dort neue Fragen setzen, muss die Antworten bekommen usw. (vorher ausführlicher…)

das muss man nicht in einem Guss funktioniertend hinschreiben, aber kann man einzeln angehen?
was ist mit dem ersten Schritt, beim Start von Weinsuche irgendwie in der GUI neue Frage-Text zu setzen?

Wenn Du meine Posts nicht liest, warum soll ich Deine lesen?

bye
TT

äh, unklar dass ich WNABS ansprach? nun denn…

[quote=SlaterB]äh, unklar dass ich WNABS ansprach?[/quote]Ja, hat wohl mit dem Zittieren nicht geklappt und ich hab nicht so genau auf den Namen links geschaut…

bye
TT