package swingExamples;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
class CalculatorPanel extends JPanel
{
public CalculatorPanel()
{
setLayout(new BorderLayout());
m_display.setEditable(false);
add(m_display, BorderLayout.NORTH);
add(m_buttonsPanel, BorderLayout.CENTER);
add(m_clearButton, BorderLayout.SOUTH);
m_clearButton.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
m_buttonsPanel.clear();
}
}
);
}
////// Private data //////
private JTextField m_display = new JTextField("0");
private ButtonsPanel m_buttonsPanel = new ButtonsPanel();
private JButton m_clearButton = new JButton("Clear");
////// Inner classes /////
class ButtonsPanel extends JPanel
implements ActionListener
{
public ButtonsPanel()
{
setLayout(new GridLayout(4, 4));
String buttonLabels = "789/456*123-0.=+";
for (int i = 0; i < buttonLabels.length(); i++)
{
addButton(buttonLabels.substring(i, i + 1));
}
}
public void clear()
{
m_arg = 0.0;
m_op = '=';
m_start = true;
m_display.setText("");
}
private void addButton(String label)
{
JButton button = new JButton(label);
add(button);
button.addActionListener(this);
}
// ActionListener required methods
public void actionPerformed(ActionEvent evt)
{
String command = evt.getActionCommand();
char commandChar = command.charAt(0);
if ('0' <= commandChar &&
commandChar <= '9' || commandChar == '.')
{
if (m_start)
{
m_display.setText(command);
}
else
{
m_display.setText(m_display.getText() +
commandChar);
}
m_start = false;
}
else
{
if (m_start)
{
if (commandChar == '-' || commandChar == '+')
{
m_display.setText(command);
m_start = false;
}
else
{
m_op = commandChar;
}
}
else
{
double x = Double.parseDouble(
m_display.getText());
calculate(x);
m_op = commandChar;
m_start = true;
}
}
}
private void calculate(double n)
{
switch (m_op)
{
case '+':
m_arg += n;
break;
case '-':
m_arg -= n;
break;
case '*':
m_arg *= n;
break;
case '/':
m_arg /= n;
break;
case '=':
m_arg = n;
}
m_display.setText("" + m_arg);
}
////////////// Private Data //////////////////
private boolean m_start = true;
private double m_arg = 0.0;
private char m_op = '=';
}
}
class CalculatorFrame extends JFrame
{
public CalculatorFrame()
{
setTitle("Calculator");
setSize(200, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.add( new CalculatorPanel() );
}
}
public class Calculator
{
public static void main(String[] args)
{
CalculatorFrame frame = new CalculatorFrame();
frame.setVisible(true);
}
}
|