Missa inte Amazon Prime Day i Dagens fynd
Permalänk
Medlem

Fråga ang. ActionListener

Jag sitter och fnular på en liten enkel miniräknare, främst för att lära mig hur ActionListener fungerar... Som det är nu så har jag ju lagt in en massa if-satser i actionPerformed och fått additionen att funka, men det känns som att jag låst likaMed-knappen till just additionen...

För att få in de tre övriga räknesätten så känner jag att det nog inte håller att koda så här. Skulle vara ytterst tacksam om någon kunde kolla på koden och ge lite åsikter.

Finns det t.ex. nåt smidigt sätt att få in de övriga räknesätten på samma sätt som additionen i den sista if-satsen som är kopplat till likaMed-knappen? Det känns som att jag har krånglat till det för mig ordentligt här...

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Miniräknare extends JFrame implements ActionListener { private double input1 = 0.0; private double input2 = 0.0; private double output = 0.0; private JTextField textfält = new JTextField(); private JButton knappAdd = new JButton("+"); private JButton knappSub = new JButton("-"); private JButton knappMul = new JButton("*"); private JButton knappDiv = new JButton("/"); private JButton likaMed = new JButton("="); private JButton knapp1 = new JButton("1"); private JButton knapp2 = new JButton("2"); private JButton knapp3 = new JButton("3"); private JButton knapp4 = new JButton("4"); private JButton knapp5 = new JButton("5"); private JButton knapp6 = new JButton("6"); private JButton knapp7 = new JButton("7"); private JButton knapp8 = new JButton("8"); private JButton knapp9 = new JButton("9"); private JButton knapp0 = new JButton("0"); public Miniräknare() { setTitle("Kalkylator"); Container innehåll = getContentPane(); innehåll.setLayout(new FlowLayout()); innehåll.add(textfält); innehåll.add(knappAdd); innehåll.add(knappSub); innehåll.add(knappMul); innehåll.add(knappDiv); innehåll.add(likaMed); innehåll.add(knapp1); innehåll.add(knapp2); innehåll.add(knapp3); innehåll.add(knapp4); innehåll.add(knapp5); innehåll.add(knapp6); innehåll.add(knapp7); innehåll.add(knapp8); innehåll.add(knapp9); innehåll.add(knapp0); textfält.setPreferredSize(new Dimension(180, 30)); knappAdd.addActionListener(this); knappSub.addActionListener(this); knappMul.addActionListener(this); knappDiv.addActionListener(this); likaMed.addActionListener(this); knapp1.addActionListener(this); knapp2.addActionListener(this); knapp3.addActionListener(this); knapp4.addActionListener(this); knapp5.addActionListener(this); knapp6.addActionListener(this); knapp7.addActionListener(this); knapp8.addActionListener(this); knapp9.addActionListener(this); knapp0.addActionListener(this); setSize(210, 200); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { if(e.getSource()== knapp1){ textfält.setText(textfält.getText() + 1); } if(e.getSource()== knapp2){ textfält.setText(textfält.getText() + 2); } if(e.getSource()== knapp3){ textfält.setText(textfält.getText() + 3); } if(e.getSource()== knapp4){ textfält.setText(textfält.getText() + 4); } if(e.getSource()== knapp5){ textfält.setText(textfält.getText() + 5); } if(e.getSource()== knapp6){ textfält.setText(textfält.getText() + 6); } if(e.getSource()== knapp7){ textfält.setText(textfält.getText() + 7); } if(e.getSource()== knapp8){ textfält.setText(textfält.getText() + 8); } if(e.getSource()== knapp9){ textfält.setText(textfält.getText() + 9); } if(e.getSource()== knapp0){ textfält.setText(textfält.getText() + 0); } if(e.getSource()== knappAdd){ input1 = Double.parseDouble(textfält.getText()); textfält.setText(""); } if(e.getSource()== knappSub){ input1 = Double.parseDouble(textfält.getText()); textfält.setText(""); } if(e.getSource()== knappMul){ input1 = Double.parseDouble(textfält.getText()); textfält.setText(""); } if(e.getSource()== knappDiv){ input1 = Double.parseDouble(textfält.getText()); textfält.setText(""); } if(e.getSource()== likaMed){ input2 = Double.parseDouble(textfält.getText()); output = input1 + input2; textfält.setText(String.valueOf(output)); } } public static void main(String[] argument) { new Miniräknare(); } }

Permalänk
Medlem

Vill du att din miniräknare ska fungera på samma sätt som miniräknaren i Windows?
Alltså, ska du få fram vad "5 + 6" blir så borde följande ske, med två utgångar (antingen att användaren klickar på "=" eller en annan operator):

Användaren gör stegen, det inom parentes är det som koden skall göra.
1. Skriv 5
2. klicka på "+" (värdet 5:an sparas som VALUE_ONE, operatorn ADDITION sparas)
3. skriv 6 (texten "5" ersätts med "6")
4a. klicka på "=" (texten "6" ersätts med "11" enligt uträkningen => (VALUE_ONE ADDITION nuvarande fält) vilket översätts till (5 + 6))
4b. klicka på någon annan operator "+-*/" (4a körs först sedan sparas resultatet i VALUE_ONE och operatorn sparas, ex: SUBTRACTION, om användaren klickade på -)

Denna lösning kräver en hierarki (helst) av objekt för att lösa ekvation av operator-hanteringen.

Ett annat alternativ istället för att spara operatorobjekt är att du sparar allt i klartext (5 + 6) och googlar fram hur man gör en "math evaluator" i Java.

Lycka till och hojta till om du behöver hjälp.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Citat:

Vill du att din miniräknare ska fungera på samma sätt som miniräknaren i Windows?
Alltså, ska du få fram vad "5 + 6" blir så borde följande ske, med två utgångar (antingen att användaren klickar på "=" eller en annan operator):

Tack för ditt svar! Kravet är endast att man ska kunna addera/subtrahera/multiplicera/dividera två tal, och sedan ska svaret kunna användas för en ny uträkning. Detta kanske gör saken enklare för mig?

Permalänk
Medlem
Skrivet av Fk m:

Tack för ditt svar! Kravet är endast att man ska kunna addera/subtrahera/multiplicera/dividera två tal, och sedan ska svaret kunna användas för en ny uträkning. Detta kanske gör saken enklare för mig?

Ja, kanske det. Jag skulle säga att det beror på hur du vill att din kalkylator ska fungera.

Du måste nog spara operatorn om du vill kunna ha det dynamiskt. Jag kan i alla fall inte tänka mig något annat sätt att göra det på än det jag skrev i förra inlägget. Detta, för att det är fyra steg tills att ett resultat uppnås.
1. Tal 1
2. operator
3. Tal 2
4. Resultat

Det går ju att förenkla kalkylatorn så att när användaren klickar på "+" så öppnas ett nytt formulär som ber om två tal och sedan summerar talen. Så gör du detta för division, multiplikation och subtraktion också.

Jag vet inte vad du har för krav på användarvänlighet och flöde.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Miniräknare extends JFrame implements ActionListener { private double input1 = 0.0; private double input2 = 0.0; private double output = 0.0; private int operator; private JTextField textfält = new JTextField(); private JButton knappAdd = new JButton("+"); private JButton knappSub = new JButton("-"); private JButton knappMul = new JButton("*"); private JButton knappDiv = new JButton("/"); private JButton likaMed = new JButton("="); private JButton knapp1 = new JButton("1"); private JButton knapp2 = new JButton("2"); private JButton knapp3 = new JButton("3"); private JButton knapp4 = new JButton("4"); private JButton knapp5 = new JButton("5"); private JButton knapp6 = new JButton("6"); private JButton knapp7 = new JButton("7"); private JButton knapp8 = new JButton("8"); private JButton knapp9 = new JButton("9"); private JButton knapp0 = new JButton("0"); public Miniräknare() { setTitle("Kalkylator"); Container innehåll = getContentPane(); innehåll.setLayout(new FlowLayout()); innehåll.add(textfält); innehåll.add(knappAdd); innehåll.add(knappSub); innehåll.add(knappMul); innehåll.add(knappDiv); innehåll.add(likaMed); innehåll.add(knapp1); innehåll.add(knapp2); innehåll.add(knapp3); innehåll.add(knapp4); innehåll.add(knapp5); innehåll.add(knapp6); innehåll.add(knapp7); innehåll.add(knapp8); innehåll.add(knapp9); innehåll.add(knapp0); textfält.setPreferredSize(new Dimension(180, 30)); knappAdd.addActionListener(this); knappSub.addActionListener(this); knappMul.addActionListener(this); knappDiv.addActionListener(this); likaMed.addActionListener(this); knapp1.addActionListener(this); knapp2.addActionListener(this); knapp3.addActionListener(this); knapp4.addActionListener(this); knapp5.addActionListener(this); knapp6.addActionListener(this); knapp7.addActionListener(this); knapp8.addActionListener(this); knapp9.addActionListener(this); knapp0.addActionListener(this); setSize(210, 200); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { Object compare = e.getSource(); String getText = textfält.getText(); if (compare == knapp1) { textfält.setText(getText + 1); } else if (compare == knapp2) { textfält.setText(getText + 2); } else if (compare == knapp3) { textfält.setText(getText + 3); } else if (compare == knapp4) { textfält.setText(getText + 4); } else if (compare == knapp5) { textfält.setText(getText + 5); } else if (compare == knapp6) { textfält.setText(getText + 6); } else if (compare == knapp7) { textfält.setText(getText + 7); } else if (compare == knapp8) { textfält.setText(getText + 8); } else if (compare == knapp9) { textfält.setText(getText + 9); } else if (compare == knapp0) { textfält.setText(getText + 0); } else if (compare == knappAdd) { input1 = Double.parseDouble(getText); operator = 0; textfält.setText(""); } else if (compare == knappSub) { input1 = Double.parseDouble(getText); operator = 1; textfält.setText(""); } else if (compare == knappMul) { input1 = Double.parseDouble(getText); operator = 2; textfält.setText(""); } else if (compare == knappDiv) { input1 = Double.parseDouble(getText); operator = 3; textfält.setText(""); } else if (compare == likaMed) { input2 = Double.parseDouble(getText); switch (operator) { case 0: output = input1 + input2; break; case 1: output = input1 - input2; break; case 2: output = input1 * input2; break; case 3: output = input1 / input2; break; } textfält.setText(String.valueOf(output)); } } public static void main(String[] argument) { new Miniräknare(); } }

Nått i den stilen borde fungera? Markerade mina ändringar med fetstil. Tog också bort varje anrop till getSource() och getText() för att minska antalet metodanrop och lade till else-statements så att inte alla if-satser evalueras vid varje anrop.