Getter Problematik mit ItemListener

mwb

Mitglied
Hallo zusammen,

ich arbeite mich aktuell in die Basics von Java ein und erstelle in diesem Zusammenhang einen Taschenrechner. Der Rechner tut was er soll, er wirft Ergebnisse aus. Nun mehr möchte ich den Rechner (auch im Hinblick auf neue Funktionalitäten) erweitern.

Ich verwende ein verschachteltes Layout:
  • Für die Gesamtdarstellung wird ein BorderLayout genutzt von denen bisher North und Center genutzt werden
  • Im North Bereich nutze ich ein BoxLayout um einmal die Ausgaben anzuzeigen und um Bedienelemente anzuzeigen
  • Der Center Bereich nutzt ein GridLayout für die Darstellung der jeweiligen Tasten
Vor dem eigentlichen Code mein aktuelles Problem:

Der North Bereich enthält eine Checkbox, welche dazu genutzt werden soll, erweiterte Tasten anzeigen zu lassen. Die Default Einstellung enthält die grundlegenden Tasten von 0-9 sowie die Grundrechenarten, die Erweiterten Einstellungen sollen ein größeres Tastenfeld mit Funktionalitäten wie bspw. Wurzel, Potenz, etc. darstellen.
Der Ablauf soll nun wiefolgt realisiert werden: Sobald die Checkbox angeklickt wird soll dieses über einen ItemListener abgefangen und die boolsche Variable buttonsetdefault auf einen neuen Wert (false) gesetzt werden. Daraufhin soll das Tastenfeld mittels einer If-Schleife ausgetauscht werden. Der Initialwert von buttonsetdefault beträgt true, damit das einfache Tastenfeld erscheint.

Nachfolgend der relevante Code:

Java:
package Calculator;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FrameConstructor extends JFrame{
  
    JButton display, button, test1, test2;
    JPanel pnlNorth, pnlCenter;
    JCheckBox cbxerw;
    double result, fixed10;
    Double input2, store;
    boolean start;
    public boolean buttonsetdefault;
    String lastCommand, recall, pm, pm3;
    Float pm2;
  
    //Nachfolgende Methode erzeugt das JFrame
  
    public FrameConstructor(){
      
        setVisible(true);
        setTitle("Calculator advanced");
        createUserInterface();
        add(pnlNorth, BorderLayout.NORTH);
        add(pnlCenter, BorderLayout.CENTER);
        pack();
      
    }
  
    void createUserInterface(){
      
        //North Content
                pnlNorth=new JPanel();
                pnlNorth.setLayout(new BoxLayout(pnlNorth, BoxLayout.Y_AXIS));
              
                display=new JButton("0");
                display.setEnabled(false);
              

              
                test1=new JButton("Ich bin Button 1");
                test2=new JButton("Ich bin Button 2");
                cbxerw=new JCheckBox("Erweiterte Operationen anzeigen");
                cbxerw.addItemListener(new CbxerwListener());
                add(cbxerw);
              
                pnlNorth.add(display);
                pnlNorth.add(test1);
                pnlNorth.add(test2);
                pnlNorth.add(cbxerw);
              
              
                //Initializing pnlCenter Variables
                result=0;
                lastCommand="=";
                start=true;
                fixed10=10;
                buttonsetdefault=true;
                System.out.println("Initialer Wert für Buttonsetdefault: " +buttonsetdefault);
              
                pnlCenter=new JPanel();
                if(buttonsetdefault==true){
              
                //Center Content
                pnlCenter.setLayout(new GridLayout(4,4));
              

                //Adding Buttons:Default button set
                addButton("7", insert);
                addButton("8", insert);
                addButton("9", insert);
                addButton("/", command);
              
                addButton("4", insert);
                addButton("5", insert);
                addButton("6", insert);
                addButton("*", command);
              
                addButton("1", insert);
                addButton("2", insert);
                addButton("3", insert);
                addButton("-", command);
              
                addButton("0", insert);
                addButton(".", insert);
                addButton("=", command);
                addButton("+", command);
                }else{
                    pnlCenter.setLayout(new GridLayout(7,5));
                      addButton("del", handling);
                         addButton("sto", handling);
                         addButton("rcl", handling);
                         addButton("+/-", handling);
                       
                         addButton("7", insert);
                      addButton("8", insert);
                      addButton("9", insert);
                      addButton("/", command);
               
                      addButton("4", insert);
                      addButton("5", insert);
                      addButton("6", insert);
                      addButton("*", command);
               
                      addButton("1", insert);
                      addButton("2", insert);
                      addButton("3", insert);
                      addButton("-", command);
               
                      addButton("0", insert);
                      addButton(".", insert);
                      addButton("=", command);
                      addButton("+", command);
                    
                      addButton("e^x", command2);
                      addButton("sqrt", command2);
                      addButton("cbrt", command2);
                      addButton("10^x", command2);
                    
                      addButton("pow", command);
                }

    }

                /*
                 * Implementing ItemListener for CheckBox interaction
                 */
              
                private class CbxerwListener implements ItemListener{
                    public void itemStateChanged(ItemEvent event){
                    if (cbxerw.isSelected()) {
                            buttonsetdefault=false;
                        } else {
                            buttonsetdefault=true;
                        }
                    //System.out.println("Buttonsetdefault am Ende der If-Schleife: " + buttonsetdefault);
                    }

                }

Die Erstellung des Fensters erfolgt mittels nachfolgender Klasse:

Java:
package Calculator;

import javax.swing.JFrame;

public class CalculatorAdvanced {

    public static void main(String[] args) {
        FrameConstructor frame=new FrameConstructor();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Mein Problem besteht darin, dass ich den Wert von buttonsetdefault aus dem ItemListener nicht abfangen kann. Ich habe versucht mit einem Getter zu arbeiten, das dürfte allerdings aufgrund der void Deklaration im ItemListener nicht funktionieren (korregiert mich, wenn ich falsch liege).

Daher meine Frage: Wie kann ich die Werte abgreifen und dann der If-Schleife für die Erzeugung der Buttons zuleiten? Aktuell stehe ich da ein wenig auf dem Schlauch.

Über Hinweise bin ich dankbar.
 
Zuletzt bearbeitet:
Verstehe nicht ganz was deine ItemListener zurück geben soll.
In meinen Augen setzt er nur deinen Wert auf true/false. Müsstest du die nicht Methode für deine Buttons erneut aufrufen?
Könnte mich auch irren, bin silber erst neu dabei 😉
 
Das siehst du richtig, sie werden nur auf true bzw. false gesetzt. Genau das soll der ItemListener tun. Allerdings besteht das Problem, dass ich dieses true/false nicht aus der Schleife des ItemListeners an die If-Schleife geben kann, so dass diese stets mit dem Initialwert arbeitet.

Die Buttons können einfach ignoriert werden, die habe ich nur Testweise dort positioniert und sie werden wieder verschwinden.
 
Du benötigst eine Methode, die die alten Buttons löscht und die nun benötigten hinzufügt. Diese Methode musst du in deinem Listener aufrufen. Dadurch wird bei jeder Änderung das Feld neu generiert.
 
Genau das ist es was Henne meinte, du hast so zusagen einen Schalter der hin und her klickt ohne dabei ans Stromnetz angeschloßen zu sein. Erzeuge eine neue Methode und setzte sie unter deinen "Schalter".
Nur weil du Variablen änderst heißt es nicht das dein Programm zuhört 😀
 
Hi ihr beiden,

vielen Dank für euern Input. Ich überlege mir mal, wie ich das angehen kann. Was mir noch nicht gänzlich klar ist, wie ich dann das Layout steuere, aber ich denke mal ein wenig drüber nach.
 
Du musst das Layout neu initialisieren, sprich du kannst nicht deine GUI aufbauen, Änderungen an Form und Farbe der Buttons vornehmen und dann darauf hoffen das dein Programm es mitbekommt. Ich habe meinen Frame einfach über
Java:
frmRechner.setVisible( true );
neu angesprochen, meines Wissens nach wird der Layoutmanager dadurch neu aufgerufen.
 
@Henne079

Danke für dein Angebot, irgendwie mag mir grade diese Methode nicht gelingen. Aber ich möchte morgen Vormittag mir das nochmal in Ruhe anschauen, es kann ja nicht angehen, dass ich bei so etwas wie der Zuweisung eines Variablenwertes scheitere. Manchmal fällt mir eine Lösung bei den komischsten Tätigkeiten ein ^^.
Falls ich doch Unterstützung benötigen sollte, komme ich aber gerne nochmal auf dich zu.
 
@Henne079

Ich möchte auf dein Angebot zurück kommen, da ich Probleme habe, die neue Methode richtig zum Laufen zu kriegen. Vor dem Code meine Grundgedanken zum Methoden Design:

  • Die Methode wird aus dem ItemListener der Checkbox heraus aufgerufen, wobei der ItemListener den Wert für die boolsche Variable buttonsetdefault übergibt
  • Die Methode wurde mit einer Parameterliste definiert, so dass ein boolscher Wert immer von Nöten ist
  • Die Unterscheidung ob ein Austauschen des Panels notwendig ist, erfolgt mittels if-Schleife innerhalb der Methode
  • Im Falle des erweiterten Buttonsets (buttonsetdefault==false) soll das in der Methode definierte Gridlayout im Center Panel erzeugt werden

Der Code der Methode:
Java:
//Implementing Switch pnlCenter for switching GridLayout
                   void switchpnlCenter(boolean x){
                        System.out.println("Der vom ItemListener übergebene Wert ist: " +x);
                        if(x==true){
                            System.out.println("Default Set wird beibehalten");
                        }else{
                            pnlCenter.setLayout(new GridLayout(7,5));
                              addButton("del", handling);
                                 addButton("sto", handling);
                                 addButton("rcl", handling);
                                 addButton("+/-", handling);
                                
                                 addButton("7", insert);
                              addButton("8", insert);
                              addButton("9", insert);
                              addButton("/", command);
                        
                              addButton("4", insert);
                              addButton("5", insert);
                              addButton("6", insert);
                              addButton("*", command);
                        
                              addButton("1", insert);
                              addButton("2", insert);
                              addButton("3", insert);
                              addButton("-", command);
                        
                              addButton("0", insert);
                              addButton(".", insert);
                              addButton("=", command);
                              addButton("+", command);
                             
                              addButton("e^x", command2);
                              addButton("sqrt", command2);
                              addButton("cbrt", command2);
                              addButton("10^x", command2);
                             
                              addButton("pow", command);
                             
                              repaint();
                        }
                   }

Der Code des ItemListeners:
Java:
                private class CbxerwListener implements ItemListener{
                    public void itemStateChanged(ItemEvent event){
                    if (cbxerw.isSelected()) {
                            buttonsetdefault=false;
                            switchpnlCenter(buttonsetdefault);
                        } else {
                            buttonsetdefault=true;
                            switchpnlCenter(buttonsetdefault);
                        }
                    }

                }

Der Code als Gesamtansicht:

Java:
public class FrameConstructorOne extends JFrame{

    JButton display, button, test1, test2;
    JPanel pnlNorth, pnlCenter;
    JCheckBox cbxerw;
    double result, fixed10;
    Double input2, store;
    boolean start;
    public boolean buttonsetdefault;
    String lastCommand, recall, pm, pm3;
    Float pm2;
   
    //Nachfolgende Methode erzeugt das JFrame
   
    public FrameConstructorOne(){
       
        setVisible(true);
        setTitle("Calculator advanced");
        createUserInterface();
        add(pnlNorth, BorderLayout.NORTH);
        add(pnlCenter, BorderLayout.CENTER);
        pack();
       
    }
   
    void createUserInterface(){
       
        //North Content
                pnlNorth=new JPanel();
                pnlNorth.setLayout(new BoxLayout(pnlNorth, BoxLayout.Y_AXIS));
               
                display=new JButton("0");
                display.setEnabled(false);
               

               
                test1=new JButton("Ich bin Button 1");
                test2=new JButton("Ich bin Button 2");
                cbxerw=new JCheckBox("Erweiterte Operationen anzeigen");
                cbxerw.addItemListener(new CbxerwListener());
                add(cbxerw);
               
                pnlNorth.add(display);
                pnlNorth.add(test1);
                pnlNorth.add(test2);
                pnlNorth.add(cbxerw);
               
               
                //Initializing pnlCenter Variables
                result=0;
                lastCommand="=";
                start=true;
                fixed10=10;
                buttonsetdefault=true;
                //System.out.println("Initialer Wert für Buttonsetdefault: " +buttonsetdefault);
               
                pnlCenter=new JPanel();
                if(buttonsetdefault==true){
               
                //Center Content
                pnlCenter.setLayout(new GridLayout(4,4));
               

                //Adding Buttons:Default button set
                addButton("7", insert);
                addButton("8", insert);
                addButton("9", insert);
                addButton("/", command);
               
                addButton("4", insert);
                addButton("5", insert);
                addButton("6", insert);
                addButton("*", command);
               
                addButton("1", insert);
                addButton("2", insert);
                addButton("3", insert);
                addButton("-", command);
               
                addButton("0", insert);
                addButton(".", insert);
                addButton("=", command);
                addButton("+", command);
                }else{
                    pnlCenter.setLayout(new GridLayout(7,5));
                      addButton("del", handling);
                         addButton("sto", handling);
                         addButton("rcl", handling);
                         addButton("+/-", handling);
                        
                         addButton("7", insert);
                      addButton("8", insert);
                      addButton("9", insert);
                      addButton("/", command);
                
                      addButton("4", insert);
                      addButton("5", insert);
                      addButton("6", insert);
                      addButton("*", command);
                
                      addButton("1", insert);
                      addButton("2", insert);
                      addButton("3", insert);
                      addButton("-", command);
                
                      addButton("0", insert);
                      addButton(".", insert);
                      addButton("=", command);
                      addButton("+", command);
                     
                      addButton("e^x", command2);
                      addButton("sqrt", command2);
                      addButton("cbrt", command2);
                      addButton("10^x", command2);
                     
                      addButton("pow", command);
                }

    }
               
                //Creating method for Button interaction, adding Buttons to plnCenter
                private void addButton(String label, ActionListener listener) {
                    button=new JButton(label);           
                    button.addActionListener(listener);           
                    pnlCenter.add(button);                           
                }
               
                //Adding ActionListeners for Button interaction
               
                ActionListener insert = new InsertAction();                                //Number interaction
                ActionListener command = new CommandAction();                            //Operand interaction
                ActionListener command2 = new CommandAction2();                            //Extended Operand interaction
                ActionListener handling = new HandlingAction();                            //Store, Recall, Delete Operations
               
                /*
                 * Implementing ItemListener for CheckBox interaction
                 */
               
                private class CbxerwListener implements ItemListener{
                    public void itemStateChanged(ItemEvent event){
                    if (cbxerw.isSelected()) {
                            buttonsetdefault=false;
                            switchpnlCenter(buttonsetdefault);
                        } else {
                            buttonsetdefault=true;
                            switchpnlCenter(buttonsetdefault);
                        }
                    }

                }
               
                /*
                 * Implementing ActionListeners for Button interaction
                 */
               
                //Implementing Insert Listener for number interaction
                private class InsertAction implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String input=event.getActionCommand();
                        input2=Double.parseDouble(input);
                        if(start==true){
                            display.setText("");
                            start=false;
                        }
                        display.setText(display.getText() + input);                        //Sending corresponding number to display
                    }
                }
               
                /*
                 * Implementing Command Listener for operand interaction
                 */
                private class CommandAction implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String command=event.getActionCommand();
                        if(start==true){                                                //Setting minus as first sign
                            if(command.equals ("-")){
                                display.setText(command);
                                start=false;
                            }else{                                                        //Setting operand value to lastCommand operator
                                lastCommand=command;
                            }
                        }else{
                            calculate(Double.parseDouble(display.getText()));            //Handing Operation over to Method calculate(double x)
                            start=true;
                        }
                    }
                }
               
                /*
                 * Implementing Command Listener for extended Operations
                 */
               
                private class CommandAction2 implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String command2=event.getActionCommand();
                        calculate2(Double.parseDouble(display.getText()));
                    }
                }
               
                /*
                 * Implementing Handling Listener for store, delete, recall
                 */
               
                private class HandlingAction implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String handling=event.getActionCommand();
                        if(handling.equals("sto")){
                            store=Double.parseDouble(display.getText());
                            display.setText("0");
                            start=true;
                        }else if(handling.equals("rcl")){
                            String recall=String.valueOf(store);
                            display.setText(display.getText() +recall);
                            start=false;
                        }else if(handling.equals("del")){
                            result=0;
                            start=true;
                            display.setText("");
                        }else if(handling.equals("pm")){
                            String pm=display.getText();
                            Float pm2=Float.valueOf(pm);
                            pm2 *= -1;
                            String pm3=String.valueOf(pm2);
                            display.setText(pm3);
                            result=Double.parseDouble(pm3);
                            start=false;
                        }
                    }
                }
               
                /*
                 * Implementing calculate Methods
                 */
               
                //Implementing command calculation
                public void calculate(double x){
                    if (lastCommand.equals("+")) result += x;
                    else if (lastCommand.equals("-")) result -= x;
                    else if (lastCommand.equals("*")) result *= x;
                    else if (lastCommand.equals("/")) result /= x;
                    else if (lastCommand.equals("=")) result = x;
                    else if(lastCommand.equals("pow")) result=Math.pow(result, x);
                    display.setText("" + result);
                }
               
                //Implementing command2 calculation
                   public void calculate2(double x)
                   {
                       if(command2.equals("e^x")) result=Math.exp(x);
                       if(command2.equals("sqrt")) result=Math.sqrt(x);
                       if(command2.equals("cbrt")) result=Math.cbrt(x);
                       else if(command2.equals("10^x")) result=Math.pow(fixed10, x);
                       display.setText("" + result);
                      
                   }
                  
                //Implementing Switch pnlCenter for switching GridLayout
                   void switchpnlCenter(boolean x){
                        System.out.println("Der vom ItemListener übergebene Wert ist: " +x);
                        if(x==true){
                            System.out.println("Default Set wird beibehalten");
                        }else{
                            pnlCenter.setLayout(new GridLayout(7,5));
                              addButton("del", handling);
                                 addButton("sto", handling);
                                 addButton("rcl", handling);
                                 addButton("+/-", handling);
                                
                                 addButton("7", insert);
                              addButton("8", insert);
                              addButton("9", insert);
                              addButton("/", command);
                        
                              addButton("4", insert);
                              addButton("5", insert);
                              addButton("6", insert);
                              addButton("*", command);
                        
                              addButton("1", insert);
                              addButton("2", insert);
                              addButton("3", insert);
                              addButton("-", command);
                        
                              addButton("0", insert);
                              addButton(".", insert);
                              addButton("=", command);
                              addButton("+", command);
                             
                              addButton("e^x", command2);
                              addButton("sqrt", command2);
                              addButton("cbrt", command2);
                              addButton("10^x", command2);
                             
                              addButton("pow", command);
                             
                              repaint();
                        }
                   }
}

Über das println in der Methode kann ich erkennen, dass der richtige boolsche Wert an die Methode übergeben wird. Allerdings tut sich am panel noch rein garnichts. Ich überlege, ob ich den ursprünglichen pnlCenter Inhalt (abgesehen von der noch vorhandenen if-Schleife) nicht noch löschen müsste, eigentlich hatte ich hierfür extra das repaint() angedacht.

Vielleicht kannst du mir noch einen Tipp geben, wo ich was falsch einbinde, bzw. was nicht genau stimmt. Ich würde mich freuen.
 
Ich lehne mich mal ganz weit aus dem Fenster und versuche dabei nicht raus zu fallen.
Schreibe eine Methode die dir dein Panel komplett sauber macht und versuche danach mal deine Elemente hin zu fügen. Da deine boolean werte ankommen müsste dein ItemListener anscheinend ohne Probleme funktionieren.

Im Zweifelsfall einmal durch debugen und die Schritte logisch mitgehen 🙂
 
@ keram:

Ich schätze, ich werde nicht darum kommen, eine komplett neue Methode zu schreiben, die das Center Panel löscht und neu zeichnet, hier muss ich allerdings überlegen, wie ich dies anstelle (mir ist das mit dem löschen noch nicht ganz klar, keine Ahnung wie ich das realisieren soll). Die Boolean Werte kamen zwar vom ItemListener an die neue Methode, die Übergabe an meine createUserInterface war jedoch nicht ganz sauber, daher anschließend nochmal die aktuelle Code Version. Dennoch ändert es nichts am Ergebnis: Die If-Schleife scheint - trotz nun mehr korrekt übergebener boolean Werte - nicht zu funktionieren (ursprünglich wollte ich dies ja genau gewährleisten).

Code mit korrekter Übergabe der boolean Werte an die Methode createUserInterface:

Java:
package Calculator;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class FrameConstructorOne extends JFrame{

    JButton display, button, test1, test2;
    JPanel pnlNorth, pnlCenter;
    JCheckBox cbxerw;
    double result, fixed10;
    Double input2, store;
    boolean start;
    boolean buttonsetdefault=true;
    String lastCommand, recall, pm, pm3;
    Float pm2;
 
    //Nachfolgende Methode erzeugt das JFrame
 
    public FrameConstructorOne(){
     
        setVisible(true);
        setTitle("Calculator advanced");
        createUserInterface(buttonsetdefault);
        add(pnlNorth, BorderLayout.NORTH);
        add(pnlCenter, BorderLayout.CENTER);
        pack();
     
    }
 
    void createUserInterface(boolean buttonsetdefault){
     
        System.out.println("An das Userinterface übergebener Parameter: " +buttonsetdefault);
     
        //North Content
                pnlNorth=new JPanel();
                pnlNorth.setLayout(new BoxLayout(pnlNorth, BoxLayout.Y_AXIS));
             
                display=new JButton("0");
                display.setEnabled(false);
             

             
                test1=new JButton("Ich bin Button 1");
                test2=new JButton("Ich bin Button 2");
                cbxerw=new JCheckBox("Erweiterte Operationen anzeigen");
                cbxerw.addItemListener(new CbxerwListener());
                add(cbxerw);
             
                pnlNorth.add(display);
                pnlNorth.add(test1);
                pnlNorth.add(test2);
                pnlNorth.add(cbxerw);
             
             
                //Initializing pnlCenter Variables
                result=0;
                lastCommand="=";
                start=true;
                fixed10=10;
                //System.out.println("Initialer Wert für Buttonsetdefault: " +buttonsetdefault);
             
                pnlCenter=new JPanel();
                System.out.println("pnlCenter Wert für Variable Buttonsetdefault: " +buttonsetdefault);
                if(buttonsetdefault==true){
             
                //Center Content
                pnlCenter.setLayout(new GridLayout(4,4));
             

                //Adding Buttons:Default button set
                addButton("7", insert);
                addButton("8", insert);
                addButton("9", insert);
                addButton("/", command);
             
                addButton("4", insert);
                addButton("5", insert);
                addButton("6", insert);
                addButton("*", command);
             
                addButton("1", insert);
                addButton("2", insert);
                addButton("3", insert);
                addButton("-", command);
             
                addButton("0", insert);
                addButton(".", insert);
                addButton("=", command);
                addButton("+", command);
                }else{
                    pnlCenter.setLayout(new GridLayout(7,5));
                      addButton("del", handling);
                         addButton("sto", handling);
                         addButton("rcl", handling);
                         addButton("+/-", handling);
                      
                         addButton("7", insert);
                      addButton("8", insert);
                      addButton("9", insert);
                      addButton("/", command);
              
                      addButton("4", insert);
                      addButton("5", insert);
                      addButton("6", insert);
                      addButton("*", command);
              
                      addButton("1", insert);
                      addButton("2", insert);
                      addButton("3", insert);
                      addButton("-", command);
              
                      addButton("0", insert);
                      addButton(".", insert);
                      addButton("=", command);
                      addButton("+", command);
                   
                      addButton("e^x", command2);
                      addButton("sqrt", command2);
                      addButton("cbrt", command2);
                      addButton("10^x", command2);
                   
                      addButton("pow", command);
                   
                }

    }
             
                //Creating method for Button interaction, adding Buttons to plnCenter
                private void addButton(String label, ActionListener listener) {
                    button=new JButton(label);         
                    button.addActionListener(listener);         
                    pnlCenter.add(button);                         
                }
             
                //Adding ActionListeners for Button interaction
             
                ActionListener insert = new InsertAction();                                //Number interaction
                ActionListener command = new CommandAction();                            //Operand interaction
                ActionListener command2 = new CommandAction2();                            //Extended Operand interaction
                ActionListener handling = new HandlingAction();                            //Store, Recall, Delete Operations
             
                /*
                 * Implementing ItemListener for CheckBox interaction
                 */
             
                private class CbxerwListener implements ItemListener{
                    public void itemStateChanged(ItemEvent event){
                    if (cbxerw.isSelected()) {
                            buttonsetdefault=false;
                            switchpnlCenter(buttonsetdefault);
                        } else {
                            buttonsetdefault=true;
                            switchpnlCenter(buttonsetdefault);
                        }
                    }

                }
             
                /*
                 * Implementing ActionListeners for Button interaction
                 */
             
                //Implementing Insert Listener for number interaction
                private class InsertAction implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String input=event.getActionCommand();
                        input2=Double.parseDouble(input);
                        if(start==true){
                            display.setText("");
                            start=false;
                        }
                        display.setText(display.getText() + input);                        //Sending corresponding number to display
                    }
                }
             
                /*
                 * Implementing Command Listener for operand interaction
                 */
                private class CommandAction implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String command=event.getActionCommand();
                        if(start==true){                                                //Setting minus as first sign
                            if(command.equals ("-")){
                                display.setText(command);
                                start=false;
                            }else{                                                        //Setting operand value to lastCommand operator
                                lastCommand=command;
                            }
                        }else{
                            calculate(Double.parseDouble(display.getText()));            //Handing Operation over to Method calculate(double x)
                            start=true;
                        }
                    }
                }
             
                /*
                 * Implementing Command Listener for extended Operations
                 */
             
                private class CommandAction2 implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String command2=event.getActionCommand();
                        calculate2(Double.parseDouble(display.getText()));
                    }
                }
             
                /*
                 * Implementing Handling Listener for store, delete, recall
                 */
             
                private class HandlingAction implements ActionListener{
                    public void actionPerformed(ActionEvent event){
                        String handling=event.getActionCommand();
                        if(handling.equals("sto")){
                            store=Double.parseDouble(display.getText());
                            display.setText("0");
                            start=true;
                        }else if(handling.equals("rcl")){
                            String recall=String.valueOf(store);
                            display.setText(display.getText() +recall);
                            start=false;
                        }else if(handling.equals("del")){
                            result=0;
                            start=true;
                            display.setText("");
                        }else if(handling.equals("pm")){
                            String pm=display.getText();
                            Float pm2=Float.valueOf(pm);
                            pm2 *= -1;
                            String pm3=String.valueOf(pm2);
                            display.setText(pm3);
                            result=Double.parseDouble(pm3);
                            start=false;
                        }
                    }
                }
             
                /*
                 * Implementing calculate Methods
                 */
             
                //Implementing command calculation
                public void calculate(double x){
                    if (lastCommand.equals("+")) result += x;
                    else if (lastCommand.equals("-")) result -= x;
                    else if (lastCommand.equals("*")) result *= x;
                    else if (lastCommand.equals("/")) result /= x;
                    else if (lastCommand.equals("=")) result = x;
                    else if(lastCommand.equals("pow")) result=Math.pow(result, x);
                    display.setText("" + result);
                }
             
                //Implementing command2 calculation
                   public void calculate2(double x)
                   {
                       if(command2.equals("e^x")) result=Math.exp(x);
                       if(command2.equals("sqrt")) result=Math.sqrt(x);
                       if(command2.equals("cbrt")) result=Math.cbrt(x);
                       else if(command2.equals("10^x")) result=Math.pow(fixed10, x);
                       display.setText("" + result);
                    
                   }
                
                //Implementing Switch pnlCenter for switching GridLayout
                   void switchpnlCenter(boolean x){
                        System.out.println("Der vom ItemListener übergebene Wert ist: " +x);
                        if(x==true){
                            System.out.println("Default Set wird beibehalten");
                        }else{
                            createUserInterface(buttonsetdefault);
                         
                           
                              repaint();
                        }
                   }
}

Zielsetzung lautet also:

  • Default Buttonset zum Start anzeigen
  • ItemListener einfügen, um boolsche Werte an die Methode zu übergeben (done)
  • Methode erstellen, welches das Center Panel löscht und dann neu aufbaut

Nun gut, da ich bei dem Wetter eh nicht wie geplant draußen sein kann, habe ich etwas Zeit um mir das zu durchdenken.

Unabhängig davon würde es mich nur mal interessieren, wieso grade in diesem Kontext die if-Schleife nicht funktioniert. Das diese ursprünglich das Defaultset mit dem kleinen GridLayout anzeigt ist ja einzusehen und erwünscht, da ich den boolwert entsprechend initialisiere. Nach Übergabe der Werte aus meinem ItemListener via Methode an createUserInterface hätte ich jedoch erwartet, dass die Schleife erneut durchlaufen wird, da nun mehr der false Wert korrekt übergeben wurde. Ich schätze, ich habe an der Stelle etwas übersehen. Aus Sicht des Lerneffekts wäre es jedoch mal gut das herauszufinden.
 
Zuletzt bearbeitet:
Java:
 if(buttonsetdefault==true){
ist ein falscher Ausdruck. Bei boolean hast du den Vorteil das du sie einfach in die Bedingung der if schleife schreiben kannst ohne einen Operator ran zu hängen, sprich

Java:
 if(buttonsetdefault) {
reicht völlig aus.

und dein setVisible immer erst dann schreiben wenn auch alles aufgebaut ist 🙂

Eine neue Methode muss nicht unbedingt erstellt werden, es reicht auch aus wenn du das erstellen deiner GUI in eine Methode verschiebst und BEVOR du alles hinzufügst einfach alles zurück setzt, dadurch muss du deine Methode zum erzeugen der GUI nur noch einmal aufrufen und der Rest kommt von alleine 🙂
 
Hmmm, also wenn ich einen Boolwert in einer If-Schleife auswerte wäre bei deiner Schreibweise der erste Fall (If) der true und der zweite Fall (else) false? Habe ich das richtig verstanden?
 
Stimmt genau

Java:
    boolean geschichte = true;
    if (geschichte) {
        //Wahre begebenheit
    } else {
        //Gelogen
    }

kannst also auch

Java:
    boolean geschichte = true;
    if (!geschichte) {
        //NICHT Wahre begebenheit
    } else {
        //NICHT Gelogen
    }
machen. Oder sogar

Java:
    boolean geschichte = true;
    boolean erzaehlung = true;
    if (geschichte && erzaehlung) {
        //Wahre begebenheit, wurde durch erzaehlung bestaetigt
    } else {
        //Gelogen
    }

und so weiter 🙂
 
Hallo zusammen,

nachdem ich die API nochmal eingehender studiert und ein wenig rumprobiert habe, konnte ich entsprechende Methoden erstellen, um das von mir gewünschte Ergebnis zu erhalten.

Java:
*
                    * Implementing Switching Methods for panel content
                    */
             
                    //Implementing Switch pnlCenter for switching GridLayout
                   void switchpnlCenter(boolean x){
                        if(x){
                            deletepnlCenterStandard();
                        }else{
                            deletepnlCenterEnhanced();
                 
                        }
                   }
               
                 //Implementing Method to delete pnlCenterEnhanced content
                   void deletepnlCenterEnhanced(){
                       pnlCenter.removeAll();
                       activateEnhancedButtonset();
                   }
              
                 //Implementing Method to delete pnlCenterStandard content
                   void deletepnlCenterStandard(){
                       pnlCenter.removeAll();
                       activateStandardButtonset();
                   }
              
                 //Implementing Method to draw enhanced buttonset
                   void activateEnhancedButtonset(){
                       pnlCenter.setLayout(new GridLayout(7,5));
                          addButton("del", handling);
                             addButton("sto", handling);
                             addButton("rcl", handling);
                             addButton("+/-", handling);
                          
                             addButton("7", insert);
                          addButton("8", insert);
                          addButton("9", insert);
                          addButton("/", command);
                  
                          addButton("4", insert);
                          addButton("5", insert);
                          addButton("6", insert);
                          addButton("*", command);
                  
                          addButton("1", insert);
                          addButton("2", insert);
                          addButton("3", insert);
                          addButton("-", command);
                  
                          addButton("0", insert);
                          addButton(".", insert);
                          addButton("=", command);
                          addButton("+", command);
                       
                          addButton("e^x", command2);
                          addButton("sqrt", command2);
                          addButton("cbrt", command2);
                          addButton("10^x", command2);
                       
                          addButton("pow", command);
                          pnlCenter.validate();
                          repaint();
                          pack();

                   }
                
                   //Implementing Method to draw standard buttonset
                     void activateStandardButtonset(){
                            pnlCenter.setLayout(new GridLayout(4,4));
                         
                            addButton("7", insert);
                            addButton("8", insert);
                            addButton("9", insert);
                            addButton("/", command);
                         
                            addButton("4", insert);
                            addButton("5", insert);
                            addButton("6", insert);
                            addButton("*", command);
                         
                            addButton("1", insert);
                            addButton("2", insert);
                            addButton("3", insert);
                            addButton("-", command);
                         
                            addButton("0", insert);
                            addButton(".", insert);
                            addButton("=", command);
                            addButton("+", command);
                         
                             pnlCenter.validate();
                             repaint();
                             pack();
                      
                     }


Damit kann ich nun mehr gewährleisten, dass das Buttonset nicht nur einmal getauscht wird, sondern stets, wenn die Checkbox betätigt wird.

Allerdings habe ich noch eine abschließende Frage: Ich versuche meinen Displaybutton nun auf die Größe meines Center Panels anzupassen. Hierzu versuche ich es mittels pnl.Center.getWidth(), allerdings erhalte ich hier einen Wert von 0 zurückgegeben, ein Fehler wird jedoch nicht ausgegeben. Welche Alternative kann ich anwenden, um meinen Displaybutton auf die Größe des größten Panels zu bringen? setSize verlangt ja sowohl Höhe als auch Länge, ich möchte jedoch nur über der länge arbeiten.
 

Zurück
Oben