本次呢先写一个没有事件的、纯图形界面的计算器。等自己研究透了结合事件处理后,再在本文章补充上。
需求:有数字1-9按键,有左右括号,有加减乘除,有退格、归零和计算键
大概样子是这样的
这里很容易发现,我采用的是:显示框和操作按键在一个JPanel里,而下面的所有按键都是在一个JPanel里。
我的思路是:把“退格”和“清空”按钮放在一个JPanel里面,采用FlowLayout布局;然后把这个JPanel和显示框放在一个新的JPanel里面;至于下面的,很容易看出来是一个5×4的GridLayout布局的JPanel了。
核心代码如下:
/******显示框和两个按钮是网格布局*******/
viewPanel jp1 = new viewPanel();
add(jp1,BorderLayout.NORTH);
JButton jb1 = new JButton("清空");jp1.add(jb1);
JButton jb2 = new JButton("回退");jp1.add(jb2);//两个button是flow布局
JPanel jp2 = new JPanel(new GridLayout(2,1));//两行,每行一个组件
JTextField jt = new JTextField();jp2.add(jt);jp2.add(jp1);//jp1和显示框放到jp2里
container.add(jp2);//一定要放到内容网格上
这部分是设置好最上面两个的布局。至于为什么我自己设置了一个叫viewPanel的type,在后面我会提到。
JPanel jp3 = new JPanel(new GridLayout(5,4));//五行四列
JButton jbs1 = new JButton("(");jp3.add(jbs1);
JButton jbs2 = new JButton(")");jp3.add(jbs2);
JButton jbs3 = new JButton("/");jp3.add(jbs3);
JButton jbs4 = new JButton("*");jp3.add(jbs4);
JButton jbs5 = new JButton("7");jp3.add(jbs5);
JButton jbs6 = new JButton("8");jp3.add(jbs6);
JButton jbs7 = new JButton("9");jp3.add(jbs7);
JButton jbs8 = new JButton("-");jp3.add(jbs8);
JButton jbs9 = new JButton("4");jp3.add(jbs9);
JButton jbs10 = new JButton("5");jp3.add(jbs10);
JButton jbs11 = new JButton("6");jp3.add(jbs11);
JButton jbs12 = new JButton("+");jp3.add(jbs12);
JButton jbs13 = new JButton("1");jp3.add(jbs13);
JButton jbs14 = new JButton("2");jp3.add(jbs14);
JButton jbs15 = new JButton("3");jp3.add(jbs15);
JButton jbs16 = new JButton("=");jp3.add(jbs16);
JButton jbs17 = new JButton("%");jp3.add(jbs17);
JButton jbs18 = new JButton("0");jp3.add(jbs18);
JButton jbs19 = new JButton(".");jp3.add(jbs19);
JButton jbs20 = new JButton("=");jp3.add(jbs20);
container.add(jp3);
这里看起来很蠢,我尝试把我需要设置的字符放到一个字符串或者数组里,但是一直会报错,我把错误代码po一下,如果有大神能帮忙看看真的是感激不尽!
错误代码:
JPanel jp3 = new JPanel(new GridLayout(5,4));//五行四列
String buttonStr = "()/*789-456+123=%0.张";
ArrayList<String>list = new ArrayList<String>();
list.add(buttonStr);
//JButton[] jbs = new JButton[20];
for(int i=0;i<buttonStr.length();++i){
//jp3.addButton(jp3,buttonStr.substring(i,i+1));
//jbs[i].add(list.get(i));
list.add(buttonStr);
JButton jbs = new JButton(list.get(i));
jp3.add(jbs);
}
回到正题,以上可以说我是把整个计算器分成了两个部分(jp2和jp3),这时候呢,要对这两个部分进行一个布局的划分,可以给整体设置成BorderLayout布局,上面的放在NORTH上,一个放在Center上。
/*******给总体applet设定border布局*******/
this.setLayout(new BorderLayout());
this.add(jp2,"North");
this.add(jp3,"Center");
至于上面提到的为什么要自己再写一个变量类型viewPanel,是因为把jp2放到north上后,默认的高会很小,就像这样:
所以写一个继承了JPanel的类,重新用setPreferredSize来设定某一个JPanel的尺寸。
class viewPanel extends JPanel{
public viewPanel(){
//setLayout(null);
//setSize(400,200);
setPreferredSize(new Dimension(500,100));
}
}
这里我的疑问在于,设置宽的时候哪怕和整个窗口的宽不一样,也依然是保持窗口的宽度?还有就是网上都说需要setLayout(null),但是我加入这行后,两个button就需要重新再写位置了,不设置null的话直接就ok了。
图形界面的代码如下:
package calculation;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.io.IOException;
import javax.imageio.*;
public class C extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) throws IOException{
C frame = new C();
}
/**
* Create the frame.
* @throws IOException
*/
public C() throws IOException {
setTitle("张致远的计算器");//设置窗口标题
setSize(500,800);//设置窗口尺寸
setLocationRelativeTo(null);//窗体居中显示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口是否可以关闭
Container container = getContentPane();//获取当前窗体的内容网格
/******显示框和两个按钮是网格布局*******/
viewPanel jp1 = new viewPanel();
add(jp1,BorderLayout.NORTH);
JButton jb1 = new JButton("清空");jp1.add(jb1);
JButton jb2 = new JButton("回退");jp1.add(jb2);//两个button是flow布局
JPanel jp2 = new JPanel(new GridLayout(2,1));//两行,每行一个组件
JTextField jt = new JTextField();jp2.add(jt);jp2.add(jp1);//jp1和显示框放到jp2里
container.add(jp2);//一定要放到内容网格上
/* JPanel jp3 = new JPanel(new GridLayout(5,4));//五行四列
* String buttonStr = "()/*789-456+123=%0.张";
* ArrayList<String>list = new ArrayList<String>();
* list.add(buttonStr);
* //JButton[] jbs = new JButton[20];
* for(int i=0;i<buttonStr.length();++i){
* //jp3.addButton(jp3,buttonStr.substring(i,i+1));
* //jbs[i].add(list.get(i));
* list.add(buttonStr);
* JButton jbs = new JButton(list.get(i));
* jp3.add(jbs);
* }
*/
JPanel jp3 = new JPanel(new GridLayout(5,4));//五行四列
JButton jbs1 = new JButton("(");jp3.add(jbs1);
JButton jbs2 = new JButton(")");jp3.add(jbs2);
JButton jbs3 = new JButton("/");jp3.add(jbs3);
JButton jbs4 = new JButton("*");jp3.add(jbs4);
JButton jbs5 = new JButton("7");jp3.add(jbs5);
JButton jbs6 = new JButton("8");jp3.add(jbs6);
JButton jbs7 = new JButton("9");jp3.add(jbs7);
JButton jbs8 = new JButton("-");jp3.add(jbs8);
JButton jbs9 = new JButton("4");jp3.add(jbs9);
JButton jbs10 = new JButton("5");jp3.add(jbs10);
JButton jbs11 = new JButton("6");jp3.add(jbs11);
JButton jbs12 = new JButton("+");jp3.add(jbs12);
JButton jbs13 = new JButton("1");jp3.add(jbs13);
JButton jbs14 = new JButton("2");jp3.add(jbs14);
JButton jbs15 = new JButton("3");jp3.add(jbs15);
JButton jbs16 = new JButton("=");jp3.add(jbs16);
JButton jbs17 = new JButton("%");jp3.add(jbs17);
JButton jbs18 = new JButton("0");jp3.add(jbs18);
JButton jbs19 = new JButton(".");jp3.add(jbs19);
JButton jbs20 = new JButton("=");jp3.add(jbs20);
container.add(jp3);
/*******给总体applet设定border布局*******/
this.setLayout(new BorderLayout());
this.add(jp2,"North");
this.add(jp3,"Center");
setVisible(true);
//setBackground(Color.BLACK);
}
class viewPanel extends JPanel{
public viewPanel(){
//setLayout(null);
//setSize(400,200);
setPreferredSize(new Dimension(500,100));
}
}
}
关于事件处理,等这几天研究好了再补充。