1 .主程序 |
package s1125计算器界面; |
import java.awt.Dimension; |
import java.awt.FlowLayout; |
import javax.swing.ImageIcon; |
import javax.swing.JButton; |
import javax.swing.JFrame; |
import javax.swing.JLabel; |
import javax.swing.JMenu; |
import javax.swing.JMenuBar; |
import javax.swing.JMenuItem; |
import javax.swing.JPanel; |
import javax.swing.JPasswordField; |
import javax.swing.JTextField; |
public class Main1125 extends JFrame { |
public static void main(String[] args) { |
new Main1125().showjiemian(); // 出现验证界面 |
} |
// ************************************************************************************// |
// 计算器主界面 |
public void showframe() { |
this .setTitle( "计算器" ); // 设置窗体的标题 |
this .setSize( 340 , 500 ); // 设置窗体的大小 |
this .setDefaultCloseOperation( 3 ); // 设置关闭的方式 |
this .setLocationRelativeTo( null ); // 设置窗体出现在屏幕中间 |
this .setResizable( false ); // 设置窗体不可改变大小 |
this .setLayout( new FlowLayout()); // 设置窗体为空布局 |
JTextField jtf1 = new JTextField(); // 创建结果文本框对象 |
jtf1.setPreferredSize( new Dimension( 300 , 50 )); // 编辑文本框大小 |
jtf1.setEditable( false ); // 不可调文本框大小 |
jtf1.setHorizontalAlignment(JTextField.RIGHT); // 文本框向右排序 |
jtf1.setText( "" ); |
JTextField jtf = new JTextField(); // 创建输入的文本框对象 |
jtf.setPreferredSize( new Dimension( 300 , 50 )); // 编辑文本框大小 |
jtf.setEditable( false ); // 不可调文本框大小 |
jtf.setHorizontalAlignment(JTextField.RIGHT); // 文本框向右排序 |
jtf.setText( "0" ); |
this .add(jtf1); |
this .add(jtf); |
// 建一个事件处理类l |
CalListener l = new CalListener(); |
l.setJtf(jtf, jtf1); |
// 界面按钮 |
String[] array = { "←" , "ANS" , "CE" , "C" , "7" , "8" , "9" , "+" , "4" , "5" , |
"6" , "-" , "1" , "2" , "3" , "×" , "0" , "." , "÷" , "=" }; |
// 设置界面按钮的大小,排列顺序,添加按钮到窗体,给按钮添加事件 |
for ( int i = 0 ; i < array.length; i++) { |
JButton jbu = new JButton(array[i]); |
jbu.setPreferredSize( new Dimension( 70 , 55 )); |
this .add(jbu); |
jbu.addActionListener(l); |
} |
this .setVisible( true ); |
} |
// ************************************************************************************// |
// ************************************************************************************// |
// 添加菜单栏 |
public void MyMenu() { |
JMenuBar menubar = new JMenuBar(); // 创建menubar对象 |
JMenu file, edit, editSon, about; // 声明JMenu类对象 |
JMenuItem open, save, line, exit, copy, paste, cut, put, author, help; // 声明menuitem类对象 |
// 初始菜单项 |
file = new JMenu( "文件(F)" ); // 创建JMenu对象 |
file.setMnemonic( 'F' ); |
edit = new JMenu( "编辑" ); // 创建JMenu对象 |
editSon = new JMenu( "二级菜单" ); // 创建JMenu对象 |
about = new JMenu( "帮助" ); // 创建JMenu对象 |
open = new JMenuItem( "打开" , new ImageIcon( |
"C:/Users/Administrator/Desktop/images/2.jpg" )); // 创建menuItem对象 |
save = new JMenuItem( "保存" ); // 创建menuItem对象 |
exit = new JMenuItem( "关闭" ); // 创建menuItem对象 |
copy = new JMenuItem( "复制" ); // 创建menuItem对象 |
paste = new JMenuItem( "粘贴" ); // 创建menuItem对象 |
author = new JMenuItem( "作者" ); // 创建menuItem对象 |
help = new JMenuItem( "帮助" ); // 创建menuItem对象 |
cut = new JMenuItem( "cut" ); // 创建menuItem对象 |
put = new JMenuItem( "put" ); // 创建menuItem对象 |
menubar.add(file); // 将file添加到menubar中 |
menubar.add(edit); // 将edit添加到menubar中 |
menubar.add(about); // 将about添加到menubar中 |
exit.addActionListener(e -> this .dispose()); // 关闭按钮 |
file.add(open); // 将open添加到file中 |
file.add(save); // 将save添加到file中 |
file.addSeparator(); // 添加菜单栏中的横线 横线位置和添加顺序有关 |
file.add(exit); // 将exit添加到file中 |
edit.add(copy); // 将copy添加到edit中 |
edit.add(paste); // 将paste添加到edit中 |
edit.add(editSon); // 将editSon添加到edit中 |
editSon.add(cut); // 将cut添加到edit中 |
editSon.add(put); // 将put添加到edit中 |
about.add(author); // 将author添加到about中 |
about.add(help); // 将help添加到about中 |
// 设置menuBar |
this .setJMenuBar(menubar); |
} |
// ************************************************************************************// |
// ************************************************************************************// |
// 验证界面(登陆界面) |
public void showjiemian() { |
this .setTitle( "用户登陆" ); // 设置窗体的标题 |
this .setSize( 200 , 150 ); // 设置窗体的大小 |
this .setDefaultCloseOperation( 3 ); // 设置关闭的方式 |
this .setLocationRelativeTo( null ); // 设置窗体出现在屏幕中间 |
this .setResizable( false ); // 设置窗体不可改变大小 |
FlowLayout c = new FlowLayout(); // 创建流式布局对象 |
JLabel a = new JLabel( "账号" ); // 创建标签对象 |
JLabel b = new JLabel( "密码" ); // 创建标签对象 |
JTextField username = new JTextField( 12 ); // 创建文本框对象 |
JPasswordField password = new JPasswordField( 12 ); // 创建密码框对象 |
JButton b12 = new JButton( "登陆" ); // 创建按钮对象 |
this .setLayout(c); // 设置布局为流式布局 |
this .add(a); // 将标签对象添加到窗体 |
this .add(username); // 将文本框对象添加到窗体 |
this .add(b); // 将标签对象添加到窗体 |
this .add(password); // 将密码框对象添加到窗体 |
this .add(b12); // 将按钮对象添加到窗体 |
b12.addActionListener(e -> { |
this .dispose(); // 关闭验证界面 |
if (username.getText().equals( "1" ) |
&& new String(password.getPassword()).equals( "1" )) // 验证用户名和密码如果都是1,那么就通过 |
|
{ |
new Main1125() { |
{ |
showframe(); |
MyMenu(); |
} |
}; |
} |
else { |
new Main1125().showfault(); // 显示错误提示框 |
} |
}); |
this .setVisible( true ); // 设置窗体属性为可见 |
} |
// ************************************************************************************// |
// ************************************************************************************// |
// 错误提示框 |
public void showfault() { |
this .setTitle( "错误" ); // 设置窗体的标题 |
this .setSize( 200 , 150 ); // 设置窗体的大小 |
this .setDefaultCloseOperation( 3 ); // 设置关闭的方式 |
this .setLocationRelativeTo( null ); // 设置窗体出现在屏幕中间 |
this .setResizable( false ); // 设置窗体不可改变大小 |
this .setLocationRelativeTo( null ); // 设置窗体出现位置居中 |
JPanel j1 = new JPanel(); // 创建面板对象 |
j1.setPreferredSize( new Dimension( 0 , 100 )); // 设置面板大小 |
JLabel a = new JLabel( "账号或者密码错误,请重新输入" ); // 创建错误标签对象 |
JButton b = new JButton( "返回登陆界面" ); // 创建按钮对象 |
this .add(j1); // 添加面板到窗体 |
j1.add(a); // 添加标签组件到窗体 |
j1.add(b); // 添加按钮组件到窗体 |
b.addActionListener((e) -> { |
this .dispose(); |
new Main1125().showjiemian(); |
}); // 关掉错误界面,显示验证界面 |
this .setVisible( true ); // 设置窗体属性为可见 |
} |
// ************************************************************************************// |
} |
2 .ActionListener类 |
package s1125计算器界面; |
import java.awt.event.ActionEvent; |
import java.awt.event.ActionListener; |
import javax.swing.JTextField; |
public class CalListener implements ActionListener{ |
String text ; //接受使用者按下的按钮内容 |
String str = "" ; //str是存储运算符 |
String lastnumber; //存储上一个处理数 |
String nextnumber; //存储下一个处理数 |
String result; //存储结果 |
JTextField jtf,jtf1; //jtf显示输入框,jtf1结果框 |
double d; //存储运算结果 |
int n; |
|
public void setJtf(JTextField jtf,JTextField jtf1) |
{ this .jtf = jtf; //传入输入文本框对象 |
this .jtf1 = jtf1;} //传入结果文本框对象 |
|
|
public void actionPerformed(ActionEvent e){ |
text = e.getActionCommand(); // e.getActionCommand()得到按钮上的字符串 |
System.out.println(text); |
|
if (text.equals( "←" )) |
{ //如果文本框字符串长度大于1 减掉最后一位 如果长度等于1 文本框置0 |
String temp = jtf.getText(); |
if (temp.length()> 1 ) |
{ String temp1; |
temp1=temp.substring(temp.length()- 1 ,temp.length()); //得到最后一位字符传给temp |
if (temp1.equals( "+" )||temp1.equals( "-" )||temp1.equals( "×" )||temp1.equals( "÷" )) |
str= "" ; //如果最后一位字符是符号,那么"←"表示将符号清空,那么str="" |
jtf.setText(temp.substring( 0 ,temp.length()- 1 )); //删去最后一位substring用法是得到从0到temp.length()-1位数据 |
} |
|
else jtf.setText( "0" ); |
} |
|
else if (text.equals( "ANS" )) //ans 调用上次的结果 |
{ String k=jtf1.getText(); |
|
if (k.equals( "" )) jtf.setText( "0" ); //调用结果数据,如果开始没有,则文本框显示0 |
else |
{ if (jtf.getText().equals( "0" )) |
jtf.setText(k); //调用结果数据,如果有上次的结果,则文本框显示已经存在的数据和上次的结果 |
else jtf.setText(jtf.getText()+k);} |
} |
|
else if (text.equals( "C" )) |
{jtf.setText( "0" ); |
jtf1.setText( "" ); |
lastnumber = "" ; |
nextnumber = "" ; |
str = "" ;} |
|
else if (text.equals( "CE" )) |
{jtf.setText( "0" ); |
lastnumber = "" ; |
nextnumber = "" ; |
str = "" ;} |
|
//如果输入的是运算符 |
else if (text.equals( "+" )||text.equals( "-" )||text.equals( "×" )||text.equals( "÷" )||text.equals( "=" )) |
{ |
|
if (str.equals( "" )) //如果是第一次输入运算符 |
{ if (text.equals( "=" )) {} |
else |
{str=text; |
result=jtf.getText(); |
jtf.setText(jtf.getText()+text);} |
} |
|
else //如果之前已经输入过运算符 |
{ String temp1,temp2; |
temp1 = jtf.getText(); |
temp2=temp1.substring(temp1.length()- 1 ,temp1.length()); //得到文本输入框最后一位字符传给temp2 |
|
//比较这次输入的符号和上次输入的符号是否相同 |
if (temp2.equals( "+" )||temp2.equals( "-" )||temp2.equals( "×" )||temp2.equals( "÷" )) |
{ if (text.equals( "=" )) {} //如果重复输入=,那么不做任何处理 |
else {str=text; //如果文本输入框最后一位是运算符号,那么重新传入运算符号(解决运算符重复输入问题) |
String text2=temp1.substring( 0 , temp1.length()- 1 ); |
jtf.setText(text2+str);} //重复输入运算符,以最后一次的为准 |
} |
|
else |
{ |
nextnumber=temp1.substring(result.length()+ 1 , temp1.length()); //得到第二个运算数给nextnumber |
double d1 = Double.parseDouble(result); //定义一个双精度数 |
double d2 = Double.parseDouble(nextnumber); //定义一个双精度数 |
|
if (str.equals( "+" )) {d = d1 + d2;} //加法运算 |
if (str.equals( "-" )) {d = d1 - d2;} //减法运算 |
if (str.equals( "×" )) {d = d1 * d2;} //乘法运算 |
if (str.equals( "÷" )) {d = d1 / d2;} //除法运算 |
result=d+ "" ; //运算结果放入result中,用了自动转换格式 |
str = text; //将本次运算符放入str中 |
if (text.equals( "=" )) {str= "" ;} //如果这次按下的是"="键,那么清空str中存储的运算符 |
jtf1.setText(result); //在结果显示框显示结果 |
if (text.equals( "=" )) //如果这次按下了"="键 |
{jtf.setText( "0" );} //输入文本框变成初始"0"状态 |
else |
{jtf.setText(result+str);} //输入文本框变成 结果加上符号 |
} |
} |
} |
|
else //数字键和.键的事件响应 |
{ if (jtf.getText().equals( "0" )) //如果输入文本框显示"0",那么直接置换 |
jtf.setText(text); |
else //如果输入文本框已经有数据,那么添加新数据 |
jtf.setText(jtf.getText()+text); |
} |
} |
} |