java计算器设计减法出错,JAVA菜鸟 自制 某惨不忍睹的计算器 总结

本文由一个简单的计算器入手(类似Windows自带的)主要介绍会使用到的三种布局,以及监听器的实现。首先,从附件里掏出此其貌不扬的计算器。= = 最后会发现初学者连这个渣渣都完成不了 = = 罢了,进入正题

104240244.jpg首先对于这个面板我们要了解面板的布局,

一.流式布局

组件按从左到右而后从上到下的顺序依次排列,一行不能放完则折到下一行。

构造函数:

FlowLayout()

建立一个默认为居中对齐,组件彼此有5单位的水平与垂直间距的FlowLayout

对齐方式;FlowLayout.LEFT,CENTER,RIGHT,LEADING,TRAILING

FlowLayout(int align)

建立一个可设置排列方式且组件彼此有5单位的水平与垂直间距的FlowLayout

FlowLayout(int align,int hgap,int vgap)

建立一个可设置排列方式与组件间距的FlowLayout

104240245.jpg

二.网格布局

矩形网格形式对容器的组件进行布置

构造函数:

GridLayout()

建立一个默认为一行一列的GridLayout

GridLayout(int rows,int cols)

建立一个指定行(rows)和列(cols)的GridLayout

GridLayout(int rows,int cols,int hgap,int vgap)

建立一个指定行(rows)和列(cols),且组件间水平间距为hgap、垂直间距为vgap的GridLayout

三.边框布局

BorderLayout

将版面划分成东、西、南、北、中五个区域,将添加的组件按指定位置放置。

BorderLayout.EAST WEST SOUTH NORTH CENTER

注意,CENTER可以不用设置,他会根据剩余位置进行自动填充,并且这些布局初始值都很小。104240246.jpg

构造函数:

BorderLayout()

建立组件间无间距的BorderLayout

BorderLayout(int hgap,int vgap)

建立组件间水平间距为hgap,垂直间距为vgap的BorderLayout

例一:

如何使用

JFrame jf = new JFrame();//*顶层容器*//

JPaneljp = new JPanel()

jf.setLayout(new BorderLayout());//*定义窗体布局为边界布局,放前面

jf.add(jp,BorderLayout.SOUTH);//*将jp等组件放置在边框布局的.南/北

jf.add(tx,BorderLayout.NORTH);

tx.setPreferredSize(new Dimension(210,50));

jp.setPreferredSize(new Dimension(210,50));

另外在容器中,必须通过该方法才能实现对组件大小的设置(外部大小);

对组件,容器的添加必须放在setVisible方法前;

设置的组件占据了位置之后,后设置的组件如果超过了固定边界,将会覆盖

在对基本定义的狂轰滥炸之后,接下来开始对面板的布置进行设计

104240247.jpg

考虑到0和=按钮的丑陋性,先将整齐的部分分割出来,

再考虑以下几个问题

1.用网格布局(注意,网格布局将画板会分成相同大小的网格,所以不能越界);

2.布局管理器几种固定的分配方式,没有南西和南东,

3.NORTH已经被用在TextField,剩下的组件必然只有CENTER和SOUTH可以用了,而CENTER是按照其他组件排完后自动填充剩余部分的,属于被动技能

对于上述几个问题给出的解决方式就是:容器嵌套

1.网格布局只用于CENTER

2.先申请两个Panel,jp1,jp2,对于jp2我们再嵌套上两个容器用WEST , EAST排,再讲jp2放在SOUTH,用setPreferredSize固定大小,之后jp1就能顺利成章放在中间了

3.注意对距离的安排!多调试

对于板块的划分大工告成,接下来就是代码的实现了。

publicstaticvoidmain(String[] args) {

//*此处省略一百行代码*//

}

调试过程丧心病狂,省略一万字

104240248.jpg

104240249.jpg

以上是southwest的二层容器代码(其余部分因为过于冗长,不予粘贴),涉及到几个知识点:

1.1.构造器使用布局管理器;

2.2.容器内组件大小的设置;

3.3.数组对象的开辟;

4.4.设置字在组件内的位置(不同于字体)

5.5.以某种布局位置添加组件;

6.6.监听器的添加;

版面布置基本结束,接下来是对各种按钮功能的实现,并且能够在文本框中输出结果

监听器中:用e.getActionCommand()取得按钮上的字符串

publicvoidactionPerformed(ActionEvent e){

String s;

s=e.getActionCommand();

System.out.println(s);

tx.setText(s);

}

但是问题出现了,每次点击就会重新设置文本框中的内容;

我们可以这么解决:每次点击的时候先取出文本框中的内容,把他存在另一个字符串里,在按照先后把两个字符串变量同时输出。稍加修改后:

str=tx.getText();

System.out.println(str);

String s = e.getActionCommand();

tx.setText(str+s);/}104240250.jpg

对于这些按钮我们要实现:

1.数字类+逻辑运算符+数字类+等于号:得出结果;

2.按等于号的时候,直接显示出结果;

3.其中每次按运算符的时候,文本框只能显示运算符;

4.1/x和^都是直接得出结果;

5.记忆的实现:MS存储记忆,MR读取记忆(文本框覆盖);

M+,M-点击时读取记忆,并已经相当于按了+,-,MC清空;

6.暂时未实现功能: 删去键,小数点,而且无法实现不按等号的情况下实现连续运算,每次只能计算出最近两个按钮的结果

以下是我初始化设定的变量,使用方法且听老衲一一道来

Stringstr=null;//*当前得到的字符*//

StringstrSign="";//*用来给等号判断不同的运算方法*//

Stringstr2=null;//*可以保存使用逻辑运算符前的那个的数值*//

intout;//*outcome,记录结果的

Stringflag="数字";/*标记是否是和数字无关的按键*/

publicvoidactionPerformed(ActionEvent e) {

if(flag.equals("符号")){

tx.setText("");

flag="数字";//*其中每次按运算符的时候,文本框只能显示运算符,并且再将flag转置,为了下一次按数字*//

}

str=tx.getText();

System.out.println(str);

String s = e.getActionCommand();

tx.setText(str+s);//*输入框能重复输入多个字*//

if(s.equals("+")|| s.equals("-") || s.equals("*") || s.equals("/") ||    s.equals("%") ||s.equals("^") || s.equals("%")){

flag="符号";//*我们通过flag来判断接下来要干什么

}

if(flag.equals("符号"))

{

strSign=s;//*用来等号时候判断到底刚才按了什么逻辑按钮*//

str2=str;/*此时的str已经存储了输入特殊字符前的文本框内容,只是用str2再次接收,以便以后进行转换,接下来在下次点击后,str又会被替换*/

tx.setText(s);

}//*用来识别特殊运算符,并执行类似操作,将字符输到文本框*/

关于最后等于号的输出

if(s.equals("=")){

inta=Integer.parseInt(str2);/*字符串和数字间的转换方法*/

intb=Integer.parseInt(str);

if(strSign.equals("+") ){

out= a+b;

}

以及按一次就实现的那些按钮

if(s .equals("1/x") ){

doublea=Integer.parseInt(str);

doubleb=1/a;

String str=b+"";涉及到强制转换,即数字数据+””就成了字符串

tx.setText(str.substring(0,8));/*从后面往上切,保留小数位*/

}

最后关于记忆的实现:

从先前的类中传入一个按钮,然后改变按钮的文本

104240251.jpg

104240252.jpg只不过多设置了一个memory变量来接收记忆,其余没什么技术含量;

到目前为止,一个计算器的大致功能都已经实现啦!

虽然还是只是个渣渣软件……= = 和最初打开的渣渣还是相去甚远

参考文献:[1]技术羊.java布局管理器总结新浪微博2012-08-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值