I am to make a simple calculator but I am having issues with this:
When the button is pressed it should do the following:
- Get the text from the two JTextFields and convert them to Doubles. Use Double.parseDouble(String input) to turn a String into a Double. (Not sure where to put this?)
- Get the text from the JComboBox. Use the getSelectedItem() method to get the currently selected string. (Not sure if I did this correctly)
- Calculate the result based on the string from the JComboBox This determines if you will use the operator, - operator, * operator or / operator. (do not know how to do this)
- Set the result to the JLabel Use the .setText() method to construct a String
These are my 4 problems.
class MyFrame extends JFrame {
public JTextField firstNumber;
public JTextField secondNumber;
public JButton calc;
public JLabel result;
public JComboBox combo;
public MyFrame() {
super();
init();
}
private void init() {
JButton calc = new JButton("Calculate");
calc.addActionListener(new MyButtonListener(this));
firstNumber = new JTextField();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(calc);
this.add(firstNumber);
this.add(secondNumber);
this.pack();
this.setVisible(true);
}
}
class MyButtonListener implements ActionListener {
MyFrame fr;
public MyButtonListener(MyFrame frame)
{
fr = frame;
fr.firstNumber.getText();
fr.secondNumber.getText();
fr.combo.getSelectedItem();
}
public void actionPerformed(ActionEvent e)
{
JButton btn = (JButton) e.getSource();
}
}
private static void constructGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
JTextField firstNumber = new JTextField();
JTextField secondNumber = new JTextField();
JButton calc = new JButton("Calculate");
JLabel result = new JLabel();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Simple Calculator");
String[] arth = { "Add", "Subtract", "Multiple",
"Divide" };
JComboBox combo = new JComboBox(arth);
combo.setSelectedIndex(0);
frame.setLayout(new GridLayout(5, 2));
frame.add(new JLabel("First Number:"));
frame.add(firstNumber);
frame.add(new JLabel("Second Number:"));
frame.add(secondNumber);
frame.add(combo);
frame.add(calc);
frame.add(new JLabel("Result:"));
frame.pack();
frame.setSize(200, 200);
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
constructGUI();
}
});
}
}
CodePudding user response:
Your MyFrame is not connected with the rest of the code invoked in main.
Added listener to your result field (also included in JFrame because it was not used) - code from lambda can be extracted for better visibility
Added only "ADD" rest will be similar
private static void constructGUI() {
JFrame.setDefaultLookAndFeelDecorated(true); JTextField firstNumber = new JTextField(); JTextField secondNumber = new JTextField(); JButton calc = new JButton("Calculate"); JLabel result = new JLabel("Result:"); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Simple Calculator"); String[] arth = {"Add", "Subtract", "Multiple", "Divide"}; JComboBox combo = new JComboBox(arth); combo.setSelectedIndex(0); frame.setLayout(new GridLayout(5, 2)); frame.add(new JLabel("First Number:")); frame.add(firstNumber); frame.add(new JLabel("Second Number:")); frame.add(secondNumber); frame.add(combo); frame.add(calc); frame.add(result); frame.pack(); frame.setSize(200, 200); frame.setVisible(true); calc.addActionListener( e -> { var first = Double.parseDouble(firstNumber.getText()); var secound = Double.parseDouble(secondNumber.getText()); double res = 0; switch (Objects.requireNonNull(combo.getSelectedItem()).toString()) { case "Add": res = first secound; break; } result.setText(String.valueOf(res)); });
}
Simplified main:
public static void main(String[] args) {
SwingUtilities.invokeLater(Main2::constructGUI);
}