一. 计算器图形界面:
由组件构成,例如Button,TextField等,特殊组件:容器,容器是组件的容器,各种组件包括容器可以通过add方法添加到容器中。显示在屏幕上的所有组件都包含在某个容器中。Swing提供了4种容器,JFrame,JApplet,JDialog,JWindow。JFrame是一个带有标题和控制按钮的独立窗口(最大最小化),JApplet被包含在浏览器窗口中。JDialog用于对话框,JWindow是一个不带有标题行和控制按钮的,所以用的很少。所以用JFrame作为容器。
二. 思路:用JFrame 作为容器,分两个面板JPanel,上面作显示部分放置JTextArea(设置为不可编辑,做显示用),下面放置各种按钮。
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Mycomputer extends JFrame{
public Mycomputer() {
super("Calculator");
JPanel resultField = new JPanel();
JPanel buttonField = new JPanel();
JTextArea displayresultArea = new JTextArea(" ",1,10);
JButton[] buttons=new JButton[16];
JButton clear = new JButton("C");
Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);
clear.setFont(font);
displayresultArea.setFont(font);
resultField.add(clear);
resultField.add(displayresultArea);
displayresultArea.setEditable(false);
buttonField.setLayout(new GridLayout(4,4,3,3));
String[] buttonnameStrings = {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);
buttonField.add(buttons[i*4+j]);
}
}
Container jframeContainer = this.getContentPane();
jframeContainer.setLayout(new FlowLayout());
jframeContainer.add(resultField);
jframeContainer.add(buttonField);
setVisible(true);
//setResizable(true);
}
public static void main(String[] args) {
Mycomputer mc= new Mycomputer();
mc.pack();
}
}
布局前要用,获得ContentPane, 最有要setVisible(ture);可以.pack使格局紧凑。
Container jframeContainer = this.getContentPane();
三.JAVA 定义了很多事件类(event),如鼠标事件MouseEvent类,和代表键盘事件的KeyEvent类。当用户在组件上进行某种操作时候,事件处理系统便会生成一个事件类对象。
这个计算器,主要是鼠标单击按钮,事件处理系统生成一个代表此事件的ActionEvent事件类对象,操作不同,事件类对象不同。ActionEvent 这个接口只有一个方法,actionPerformed(),当出现ActionEvent事件的时候,该方法就会被调用。为了被接受并处理类事件,组件必须注册相应的时间处理程序,即时间的监听程序。处理计算器上的按钮的ActionEvent事件,需要为按钮JButton注册ActionEvent事件监听程序,每个组件都有如addXXXListener的方法。。
先定义一个实现了接口ActionListener的继承JFrame的类:
public class Mycomputer extends JFrame implements ActionListener{...};
再定义按钮:
JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点
JButton clear = new JButton("C");//定义一个删除键
再对按钮注册事件监听程序:
clear.addActionListener(this);
buttons[i*4+j].addActionListener(this);
定义这样的方法,这样点击按钮就可以实现接口里的方法actionPerformed:
public void actionPerformed(ActionEvent e)
PS:对于按钮数组,可以用判断事件源 可以用 Object source=e.getSource();//判断事件源,并进行相应的处理;
四.其他细节:
1.'*',char 型用单引号;
2.return 可以只能跳出当前方法,不能中断程序;所以用红色的方法不能中断程序。break:用来跳出循环for, switch,if
<span style="background-color: rgb(255, 102, 102);"> public void judgezero(double second2)
{
if (second2 == 0)
{
init();
displayresultArea.setText("can't be 0");
return;
}
}</span>
<pre name="code" class="java"><span style="color:#330033;background-color: rgb(255, 102, 102);">case '/':
judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!!
second = first / second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;</span>
改成:
<span style="white-space:pre"> </span>public boolean judgezero(double second2)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>if (second2 == 0)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>init();
<span style="white-space:pre"> </span>displayresultArea.setText("can't be 0");
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>else {
<span style="white-space:pre"> </span>return false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
case '/':
//<span style="color:#ff6666;">judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!! </span>
if (judgezero(second)) {
return;
}
second = first / second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
3.把text里显示的数字转换成可计算的数据;把计算的数据显示在TEXT上
second=Double.parseDouble(displayresultArea.getText());
displayresultArea.setText(String.valueOf(second));
五.没完成 . 和 JFrame 外观 的问题。
代码:import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import com.sun.xml.internal.ws.api.server.SDDocument;
public class Mycomputer extends JFrame implements ActionListener{//implements 实现接口,interface 接口
JPanel resultField = new JPanel(); //面板,用来放显示结果的text 和 删除键
JPanel buttonField = new JPanel();//面板,放数字键,符号键
JTextArea displayresultArea = new JTextArea("",1,10);//用来显示计算结果
JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点
JButton clear = new JButton("C");//定义一个删除键
Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);// Font 类表示字体,可以使用它以可见方式呈现文本
boolean preisNum = false, preisSign = false;//判断上一次按的是数字或者是符号
double first=0, second = 0;//first 存储上一个数字,second储存当前text显示的数字
char sign1 = '\0',sign2='\0';//sign1 储存上一个符号,second储存当前按的符号
public Mycomputer() {
super("Calculator");
clear.addActionListener(this);
clear.setFont(font);
displayresultArea.setFont(font);
resultField.add(clear);
resultField.add(displayresultArea);
displayresultArea.setEditable(false);
buttonField.setLayout(new GridLayout(4,4,3,3));
String[] buttonnameStrings = {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);
buttonField.add(buttons[i*4+j]);
buttons[i*4+j].addActionListener(this);
}
}
Container jframeContainer = this.getContentPane();
jframeContainer.setLayout(new FlowLayout());
jframeContainer.add(resultField);
jframeContainer.add(buttonField);
setVisible(true);
setResizable(true);
}
public void init()
{
first=0;
second = 0;
sign1 = '\0';
sign2='\0';
displayresultArea.setText("");
preisNum = false;
preisSign = false;
}
public void actionPerformed(ActionEvent e)
{
Object source=e.getSource();//判断事件源,并进行相应的处理
if (source ==clear) {
init();
}
if (source==buttons[0]) {
//showNumber("7");
pressNumber("7");
}
if (source==buttons[1]) {
pressNumber("8");
}
if (source==buttons[2]) {
pressNumber("9");
}
if (source==buttons[3]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='+';
if (sign1=='\0') {
sign1='+';
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[4]) {
pressNumber("4");
}
if (source==buttons[5]) {
pressNumber("5");
}
if (source==buttons[6]) {
pressNumber("6");
}
if (source==buttons[7]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='-';
if (sign1=='\0') {
sign1='-';
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[8]) {
pressNumber("1");
}
if (source==buttons[9]) {
pressNumber("2");
}
if (source==buttons[10]) {
pressNumber("3");
}
if (source==buttons[11]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='*';
if (sign1=='\0') {
sign1='*';
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[12]) {
pressNumber("0");
}
if (source==buttons[13]) {
}
if (source==buttons[14]) {
preisNum = false;
preisSign = false;
second=Double.parseDouble(displayresultArea.getText());
if (sign1=='\0') {
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[15]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='/';
if (sign1=='\0') {
sign1='/';
first=second;
return;
}
else {
switchsign1();
}
}
}
public void pressNumber(String n)
{
if (preisNum) {
displayresultArea.append(n);
}
else {
displayresultArea.setText(n);
}
preisNum = true;
preisSign = false;
}
public boolean judgezero(double second2)
{
if (second2 == 0)
{
init();
displayresultArea.setText("can't be 0");
return true;
}
else {
return false;
}
}
public void switchsign1()
{
switch (sign1) {
case '+':
second = first + second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
case '-':
second = first - second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
case '*':
second = first * second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
case '/':
//judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!!
if (judgezero(second)) {
return;
}
second = first / second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
default:
break;
}
}
public static void main(String[] args) {
Mycomputer mc= new Mycomputer();
mc.pack();
}
}
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import com.sun.xml.internal.ws.api.server.SDDocument;
public class Mycomputer extends JFrame implements ActionListener{//implements 实现接口,interface 接口
JPanel resultField = new JPanel(); //面板,用来放显示结果的text 和 删除键
JPanel buttonField = new JPanel();//面板,放数字键,符号键
JTextArea displayresultArea = new JTextArea("",1,10);//用来显示计算结果
JButton[] buttons=new JButton[16];//数字0-9,加减乘除,小数点
JButton clear = new JButton("C");//定义一个删除键
Font font = new Font("Arial Rounded MT Bold",Font.PLAIN,15);// Font 类表示字体,可以使用它以可见方式呈现文本
boolean preisNum = false, preisSign = false;//判断上一次按的是数字或者是符号
double first=0, second = 0;//first 存储上一个数字,second储存当前text显示的数字
char sign1 = '\0',sign2='\0';//sign1 储存上一个符号,second储存当前按的符号
public Mycomputer() {
super("Calculator");
clear.addActionListener(this);
clear.setFont(font);
displayresultArea.setFont(font);
resultField.add(clear);
resultField.add(displayresultArea);
displayresultArea.setEditable(false);
buttonField.setLayout(new GridLayout(4,4,3,3));
String[] buttonnameStrings = {"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/"};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
buttons[i*4+j] = new JButton(buttonnameStrings[i*4+j]);
buttonField.add(buttons[i*4+j]);
buttons[i*4+j].addActionListener(this);
}
}
Container jframeContainer = this.getContentPane();
jframeContainer.setLayout(new FlowLayout());
jframeContainer.add(resultField);
jframeContainer.add(buttonField);
setVisible(true);
setResizable(true);
}
public void init()
{
first=0;
second = 0;
sign1 = '\0';
sign2='\0';
displayresultArea.setText("");
preisNum = false;
preisSign = false;
}
public void actionPerformed(ActionEvent e)
{
Object source=e.getSource();//判断事件源,并进行相应的处理
if (source ==clear) {
init();
}
if (source==buttons[0]) {
//showNumber("7");
pressNumber("7");
}
if (source==buttons[1]) {
pressNumber("8");
}
if (source==buttons[2]) {
pressNumber("9");
}
if (source==buttons[3]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='+';
if (sign1=='\0') {
sign1='+';
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[4]) {
pressNumber("4");
}
if (source==buttons[5]) {
pressNumber("5");
}
if (source==buttons[6]) {
pressNumber("6");
}
if (source==buttons[7]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='-';
if (sign1=='\0') {
sign1='-';
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[8]) {
pressNumber("1");
}
if (source==buttons[9]) {
pressNumber("2");
}
if (source==buttons[10]) {
pressNumber("3");
}
if (source==buttons[11]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='*';
if (sign1=='\0') {
sign1='*';
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[12]) {
pressNumber("0");
}
if (source==buttons[13]) {
}
if (source==buttons[14]) {
preisNum = false;
preisSign = false;
second=Double.parseDouble(displayresultArea.getText());
if (sign1=='\0') {
first=second;
return;
}
else {
switchsign1();
}
}
if (source==buttons[15]) {
preisNum = false;
if (preisSign) {
return;
}
preisSign = true;
second=Double.parseDouble(displayresultArea.getText());
sign2='/';
if (sign1=='\0') {
sign1='/';
first=second;
return;
}
else {
switchsign1();
}
}
}
public void pressNumber(String n)
{
if (preisNum) {
displayresultArea.append(n);
}
else {
displayresultArea.setText(n);
}
preisNum = true;
preisSign = false;
}
public boolean judgezero(double second2)
{
if (second2 == 0)
{
init();
displayresultArea.setText("can't be 0");
return true;
}
else {
return false;
}
}
public void switchsign1()
{
switch (sign1) {
case '+':
second = first + second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
case '-':
second = first - second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
case '*':
second = first * second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
case '/':
//judgezero(second);//!!return只跳出了judgezero这个方法,所以下面的语句还是要执行!!
if (judgezero(second)) {
return;
}
second = first / second;
displayresultArea.setText(String.valueOf(second));
sign1=sign2;
first = second;
break;
default:
break;
}
}
public static void main(String[] args) {
Mycomputer mc= new Mycomputer();
mc.pack();
}
}