1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > JAVA图形化界面计算器

JAVA图形化界面计算器

时间:2019-11-20 21:29:40

相关推荐

JAVA图形化界面计算器

优秀的代码是它自己最好的文档。当你考虑要添加一个注释时,问问自己,“如何能改进这段代码,以让它不需要注释

我是一名在校大学生,这学期刚刚开JAVA课,老师上周留作业让做个计算器,最近一直在搞Python,今天终于抽出一些时间来写这篇博客,下面是我做的计算器

界面非常简单,功能也非常简单,只有简单的加减乘除,回退清零

所谓三思而coding,写代码之前一定要多思考,经过思考之后你的代码bug会少一些,可以提高你的工作效率

这个计算器很简单,没什么复杂的东西,主要就是你先把界面写好,然后把上面的空间加上监听

你需要思考的就是这个计算逻辑,因为这里没有括号所以不涉及运算优先级的问题

我一般写逻辑的时候都会把用户操作理想化,然后这样可以快速想明白一条逻辑,然后再考虑异常情况

理想情况便是用户点击一个数字,然后点击运算符号,然后点击另一个运算数字,最后点击等号显示结果

对于这种情况呢,我们可以在用户输入完第一个运算数的时候用一个变量把该数保存下来,然后用另一个变量保存运算符号,等用户点击等号的时候进行运算并显示在输入框内

但作为一个开发者你要知道用户并不总是理想操作,他有时候也会连续点加号和数字很多次,这样就是一个连续的运算了,但我们无法保存这么多数据,怎么办呢?

你可以把运算前移一个阶段,也就是说用户点击运算符号时就进行运算,把单步运算和连续运算分开来,单步运算只保存运算符号运算等用户点击等号再进行,连续运算时点击运算符号就进行运算,然后保存运算符号。这两部分你可以用一个布尔值进行开关操作

那还有一些问题呢,比如说用户上来就点击运算符,被除数为0等等异常情况,我们可以采取初始值或者提示,判断等等小操作解决它们

理清楚思路我们就准备开始写代码了,首先写界面,首先这里面控件一共就两种,一种文字框一种按钮,都是基础控件就不讲了,我们来看看使用什么布局好,常用的基础布局管理器:绝对布局不考虑,流布局,边界布局,网格布局

嘿,你可能觉得网格布局管理器不错,但是想要实现这个界面还是较为复杂,给你介绍一款非常好用的布局GridBagLayout

Java中的布局管理器应用了策略者模式,为不同类型的组件布局提供了很好的模型。而其中的GridBagLayout被认为是所有布局管理器中最强大的,因为它十分灵活,GridBagLayout类的对象维持一个动态的矩形单元网格,然后我们可以把组件放进一个或多个矩形单元网格,组件大就多放几个,组件小就少放几个。而每个组件,要占几个网格单元,每个组件要占领的位置在哪等等,都是要用GridBagConstraints类的对象来设置。

比如说我的布局我把它分为7行4列,第一行被文本框单独占有,宽度为4高度为1,下面的Back按钮和清零按钮各占宽度为2,高度为1,你加入GriBagLayout内的所有控件都需要GridBagConstraints类对象来设置位置宽高等属性

* @param gridxThe initial gridx value.* @param gridyThe initial gridy value.* @param gridwidth The initial gridwidth value.* @param gridheight The initial gridheight value.* @param weightx The initial weightx value.* @param weighty The initial weighty value.* @param anchor The initial anchor value.* @param fillThe initial fill value.* @param insets The initial insets value.* @param ipadxThe initial ipadx value.* @param ipadyThe initial ipady value.

这是GridBagConstraints类可设置的属性,它有两个构造方法,一种是无参构造方法,一种是指定所有参数的构造方法(吐槽:为啥没有只传位置和宽高的)

public GridBagConstraints ()public GridBagConstraints(int gridx, int gridy,int gridwidth, int gridheight,double weightx, double weighty,int anchor, int fill,Insets insets, int ipadx, int ipady)

如果你使用无参的构造方法的话你创建出来的对象属性是这样的

gridx = -1;gridy = -1;gridwidth = 1;gridheight = 1;weightx = 0;weighty = 0;anchor = CENTER;fill = 0;insets = new Insets(0, 0, 0, 0);ipadx = 0;ipady = 0;

现在来看一看这些参数都代表什么,grodx和gridy控制的是控件的位置,两者的值应为控件左上角的坐标,java中的坐标体系是这样的

画图水平也就这样了,凑合看吧 ,gridwidth和gridheight分别代表控件的宽高,也就是说占几个小格

weightx和weighty的作用和名字一样,控制各自方向的空间分布权重的

anchor指的是对齐方式,有很多方式可以选择

* The absolute values are:* <code>CENTER</code>, <code>NORTH</code>, <code>NORTHEAST</code>,* <code>EAST</code>, <code>SOUTHEAST</code>, <code>SOUTH</code>,* <code>SOUTHWEST</code>, <code>WEST</code>, and <code>NORTHWEST</code>.* The orientation relative values are: <code>PAGE_START</code>,* <code>PAGE_END</code>,* <code>LINE_START</code>, <code>LINE_END</code>,* <code>FIRST_LINE_START</code>, <code>FIRST_LINE_END</code>,* <code>LAST_LINE_START</code> and <code>LAST_LINE_END</code>. The* baseline relative values are:* <code>BASELINE</code>, <code>BASELINE_LEADING</code>,* <code>BASELINE_TRAILING</code>,* <code>ABOVE_BASELINE</code>, <code>ABOVE_BASELINE_LEADING</code>,* <code>ABOVE_BASELINE_TRAILING</code>,* <code>BELOW_BASELINE</code>, <code>BELOW_BASELINE_LEADING</code>,* and <code>BELOW_BASELINE_TRAILING</code>.

默认是CENTER

fill参数控制的是填充方式 ,默认是NONE,可选择:

横向填充 HORIZONTAL

竖向填充 VERTICAL

双向填充 BOTH

insets属性控制的是外边距,就是控件和控件之间的距离,使用Insets类对象,传入的顺序是:上左下右

ipadx和ipady控制的是内边距

在设置完gridBagConstraints类对象之后我们需要使用下面这句代码将它设置到控件上

gridBagLayout.setConstraints(button, gridBagConstraints);

做完这些差不多你的界面就搭好了,你可以对它进行一些小修饰,比如背景颜色,字体颜色,点击时变化等等

现在只要把界面和逻辑一组合就好了

import java.awt.Color;import java.awt.Container;import java.awt.Font;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.Insets;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;public class Calculator extends JFrame {private Container container = this.getContentPane();private GridBagLayout gridBagLayout = new GridBagLayout();private GridBagConstraints gridBagConstraints= new GridBagConstraints();private JTextField displayField;private String lastCommand="=";private double result=0.0d;private boolean start=true;public Calculator() {super("JAVA图形化界面计算器");container.setLayout(gridBagLayout);initDisplayArea();initButtons();initFrame();}private void initFrame() {setSize(900, 900);setVisible(true);setResizable(false);setForeground(Color.MAGENTA);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}private void initButtons() {ActionListener insert = new Calculator.InsertAction();ActionListener command = new mandAction();addButton("Back", 0, 1, 2, 1, insert);addButton("清零", 2, 1, 2, 1, insert);addButton("7", 0, 2, 1, 1, insert);addButton("8", 1, 2, 1, 1, insert);addButton("9", 2, 2, 1, 1, insert);addButton("+", 3, 2, 1, 1, command);addButton("4", 0, 3, 1, 1, insert);addButton("5", 1, 3, 1, 1, insert);addButton("6", 2, 3, 1, 1, insert);addButton("-", 3, 3, 1, 1, command);addButton("1", 0, 4, 1, 1, insert);addButton("2", 1, 4, 1, 1, insert);addButton("3", 2, 4, 1, 1, insert);addButton("*", 3, 4, 1, 1, command);addButton("0", 0, 5, 1, 1, insert);addButton("-", 1, 5, 1, 1, insert);addButton(".", 2, 5, 1, 1, insert);addButton("/", 3, 5, 1, 1, command);addButton("=", 0, 6, 4, 1, command);}private void initDisplayArea() {displayField = new JTextField(20);displayField.setHorizontalAlignment(4);displayField.setBackground(Color.gray);displayField.setDisabledTextColor(Color.MAGENTA);displayField.setEnabled(false);displayField.setFont(new Font("宋体", Font.BOLD, 50));gridBagConstraints.gridx = 0;gridBagConstraints.gridy = 0;gridBagConstraints.gridwidth = 4;gridBagConstraints.gridheight = 1;gridBagConstraints.fill = 1;gridBagConstraints.weightx = 1;gridBagConstraints.weighty = 1;gridBagLayout.setConstraints(displayField, gridBagConstraints);container.add(displayField);}private void addButton(String label, int column, int row, int with, int height, ActionListener listener) {JButton button = new JButton(label);button.setForeground(Color.MAGENTA);button.setFont(new Font("楷体", Font.BOLD, 36));button.addActionListener(listener);gridBagConstraints.gridx = column;gridBagConstraints.gridy = row;gridBagConstraints.gridwidth = with;gridBagConstraints.gridheight = height;gridBagConstraints.fill = GridBagConstraints.BOTH;gridBagConstraints.insets = new Insets(1,1,1,1);gridBagLayout.setConstraints(button, gridBagConstraints);container.add(button);}public void calculate(double x) {if (this.lastCommand.equals("+")) {this.result += x;} else if (this.lastCommand.equals("-")) {this.result -= x;} else if (this.lastCommand.equals("*")) {this.result *= x;} else if (this.lastCommand.equals("/")) {this.result /= x;} else if (this.lastCommand.equals("=")) {this.result = x;}this.displayField.setText("" + this.result);}public static void main(String[] args) {new Calculator();}private class CommandAction implements ActionListener {private CommandAction() {}public void actionPerformed(ActionEvent evt) {String command = evt.getActionCommand();if (Calculator.this.start) {Calculator.this.lastCommand = command;} else {Calculator.this.calculate(Double.parseDouble(Calculator.this.displayField.getText()));Calculator.this.lastCommand = command;Calculator.this.start = true;}}}private class InsertAction implements ActionListener {private InsertAction() {}public void actionPerformed(ActionEvent event) {String input = event.getActionCommand();if (Calculator.this.start) {Calculator.this.displayField.setText("");Calculator.this.start = false;if (input.equals("-")) {Calculator.this.displayField.setText(Calculator.this.displayField.getText() + "-");}}if (!input.equals("-")) {if (input.equals("Back")) {String str = Calculator.this.displayField.getText();if (str.length() > 0) {Calculator.this.displayField.setText(str.substring(0, str.length() - 1));}} else if (input.equals("清零")) {Calculator.this.displayField.setText("0");result=0.0d;Calculator.this.start = true;} else{if (input.equals(".")) {if (Calculator.this.displayField.getText().trim().indexOf(".") == -1) {Calculator.this.displayField.setText(Calculator.this.displayField.getText() + input);}} else {Calculator.this.displayField.setText(Calculator.this.displayField.getText() + input);}}}}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。