Event Handling Gui für Taschenrechner

Leon_2001

Aktives Mitglied
Hallo,
in der schule programmieren wir gerade einen Taschenrechner mit BlueJ. Weil ich Spaß daran hatte, wollte ich mir aneignen wie man die passende GUI dazu baut.

Und zwar soll sich ein Fenster öffnen mit einer Menüleiste "Rechenart" und "Ende". Unten drunter steht erstmal eine Begrüßung evtl. mit sowas wie einem Datum-
Der Menüpunkt "Rechenart" soll wiederum "Addieren", "Subtrahieren" usw. enhalten.
Je nachdem, was man ausgewählt hat, soll sich das Ausgabe Fenster unter der Menüleiste ändern ... dort sollen zwei Felder sein, wo man zahlen eingeben kann und dann ein Button mit rechnen ... das Event ist, dass er daraufhin Rechnung + Lösung anzeigt.

Wie weit bin ich damit: Ich habe einen JFrame erstellt mit der entsprechenden Menüleiste (+Unterpunkte) und der Begrüßung ---> alles aus Tutorial abgeleitet , bin ein Java Einsteiger.

Problem: Ich habe keine Ahnung wie ich 1. den JMenuItem ein Event zuordne und wie ich es realisiere, dass man dann praktisch das neue Fenster (unter der Menüleiste) zum neu gestalten hat.
Ich habe es mit Tutorials versucht, aber jedes hat eine andere Methode und ich blicke es nicht so ganz. Daher hier mal mein Quellcode:

Java:
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.awt.event.*;

@SuppressWarnings("serial")
public abstract class Tr extends JFrame implements ActionListener
{

   
    public static void main(String[] args)
    {

        JFrame meinFrame = new JFrame("Taschenrechner");
        meinFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        meinFrame.setSize(450,300);
        meinFrame.setLocation(50,50);

        JMenuBar bar = new JMenuBar();
        meinFrame.setJMenuBar(bar);

        JMenu menu = new JMenu("Rechenart");

        JMenuItem item1 = new JMenuItem ("Addieren");
        menu.add(item1);
        JMenuItem item2 = new JMenuItem ("Subtrahieren");
        menu.add(item2);
        JMenuItem item3 = new JMenuItem ("Multiplizieren");
        menu.add(item3);
        JMenuItem item4 = new JMenuItem ("Dividieren");
        menu.add(item4);

        JMenu menu1 = new JMenu("Ende");
        bar.add(menu);
        bar.add(menu1);

        LocalDate jetzt = LocalDate.now();
        DateTimeFormatter myformatter = DateTimeFormatter.ofPattern(" d. MMMM yyyy");

        JLabel datum = new JLabel(" Vielen Dank für ihre Benutzung des Tr_1.0 am" + myformatter.format(jetzt), JLabel.CENTER);
        JLabel anweisung = new JLabel("Bitte wählen sie im Menü die gewünschte Rechenart aus", JLabel.CENTER);

        meinFrame.add(anweisung, BorderLayout.CENTER);
        meinFrame.add(datum, BorderLayout.NORTH);
        meinFrame.setJMenuBar(bar);
        meinFrame.setVisible(true);

       
    }

    public abstract class DerHandler implements ActionListener
    {
        public void ActionPerformed (ActionEvent event) {
           
            if (event.getSource()  ==item1) {
               
            }
               
            else if (event.getSource()== item2 ) {
               
            }
               
            else if (event.getSource()== item2 ){
               
            }
                   
            else if (event.getSource()== item2 ) {
               
            }

        }
    }
}

Das ist mein bisheriges Ergebnis.

Es wäre nett, wenn ihr mir
1. anhand eines kurzen Beispieles (am besten mit einem JFrame und nicht irgendwelchen komischen super Fenstern ... die manchmal bei sowas verwendet worden sind) zeigen könnt, wie man ein entsprechendes Event programmiert

2. Wie das Event aussehen muss, dass sich kein neues Fenster öffnet, sondern eben nur der Teil des JFrame sich ändert

3. Mir erklären könnt, warum man manchmal bei der Klasse sowas wie extends oder implements ... schreibt

4. Vlt. allgemein über den Quellcode schaut/Verbesserungsvorschläge habt, wie der Code besser/schneller geschrieben ist (nehme mal an, ich habe viele Sachen nicht optimal gelöst).

Vielen Dank für jede Hilfe!

Grüße Leon
 

krgewb

Top Contributor
3. Mir erklären könnt, warum man manchmal bei der Klasse sowas wie extends oder implements ... schreibt

Tr ist bereits ein JFrame. Die Klasse Tr erbt von der Klasse JFrame. Deshalb steht dort: extends JFrame.
Es ist jedoch nicht möglich, von mehr als einer Klasse gleichzeitig zu erben. Deshalb gibt es Interfaces.
DerHandler implementiert das Interface ActionListener. Deshalb muss DerHandler alle abstrakten Methoden von ActionListener implementieren. Die Anzahl der Methoden ist 1 und die Methode heißt actionPerformed.

Man kann es so programmieren:

Java:
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.awt.event.*;

@SuppressWarnings("serial")
public class Tr extends JFrame {

   JLabel anweisung;

   public Tr() {

       this.setTitle("Taschenrechner");
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       this.setSize(450, 300);
       this.setLocation(50, 50);

       DerHandler meinHandler = new DerHandler(this);

       JMenuBar bar = new JMenuBar();
       this.setJMenuBar(bar);

       JMenu menu = new JMenu("Rechenart");

       JMenuItem item1 = new JMenuItem("Addieren");
       item1.setActionCommand("Addieren");
       item1.addActionListener(meinHandler);
       menu.add(item1);

       JMenuItem item2 = new JMenuItem("Subtrahieren");
       item2.setActionCommand("Subtrahieren");
       item2.addActionListener(meinHandler);
       menu.add(item2);

       JMenuItem item3 = new JMenuItem("Multiplizieren");
       item3.setActionCommand("Multiplizieren");
       item3.addActionListener(meinHandler);
       menu.add(item3);

       JMenuItem item4 = new JMenuItem("Dividieren");
       item4.setActionCommand("Dividieren");
       item4.addActionListener(meinHandler);
       menu.add(item4);

       JMenu menu1 = new JMenu("Ende");

       JMenuItem itemBeenden = new JMenuItem("Beenden");
       itemBeenden.setActionCommand("Beenden");
       itemBeenden.addActionListener(meinHandler);
       menu1.add(itemBeenden);

       bar.add(menu);
       bar.add(menu1);

       LocalDate jetzt = LocalDate.now();
       DateTimeFormatter myformatter = DateTimeFormatter.ofPattern(" d. MMMM yyyy");

       JLabel datum = new JLabel(" Vielen Dank für ihre Benutzung des Tr_1.0 am" + myformatter.format(jetzt),
               JLabel.CENTER);
       anweisung = new JLabel("Bitte wählen sie im Menü die gewünschte Rechenart aus", JLabel.CENTER);

       this.add(anweisung, BorderLayout.CENTER);
       this.add(datum, BorderLayout.NORTH);
       this.setJMenuBar(bar);
       this.setVisible(true);

   }

   public static void main(String[] args) {
       new Tr();
   }

}

class DerHandler implements ActionListener {

   Tr tr;

   public DerHandler(Tr tr) {
       this.tr = tr;
   }

   public void actionPerformed(ActionEvent event) {

       if (event.getActionCommand().equals("Addieren")) {
           tr.anweisung.setText("Sie haben auf 'Addieren' geklickt.");
           // TODO
       }

       else if (event.getActionCommand().equals("Subtrahieren")) {
           tr.anweisung.setText("Sie haben auf 'Subtrahieren' geklickt.");
           // TODO
       }

       else if (event.getActionCommand().equals("Multiplizieren")) {
           tr.anweisung.setText("Sie haben auf 'Multiplizieren' geklickt.");
           // TODO
       }

       else if (event.getActionCommand().equals("Dividieren")) {
           tr.anweisung.setText("Sie haben auf 'Dividieren' geklickt.");
           // TODO
       }

       else if (event.getActionCommand().equals("Beenden")) {
           System.exit(0);
       }
   }

}
 

Robat

Top Contributor
Tr ist bereits ein JFrame. Die Klasse Tr erbt von der Klasse JFrame. Deshalb steht dort: extends JFrame.
Es ist jedoch nicht möglich, von mehr als einer Klasse gleichzeitig zu erben. Deshalb gibt es Interfaces.

Kleine Anmerkung:
In diesem Fall solltest du gar nicht von JFrame erben. Man erbt von einer Klasse um dessen Funktionalität zu erweitern, was du aber nicht tust. Es reicht völlig aus in der Klasse Tr ein JFrame Objekt zu erstellen und über dieses das Fenster aufzubauen.
Wie du schon richtig sagtest kann man nur von einer Klasse erben weshalb man sich gut überlegen sollte von welcher Klasse man erbt / ob es nötig ist von einer Klasse zu erben :)

Gruß Robert
 

Leon_2001

Aktives Mitglied
Erst einmal vielen Dank für eure Hilfe! Ich habe nun schon deutlich mehr verstanden :)
Mittlerweile habe ich mich weiter in das Thema hereingearbeitet und doch eine super Klasse verwendet (ob das sinnvoll ist, kann ich nicht genau sagen, aber es funktioniert ^^).

Damit er die Seiten innerhalb des Frames durch ein Klick auf das entsprechende MenuItem /Menu wechselt, habe ich ein CardLayout verwendet ... eine Alternative dazu habe ich nicht gefunden.
Das Problem war nur hierbei wieder der ActionCommand ... zwar hat das JMenuItem funktioniert,aber mit einem normalen JMenu ging es irgendwie nichto_O habe lange dazu recherchiert und nun ein MenuEvent benutzt.

Hier der Code:

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;

public class Cardtr extends JFrame implements MenuListener
{

    private JPanel cards;
    private JMenu rechnen;
    private JMenu credits;
    private JMenu feedback;
    private JMenu ende;
   
   
   
    private  CardLayout c1;

    public Cardtr(String title)
    {
        super(title);
        setLayout(new BorderLayout());
       
        //Put the JMenuBar into a JPanel
        JPanel norden = new JPanel();
         JMenuBar bar = new JMenuBar();
          rechnen = new JMenu("rechnen");
          rechnen.addMenuListener(this);
         bar.add(rechnen);
          credits = new JMenu("credits");     
          credits.addMenuListener(this);
         bar.add(credits);
         feedback = new JMenu("feedback");
          feedback.addMenuListener(this);
         bar.add(feedback);
         ende = new JMenu("ende");
          ende.addMenuListener(this);
         bar.add(ende);    
        norden.add(bar);
       
       
        //create cards
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Das ist Seite 1"));
       
        JPanel card2 = new JPanel();
        card2.setLayout(new BorderLayout());
        card2.add(new JLabel("Written by Leon De Andrade"), BorderLayout.CENTER);
       
        JPanel card3 = new JPanel();
        card3.add(new JLabel("Hier Feedback abgeben"));
   
        //create JPanel that contains the cards
        c1 = new CardLayout();
        cards = new JPanel();
        cards.setLayout(c1);
        cards.add(card1, "1");
        cards.add(card2, "2");
        cards.add(card3, "3");
       
        add(norden, BorderLayout.PAGE_START);
        add(cards, BorderLayout.CENTER);
       

    }

     public void menuSelected(MenuEvent evt)
     {    
         if (evt.getSource() == this.rechnen)
         {
             c1.show(cards, "1");
             }
         else if (evt.getSource() == this.credits)
         {
             c1.show(cards, "2");
         }
         else if (evt.getSource() == this.feedback)
         {
             c1.show(cards, "3");
         }
         else if (evt.getSource() == this.ende)
         {
             System.exit(0);   
         }
            
     }
     public void menuDeselected(MenuEvent evt)
     {
         if (evt.getSource() == this.rechnen)
         {
             c1.show(cards, "1");
             }
         else if (evt.getSource() == this.credits)
         {
             c1.show(cards, "2");
         }
         else if (evt.getSource() == this.feedback)
         {
            
         }
         else if (evt.getSource() == this.ende)
         {
             System.exit(0);
         }
   }
    
    
    
     public void menuCanceled(MenuEvent evt)
       {
           if (evt.getSource() == this.rechnen)
             {
                 c1.show(cards, "1");
                 }
             else if (evt.getSource() == this.credits)
             {
                 c1.show(cards, "2");
             }
             else if (evt.getSource() == this.feedback)
             {
                
             }
             else if (evt.getSource() == this.ende)
             {
                 System.exit(0);
             }
       }

       
    public static void main(String[] args)
    {
        Cardtr frame = new Cardtr("CardLayout");
        frame.setBounds(500, 200, 400, 400);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setVisible(true);
    }   
}

Das ganze kommt zwar meinem Plan schon näher, ist aber noch lange nicht optimal. Durch das MenuEvent kommt z.B. der "Fehler" auf, dass er das Menu jetzt nicht wie ein Button einmal anklickt, sondern dauerhaft selektiert hat bis man noch einmal klickt.
Da du (krgewb) aber auch "Ende" welches nur ein JMenu ist, mit einem ActionCommand ausgestattet hast, werde ich das nun auch nochmal bei mir probieren.

Sollte das Problem geschafft sein, werde ich mich dann mit dem Befüllen des Tr beschäftigen ... einen Taschenrechner mit Buttons für die Zahlen und Ausgabe habe ich bereits programmiert, der dann eingebunden werden muss :)

Meine Frage:
Ist dieser Aufbau mit Super Klasse sinnvoll? oder sollte ich lieber einen ohne wählen wie in meinem Code oben ?
Wer sonst noch Verbesserungen, Anmerkungen oder Verbesserungsvorschläge hat, darf diese natürlich auch gerne sagen. Ich freue mich über jede Hilfe :)
 

Blender3D

Top Contributor
Kleine Anmerkung:
In diesem Fall solltest du gar nicht von JFrame erben. Man erbt von einer Klasse um dessen Funktionalität zu erweitern, was du aber nicht tust. Es reicht völlig aus in der Klasse Tr ein JFrame Objekt zu erstellen und über dieses das Fenster aufzubauen.
So wie ROBAT oben richtig bemerkt hat, sollte man nur von einer Klasse erben wenn es sinnvoll ist.
In Deinem Code genügt die Klasse JFrame.
Eine Klasse sollte nur dann erben, wenn man die Funktionalität dieser Klasse benötigt und diese erweitern will.
 

Leon_2001

Aktives Mitglied
Für was ist dann dieser Aufbau, den ich gewählt habe, gut?
In schon mehreren Tutorials wurde immer dieser Aufbau gewählt... Warum macht man das? man kann ja schließlich nur einmal erben und an dieser stelle ist es ja nicht unbedingt notwendig...
 

Robat

Top Contributor
In schon mehreren Tutorials wurde immer dieser Aufbau gewählt
Dazu kann ich nur sagen: Leider!
Gewöhn es dir einfach ab solange du nicht die Funktionalität erweitern willst.

Warum macht man das?
Warum man erbt? Wie schon mehrmals erwähnt erbt dann von einer Klasse wenn man dessen Funktionalität erweitern will und die beiden Klassen somit sich ähneln.
Mach dir sowas immer an einem einfachen Beispiel klar. Du hast eine Klasse Tier die alle Attributen eines Tieres hat. Wenn du jetzt noch eine Kasse Katze hast (die ja ein Tier ist und somit auch die Eigenschaften davon besitzt) kannst du von Tier erben und zusätzliche Attribute / Methoden deklarieren. Somit hast du die Funktionalität von Tier erweitert.

Gruß Robert
 

Leon_2001

Aktives Mitglied
So nun habe ich den Code nochmal überarbeitet und ohne Superklasse erstellt

Code:
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class Cardtr2
{
     static JPanel cards;
     static JMenu rechnen;
     static JMenu credits;
     static JMenu feedback;
     static JMenu ende;

     static CardLayout c1;

    public static void main(String[] args)
    {
        Cardtr frame = new Cardtr("Taschenrechner");
        frame.setBounds(500, 200, 400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);   

        frame.setLayout(new BorderLayout());
       
        //Put the JMenuBar into a JPanel
        JPanel norden = new JPanel();
         JMenuBar bar = new JMenuBar();
          rechnen = new JMenu("rechnen");
          rechnen.setActionCommand("rechnen");
         bar.add(rechnen);
          credits = new JMenu("credits");     
          credits.setActionCommand("credits");
         bar.add(credits);
         feedback = new JMenu("feedback");
          feedback.setActionCommand("feedback");
         bar.add(feedback);
         ende = new JMenu("ende");
          ende.setActionCommand("ende");
         bar.add(ende);    
        norden.add(bar);
       
       
        //create cards
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Das ist Seite 1"));
       
        JPanel card2 = new JPanel();
        card2.setLayout(new BorderLayout());
        card2.add(new JLabel("Written by Leon De Andrade"), BorderLayout.CENTER);
       
        JPanel card3 = new JPanel();
        card3.add(new JLabel("Hier Feedback abgeben"));
   
        //create JPanel that contains the cards
        c1 = new CardLayout();
        cards = new JPanel();
        cards.setLayout(c1);
        cards.add(card1, "1");
        cards.add(card2, "2");
        cards.add(card3, "3");
       
        frame.add(norden, BorderLayout.PAGE_START);
        frame.add(cards, BorderLayout.CENTER);
       

    }

     public void actionperformed(ActionEvent evt)
     {    
         if (evt.getActionCommand().equals("rechnen"))
         {
             c1.show(cards, "1");
             }
         else if (evt.getActionCommand().equals("credits"))
         {
             c1.show(cards, "2");
         }
         else if (evt.getActionCommand().equals("feedback"))
         {
             c1.show(cards, "3");
         }
         else if (evt.getActionCommand().equals("ende"))
         {
             System.exit(0);   
         }
            
     }
}
So sieht das ganze jetzt aus.
Die gute Nachricht ist, er funktioniert genauso wie vorher mit wesentlich weniger Code und ohne extends und implements.
Die schlechte Nachricht ist, dass Problem hat sich nicht gelöst... Nach wie vor bleibt das JMenu selektiert und muss erst manuell wieder deselektiert werden.
Ich möchte es aber so haben wie bei einem JMenuItem... einmal drauf drücken, dann erscheint die neue Seite (funktioniert) und es wird automatisch deselektiert (funktioniert nicht), ohne, dass ich irgendwo nochmal klicken muss.


Hat jemand eine Idee wie?

@Robat Ich meinte eigentlich, warum in den Beispielen die Superklasse verwendet wird. Aber aufgrund des "Leider" nehme ich mal an, dass es keinen sinnvollen Grund dafür gibt.
Trotzdem nochmal vielen Dank für das Beispiel mit der Klasse Tier, gute Verdeutlichung :)
 

thecain

Top Contributor
Da Mittlerweile fast jeder der 2x Java richtig buchstabiert hat ein Tutorial schreibt, ist die Qualität leider nicht immer brauchbar.

Das was du da machst, macht jetzt aber nicht viel Sinn, du hat ja jetzt einfach dein "eben nicht erweitertest" JFrame als instanzvariable...
 

krgewb

Top Contributor

mrBrown

Super-Moderator
Mitarbeiter
Da Mittlerweile fast jeder der 2x Java richtig buchstabiert hat ein Tutorial schreibt, ist die Qualität leider nicht immer brauchbar.
Da würde ich das "richtig" streichen ;)

Ich möchte es aber so haben wie bei einem JMenuItem... einmal drauf drücken, dann erscheint die neue Seite (funktioniert) und es wird automatisch deselektiert (funktioniert nicht), ohne, dass ich irgendwo nochmal klicken muss.
Das sollte mit setSelected(false) gehen
 

Leon_2001

Aktives Mitglied
setSelected(false) werde ich mal ausprobieren. Hört sich auch logisch an :D

Die Kritik an der Instanzvariable leuchtet mir noch nicht ganz ein:confused:
Ich habe also dem Objekt Cardtr2 die Variable JFrame zugewiesen ... das ist anscheinend nicht gut?
Daher schreibe ich einfach JFrame frame = new JFrame("");? somit wird es zu einer Lokalen Variable? (setze ich im Konstruktor noch ein static davor wird es zu einer Klassenvariable?)

Stimmt das so alles? Was ist vorteilhafter Lokal -oder Klassenvariable? Sollte ich die Variable deklarieren oben bei den anderen Variablen (auch generell)... krgeweb z.B. hat dies ja abgesehen von JLabel nicht gemacht ... Wann ist das sinnvoll und wann nicht?

Ich hoffe ich habe diesmal alles richtig verstanden (vermutlich nicht, aber ich gebe mir Mühe:))
 

Leon_2001

Aktives Mitglied
Ich will praktisch eine richtiges Programm erstellen und diese haben immer ein Menü ... zusätzlich wollte ich mir auch die Möglichkeit offen halten JMenus mit JMenuItems noch hinzuzufügen,was bei JButtons nicht geht.
Ich dachte einfach, das JMenu ist flexibler und erfüllt den Zweck besser... außerdem lerne ich durch die auftretenden Probleme viel mehr als wenn ich es mit den einfacheren JButtons gemacht hätte ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Die Kritik an der Instanzvariable leuchtet mir noch nicht ganz ein:confused:
Ich habe also dem Objekt Cardtr2 die Variable JFrame zugewiesen ... das ist anscheinend nicht gut?
Daher schreibe ich einfach JFrame frame = new JFrame("");? somit wird es zu einer Lokalen Variable? (setze ich im Konstruktor noch ein static davor wird es zu einer Klassenvariable?)

Stimmt das so alles? Was ist vorteilhafter Lokal -oder Klassenvariable? Sollte ich die Variable deklarieren oben bei den anderen Variablen (auch generell)... krgeweb z.B. hat dies ja abgesehen von JLabel nicht gemacht ... Wann ist das sinnvoll und wann nicht?

Ich hoffe ich habe diesmal alles richtig verstanden (vermutlich nicht, aber ich gebe mir Mühe:))

Du nutzt immer noch Cardtr, was du nicht solltest, nutz stattdessen lieber direkt Jframe.
Instanzvariablen sind immer besser als static ;)
 

Leon_2001

Aktives Mitglied
du meinst Instanzvariablen sind nicht besser?
den eine instanzvariable verwende ich ja im Moment wie ja thecain bereits sagte. Und wenn ich JFrame Frame = new JFrame(""); benutze, dann nutze ich ja nicht mehr Cardtr und habe somit eine Lokale Variable, was ja besser ist .... ?

Oder missverstehe ich das ganze grade total:confused:
 

mrBrown

Super-Moderator
Mitarbeiter
du meinst Instanzvariablen sind nicht besser?
Doch, besser als Klassenvariablen sind sie.

den eine instanzvariable verwende ich ja im Moment wie ja thecain bereits sagte. Und wenn ich JFrame Frame = new JFrame(""); benutze, dann nutze ich ja nicht mehr Cardtr und habe somit eine Lokale Variable, was ja besser ist .... ?
Dein Fenster ist bisher nur lokal, und eben kein JFrame, sondern Cardtr. Du solltest Cardtr da ganz rauslassen, und einfach JFrame nutzen. Das kannst du erstmal lokal lassen, deine bisherigen statischen Variablen solltest du aber zu Instanzvariablen machen, und nicht static lassen
 

Leon_2001

Aktives Mitglied
Code:
public class Cardtr2
{
    
     static JPanel cards;
     static JMenu rechnen;
     static JMenu credits;
     static JMenu feedback;
     static JMenu ende;

     static CardLayout c1;
    

    public static void main(String[] args)
    {
sobald ich hier das static weg mache, bekomme ich den Fehler unten "Cannot make a static reference to the non-static field"

Daher verstehe ich nicht, wie ich die Variablen zu instanzvariablen mache...
 

Leon_2001

Aktives Mitglied
Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class Cardtr2
{
      JPanel cards;
      JMenu rechnen;
      JMenu credits;
      JMenu feedback;
      JMenu ende;

      CardLayout c1;
      JFrame frame;
    
        public Cardtr2()
        {
        frame = new JFrame("Taschenrechner");
        frame.setBounds(500, 200, 400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);   
        frame.setLayout(new BorderLayout());
       
       
        //Put the JMenuBar into a JPanel
        JPanel norden = new JPanel();
         JMenuBar bar = new JMenuBar();
          rechnen = new JMenu("rechnen");
          rechnen.setActionCommand("rechnen");
         bar.add(rechnen);
          credits = new JMenu("credits");     
          credits.setActionCommand("credits");
         bar.add(credits);
         feedback = new JMenu("feedback");
          feedback.setActionCommand("feedback");
         bar.add(feedback);
         ende = new JMenu("ende");
          ende.setActionCommand("ende");
         bar.add(ende);    
        norden.add(bar);
       
       
        //create cards
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Das ist Seite 1"));
       
        JPanel card2 = new JPanel();
        card2.setLayout(new BorderLayout());
        card2.add(new JLabel("Written by Leon De Andrade"), BorderLayout.CENTER);
       
        JPanel card3 = new JPanel();
        card3.add(new JLabel("Hier Feedback abgeben"));
   
        //create JPanel that contains the cards
        c1 = new CardLayout();
        cards = new JPanel();
        cards.setLayout(c1);
        cards.add(card1, "1");
        cards.add(card2, "2");
        cards.add(card3, "3");
       
        frame.add(norden, BorderLayout.PAGE_START);
        frame.add(cards, BorderLayout.CENTER);
        }
       
    public static void main(String[] args)
    {
        new Cardtr2();
        }
       

   
    public void actionperformed(ActionEvent evt)
     {    
         if (evt.getActionCommand().equals("rechnen"))
         {
             c1.show(cards, "1");
             }
         else if (evt.getActionCommand().equals("credits"))
         {
             c1.show(cards, "2");
         }
         else if (evt.getActionCommand().equals("feedback"))
         {
             c1.show(cards, "3");
         }
         else if (evt.getActionCommand().equals("ende"))
         {
             System.exit(0);   
         }
            
     }
}

Ich denke mal so ist es auch nicht richtig... das sagt schon allein die Tatsache, dass es nicht funktioniert.
Wobei ich denke, dass die Fehlerursache dafür ist, dass ich den Frame nicht hinzugefügt habe (add(frame); funktioniert leider nicht).
Sollte es dies nicht sein, wäre es nett, wenn du es mir einfach zeigst.... ich kann noch nicht so viel mit den Fachbegriffen anfangen und verstehe grade einfach nicht, wieso man gewisse Sachen nicht macht oder manche besser sind ... und wie man die besseren Varianten benutzt.
z.B. ein Objekt der Klasse Cardtr2 erstellen ---> Cardtr2 = new Cardtr2(); ... was hat das ganze mir dann gebracht:(

der Code ist jetzt einfach angelehnt an den aus der ersten Antwort aus diesem Thread.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich denke mal so ist es auch nicht richtig... das sagt schon allein die Tatsache, dass es nicht funktioniert.
Bei der Fehlerbeschreibung würde ich raten, es war grad Stromausfall und dein Rechner ist deshalb ausgegangen, weshalb es nicht funktioniert? ;)


Wobei ich denke, dass die Fehlerursache dafür ist, dass ich den Frame nicht hinzugefügt habe (add(frame); funktioniert leider nicht).
Nein, das Frame kann man nicht hinzufügen, dass ist das oberste ;)

Das Problem ist einfach nur, dass du das Fenster sichtbar machst, bevor irgendwas hinzugefügt wurde, setz das setVisible ans Ende, dann klappt es.


Allerdings solltest du noch mal überlegen, wie bei dir das Reagieren auf Aktions passieren soll...
 

krgewb

Top Contributor
Stimmt das so alles? Was ist vorteilhafter Lokal -oder Klassenvariable? Sollte ich die Variable deklarieren oben bei den anderen Variablen (auch generell)... krgeweb z.B. hat dies ja abgesehen von JLabel nicht gemacht ... Wann ist das sinnvoll und wann nicht?
Das JLabel namens ,,anweisung" muss dort oben sein. Anderenfalls würde das folgende überhaupt nicht gehen:
Java:
       if (event.getActionCommand().equals("Addieren")) {
           tr.anweisung.setText("Sie haben auf 'Addieren' geklickt.");
       }

vorher ging es doch mit ActionCommand auch :(

Mit jedem neuem schritt mache ich es noch schlimmer
Du hast derzeit gar keinen ActionListener!
 

krgewb

Top Contributor
Damals hattest du
Java:
Cardtr frame = new Cardtr("Taschenrechner");
In Cardtr.java steht wiederum
Java:
public class Cardtr extends JFrame implements MenuListener {
und z.B.
Java:
rechnen.addMenuListener(this);
 

Leon_2001

Aktives Mitglied
Ich denke das ganze ist einfach noch zu schwierig für mich. Ich versuche zwar eure Hilfe umzusetzen, aber zum einen funktioniert es nicht und ich verstehe es auch nicht.

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Cardtr2
{
      JPanel cards;
      JMenu rechnen;
      JMenu credits;
      JMenu feedback;
      JMenu ende;

      CardLayout c1;
      JFrame frame;
    
        public Cardtr2()
        {
        frame = new JFrame("Taschenrechner");
        frame.setBounds(500, 200, 400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
   
        DerHandler meinHandler = new DerHandler(this);
       
        //Put the JMenuBar into a JPanel
        JPanel norden = new JPanel();
         JMenuBar bar = new JMenuBar();
          rechnen = new JMenu("rechnen");
          rechnen.setActionCommand("rechnen");
          rechnen.addActionListener(meinHandler);
         bar.add(rechnen);
          credits = new JMenu("credits");
          credits.setActionCommand("rechnen");
          credits.addActionListener(meinHandler);
         bar.add(credits);
         feedback = new JMenu("feedback");
         feedback.setActionCommand("rechnen");
          feedback.addActionListener(meinHandler);
         bar.add(feedback);
         ende = new JMenu("ende");
         ende.setActionCommand("rechnen");
          ende.addActionListener(meinHandler);
         bar.add(ende);    
        norden.add(bar);
       
       
        //create cards
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Das ist Seite 1"));
       
        JPanel card2 = new JPanel();
        card2.setLayout(new BorderLayout());
        card2.add(new JLabel("Written by Leon De Andrade"), BorderLayout.CENTER);
       
        JPanel card3 = new JPanel();
        card3.add(new JLabel("Hier Feedback abgeben"));
   
        //create JPanel that contains the cards
        c1 = new CardLayout();
        cards = new JPanel();
        cards.setLayout(c1);
        cards.add(card1, "1");
        cards.add(card2, "2");
        cards.add(card3, "3");
       
        frame.add(norden, BorderLayout.PAGE_START);
        frame.add(cards, BorderLayout.CENTER);
        frame.setVisible(true);   
        }
       
       
    public static void main(String[] args)
    {
        new Cardtr2();
        }
}   
    class DerHandler implements ActionListener {

        Cardtr2 tr;

         public DerHandler(Cardtr2 tr) {
         this.tr = tr;
         }

    

   
    public void actionPerformed(ActionEvent evt)
     {    
        if (evt.getActionCommand().equals("rechnen"))
         {
             c1.show(cards, "1");
             }
         else if (evt.getActionCommand().equals("credits"))
         {
             c1.show(cards, "2");
         }
         else if (evt.getActionCommand().equals("feedback"))
         {
             c1.show(cards, "3");
         }
         else if (evt.getActionCommand().equals("ende"))
         {
             System.exit(0);   
         }
     
     }
}

z.B.
Wozu unbedingt dieser Aufwand? Mit einer Klassenvariable hat es wunderbar funktioniert.
Was macht derHandler? Wie funktioniert er?
Oder auch, was ich jetzt noch machen muss, dass es endlich läuft.

Da ich nicht möchte, dass ihr am Ende die ganze Arbeit habt, beschäftige ich mich erst einmal nochmal mit den Grundlagen weiter und kehre hierzu wieder zurück, wenn ich was mit den gennanten Begriffen wie z.B. den Variablentypen anfangen kann.
 

krgewb

Top Contributor
Das kompiliert so nicht. Du musst c1 und cards jetzt über tr ansprechen. Also z.B. so:
Java:
tr.c1.show(tr.cards, "1");
und nicht so:
Java:
c1.show(cards, "1");

Aber das Programm wird trotzdem nicht funktionieren. Du musst nicht ActionListener verwenden sondern MenuListener (wie in Beitrag #4).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jats Hilfe bei FocusListener für Taschenrechner AWT, Swing, JavaFX & SWT 4
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
H Applet Flappy Bird für Noobs AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
T Hintergrund für GUI AWT, Swing, JavaFX & SWT 1
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
C JavaFX Character Comparator für TableColumn AWT, Swing, JavaFX & SWT 0
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
S Pfad für Speichervorgang auswählen AWT, Swing, JavaFX & SWT 11
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
R JMenuItems für Touchscreen auseinanderziehen AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
G Grafikformat für AWT-Applet? AWT, Swing, JavaFX & SWT 0
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
Z JavaFX TableView cellValueFactory für Arrays AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben