【Java】图形界面之计算器

本次呢先写一个没有事件的、纯图形界面的计算器。等自己研究透了结合事件处理后,再在本文章补充上。

需求:有数字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));
		}
	}

}

关于事件处理,等这几天研究好了再补充。

猜你喜欢

转载自blog.csdn.net/qq_44899247/article/details/107347213