界面
文章目录
- 界面
- 基本建立界面
- 步骤
- 代码
- 写一个计算器
- 步骤
- 布局
- 方法实现
- 代码
- 总结
之前有写过关于界面操作的一篇博文,但是觉得有一些描述比较的啰嗦,因此现在重新写一篇
不过如果想要实现上一篇的那个效果的话,还是可以参考那个代码的,因此做了一些保留
基本建立界面
步骤
1)写一个界面
2)定义组件和布局
3)加到界面上
4)显示
代码
import javax.swing.*;
import java.awt.*;
public class LoginUI extends JFrame {
// 初始化方法
public void initUI(){
this.setSize(400,200);
this.setTitle("仿QQ登录界面");
this.setVisible(true);
FlowLayout fl = new FlowLayout();
this.setLayout(fl);
JTextField jtf = new JTextField(15);
JButton bu = new JButton("登录");
this.add(jtf);
this.add(bu);
this.setVisible(true);
}
// 主函数
public static void main(String[] args){
LoginUI db = new LoginUI();
db.initUI();
}
}
效果:
很简单吧,开始加东西,我们四处看看,看上了一个简单的计算器,试着自己写一个
写一个计算器
步骤
需要考虑几个问题:
布局
我们总先要把框架搭建起来吧,这里我们选择用菜单的形式来构建~搭建开始
先搭建好菜单部分,步骤:(因为直接继承了JFrame,因此可以直接开始写)
1)写好组件
// 搭建界面
setBounds(100,100,400,400);
setTitle("计算器");
// 写组件
JMenuBar menubar=new JMenuBar();
JMenu menu1=new JMenu("查看(V)");
JMenu menu2=new JMenu("编辑(E)");
JMenu menu3=new JMenu("帮助(H)");
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
// 写到界面上,加好布局
this.setJMenuBar(menubar);//将设置好的菜单条放在窗口中
this.setLayout(new BorderLayout());
this.setVisible(true);
执行看看效果
接着把两个部分写进去,显示的区域和计算器的按钮区域。
//注意,在写这个类的时候,我们开始就定义了JTextArea(),这样之后才能正常的显示。
// 加分区:计算显示的区域以及摆放按钮的部分,放在两个面板上
JPanel p1=new JPanel();
JPanel p2=new JPanel();
text.setPreferredSize(new Dimension (370,60));//设置组件大小
p1.add(text);
this.add(p1,BorderLayout.NORTH);
定义按钮组件和布局,放进去
// 定义主体组件放到第二个面板上,并且设置面板布局,在面板上用格子和流式两个布局
// 把组件放到一个数组里面,等下就可以写循环语句来加入组件了
p2.setLayout(new FlowLayout());
p2.setLayout(new GridLayout(5,4)); //添加按钮
JButton button[]=new JButton[20];
button[0]=new JButton("C");
button[1]=new JButton("CE");
button[2]=new JButton("%");
button[3]=new JButton("÷");
button[4]=new JButton("7");
button[5]=new JButton("8");
button[6]=new JButton("9");
button[7]=new JButton("x");
button[8]=new JButton("4");
button[9]=new JButton("5");
button[10]=new JButton("6");
button[11]=new JButton("—");
button[12]=new JButton("1");
button[13]=new JButton("2");
button[14]=new JButton("3");
button[15]=new JButton("+");
button[16]=new JButton("e");
button[17]=new JButton("0");
button[18]=new JButton(".");
button[19]=new JButton("=");
// 循环语句来加入组件
for(int i=0;i<button.length;i++ )
p2.add(button[i]);
// 在等号上加些色彩再加进去,当然你啥也不加完全也可以
button[19].setBackground(Color.YELLOW);
p2.add(button[19]);
add(p2,BorderLayout.CENTER);
让我们运行来看看
看看框架不就搭好了吗嘿嘿,往下写方法咯~
方法实现
这里的方法都是建立在点击上的,因此我们只需要action listener就可以了,我们选择将对象同时继承Jframe和实现actionlistener接口,编写init方法,并且在main程序里面调用完成计算器的显示。
具体方法的实现需要我们利用监听器,因此先在每一个按钮上加上监听器
// 加入监听器
for(int i=0;i<button.length;i++){
button[i].addActionListener(this);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击X号可以关闭程序
}
接着开始根据监听器的方法
这里我们实现一个简单的计算器,即我们默认输入的两个数字进行一次计算
1)当是数字的时候,直接存储起来
2)当是符号的时候,设置一下符号提示符,用这个数字表示是不同的符号,并且把前面的数字存起来
3)当点击等号的时候,先看看是什么符号,根据符号进行计算
4)每一步除了里面的处理,还要注意显示的问题,使用的方法是setText
这个地方我们利用存储的类是:StringBuilder
可以把数字用字符串的形式存储起来
第一种,直接显示类
其中每一个都是一样的书写逻辑
(这个代码看起来就很不爽,真码农了害)
// 数字直接显示类
if(note.equals("0"))
{
stringBuilder.append("0");
text.setText(stringBuilder.toString());
}
else if(note.equals("1"))
{
stringBuilder.append("1");
text.setText(stringBuilder.toString());
}
else if(note.equals("2"))
{
stringBuilder.append("2");
text.setText(stringBuilder.toString());
}
else if(note.equals("3"))
{
stringBuilder.append("3");
text.setText(stringBuilder.toString());
}
else if(note.equals("4"))
{
stringBuilder.append("4");
text.setText(stringBuilder.toString());
}
else if(note.equals("5"))
{
stringBuilder.append("5");
text.setText(stringBuilder.toString());
}
else if(note.equals("6"))
{
stringBuilder.append("6");
text.setText(stringBuilder.toString());
}
else if(note.equals("7"))
{
stringBuilder.append("7");
text.setText(stringBuilder.toString());
}
else if(note.equals("8"))
{
stringBuilder.append("8");
text.setText(stringBuilder.toString());
}
else if(note.equals("9"))
{
stringBuilder.append("9");
text.setText(stringBuilder.toString());
}
else if(note.equals("CE"))
{
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
text.setText(stringBuilder.toString());
}
else if(note.equals("C"))
{
stringBuilder = new StringBuilder();
text.setText(stringBuilder.toString());
}
else if(note.equals("."))
{
stringBuilder.append(".");
text.setText(stringBuilder.toString());
}
第二种:加减乘除求余,我们需要设置符号了
这里我们直接先给类一个私有变量好了,叫做xmark
点击符号之后,我们还需要把之前的变量存起来,用一个叫做remain的变量
else if(note.equals("+"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark = 0;
stringBuilder = new StringBuilder();
text.setText("+");
}
else if(note.equals("—"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark = 1;
stringBuilder = new StringBuilder();
text.setText("—");
}
else if(note.equals("x"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark=2;
stringBuilder = new StringBuilder();
text.setText("x");
}
else if(note.equals("÷"))
{
xmark=3;
remain = Double.parseDouble(stringBuilder.toString());
stringBuilder = new StringBuilder();
text.setText("÷");
}
else if(note.equals("%"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark=4;
stringBuilder = new StringBuilder();
text.setText("%");
}
else if(note.equals("e"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark=5;
stringBuilder = new StringBuilder();
text.setText("e");
}
最后,就来处理等号的时候的情况了
else if(note.equals("="))
{
// 我们用remain存储先的数字,现在可以获得第二个数字了
newin = Double.parseDouble(stringBuilder.toString());
// 加法
if (xmark == 0)
{
sum= remain+newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 减法
else if (xmark == 1)
{
sum = remain - newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 乘法
else if (xmark == 2)
{
sum = remain * newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 除法
else if (xmark == 3)
{
sum = remain / newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 求余
else if (xmark == 4)
{
sum = remain % newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
//次幂: remain的 newin 次幂
else if (xmark == 5)
{
if(newin==0)
sum=1.0;
else
sum = Math.pow(remain,newin);
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
else
text.setText(stringBuilder.toString());
}
最后就是我们搭建好的计算器了~
然后写一下主函数建立这个类,并且调用我们写的方法就ok啦~
代码
完整代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Caculator extends JFrame implements ActionListener {
JTextArea text=new JTextArea();
private StringBuilder stringBuilder = new StringBuilder();
Integer xmark;
Double remain;
Double newin;
Double sum;
public void initCaculator(){
// 搭建界面
setBounds(100,100,400,400);
setTitle("计算器");
JMenuBar menubar=new JMenuBar();//创建菜单条
JMenu menu1=new JMenu("查看(V)");//创建和设置菜单名
JMenu menu2=new JMenu("编辑(E)");//创建和设置菜单名
JMenu menu3=new JMenu("帮助(H)");//创建和设置菜单名
menubar.add(menu1);//将菜单加入到菜单条中
menubar.add(menu2);
menubar.add(menu3);
this.setJMenuBar(menubar);//将设置好的菜单条放在窗口中
this.setLayout(new BorderLayout());
// 加分区:计算显示的区域以及摆放按钮的部分,放在两个面板上
JPanel p1=new JPanel();
JPanel p2=new JPanel();
text.setPreferredSize(new Dimension (370,60));//设置组件大小
p1.add(text);
this.add(p1,BorderLayout.NORTH);
// 定义主体组件放到第二个面板上,并且设置面板布局,在面板上用格子和流式两个布局
// 把组件放到一个数组里面,等下就可以写循环语句来加入组件了
p2.setLayout(new FlowLayout());
p2.setLayout(new GridLayout(5,4)); //添加按钮
JButton button[]=new JButton[20];
button[0]=new JButton("C");
button[1]=new JButton("CE");
button[2]=new JButton("%");
button[3]=new JButton("÷");
button[4]=new JButton("7");
button[5]=new JButton("8");
button[6]=new JButton("9");
button[7]=new JButton("x");
button[8]=new JButton("4");
button[9]=new JButton("5");
button[10]=new JButton("6");
button[11]=new JButton("—");
button[12]=new JButton("1");
button[13]=new JButton("2");
button[14]=new JButton("3");
button[15]=new JButton("+");
button[16]=new JButton("e");
button[17]=new JButton("0");
button[18]=new JButton(".");
button[19]=new JButton("=");
// 循环语句来加入组件
for(int i=0;i<button.length;i++ )
p2.add(button[i]);
// 在等号上加些色彩
button[19].setBackground(Color.YELLOW);
p2.add(button[19]);
add(p2,BorderLayout.CENTER);
// 加入监听器
for(int i=0;i<button.length;i++){
button[i].addActionListener(this);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击X号可以关闭程序
}
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// 获取按钮上面字迹
String note = e.getActionCommand();
// 数字直接显示类
if(note.equals("0"))
{
stringBuilder.append("0");
text.setText(stringBuilder.toString());
}
else if(note.equals("1"))
{
stringBuilder.append("1");
text.setText(stringBuilder.toString());
}
else if(note.equals("2"))
{
stringBuilder.append("2");
text.setText(stringBuilder.toString());
}
else if(note.equals("3"))
{
stringBuilder.append("3");
text.setText(stringBuilder.toString());
}
else if(note.equals("4"))
{
stringBuilder.append("4");
text.setText(stringBuilder.toString());
}
else if(note.equals("5"))
{
stringBuilder.append("5");
text.setText(stringBuilder.toString());
}
else if(note.equals("6"))
{
stringBuilder.append("6");
text.setText(stringBuilder.toString());
}
else if(note.equals("7"))
{
stringBuilder.append("7");
text.setText(stringBuilder.toString());
}
else if(note.equals("8"))
{
stringBuilder.append("8");
text.setText(stringBuilder.toString());
}
else if(note.equals("9"))
{
stringBuilder.append("9");
text.setText(stringBuilder.toString());
}
else if(note.equals("CE"))
{
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
text.setText(stringBuilder.toString());
}
else if(note.equals("C"))
{
stringBuilder = new StringBuilder();
text.setText(stringBuilder.toString());
}
else if(note.equals("."))
{
stringBuilder.append(".");
text.setText(stringBuilder.toString());
}
// 符号类
else if(note.equals("+"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark = 0;
stringBuilder = new StringBuilder();
text.setText("+");
}
else if(note.equals("—"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark = 1;
stringBuilder = new StringBuilder();
text.setText("—");
}
else if(note.equals("x"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark=2;
stringBuilder = new StringBuilder();
text.setText("x");
}
else if(note.equals("÷"))
{
xmark=3;
remain = Double.parseDouble(stringBuilder.toString());
stringBuilder = new StringBuilder();
text.setText("÷");
}
else if(note.equals("%"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark=4;
stringBuilder = new StringBuilder();
text.setText("%");
}
else if(note.equals("e"))
{
remain = Double.parseDouble(stringBuilder.toString());
xmark=5;
stringBuilder = new StringBuilder();
text.setText("e");
}
// 计算类
else if(note.equals("="))
{
// 我们用remain存储先的数字,现在可以获得第二个数字了
newin = Double.parseDouble(stringBuilder.toString());
// 加法
if (xmark == 0)
{
sum= remain+newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 减法
else if (xmark == 1)
{
sum = remain - newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 乘法
else if (xmark == 2)
{
sum = remain * newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 除法
else if (xmark == 3)
{
sum = remain / newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
// 求余
else if (xmark == 4)
{
sum = remain % newin;
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
//次幂: remain的 newin 次幂
else if (xmark == 5)
{
if(newin==0)
sum=1.0;
else
sum = Math.pow(remain,newin);
text.setText(sum.toString());
stringBuilder = new StringBuilder();
stringBuilder.append(sum);
}
else
text.setText(stringBuilder.toString());
}
}
// 写入口
public static void main(String[] args){
Caculator cal = new Caculator();
cal.initCaculator();
}
}
总结
总的来说,其实逻辑都是一样的,写好实现类,搭建框架,写组件,加组件,设置布局,加进去,显示。