Swing 界面开发
应该说,swing界面真的是个神奇的东西,简单地敲几句代码,就可以出来一个窗口。当然,神奇的东西总是不那么好学,就好比这个swing界面,虽然要写个界面很简单,但是要把一个界面写得整齐美观就没有那么容易了。就比如说我们初学者拿来练手的“计算器”界面,
看似一个界面就那么几个按钮,但是要把这写按钮整齐的排列在窗口上,着实得花不少功夫。
当然,言归正传,先看看这个计算器界面。
这是我自己写的,虽然还是略丑(- -!)。
首先得分析整个界面是由哪几部分组成的。 仔细观察可以发现这个计算器组成部分可以分为3大块:
①.输入框②.3个长按钮③.24个小的按钮。
然后,我们再分析这三个部分是按什么布局排列的。 乍一看,3个区域按上中下排列,可以用流布局或者是边框布局。 当然,在②③区域中还包括了网格布局。
搞明白布局之后,我们要做的就是如何实现它,这个其实也不难,将三个区域的组件分别放在3个面板中,由于面板之间有间隙,所以面板采用流式布局。
这样一来思路就很清晰了:我们要做的是创建3个面板的方法
public JPanel p1(){}
public JPanel p2(){}
public JPanel p3(){} 这样做主要是让面板的管理更加有条理
然后在三个面板中加入需要的组件,并且将组件的大小和文字设置好。并且注意,此例子的p2、p3面板中采用网格布局;p1中可以用流式、网格布局。
当3个面板方法写好后,就是只剩下最后一步了,把3个面板方法分别实例化一个对象然后在把面板对象添加到窗口中。(添加时,把窗口大小设置合适,布局设置为流体布局即可出现以上效果)。
这是我自己做练习的一点思路,其实,大部分的简单界面都可以沿着这样的思路来写。
把思路总结概括一下就是:
①. 观察所要做的界面主要是由那几个区域组成的。划分好区域。
②. 确定区域后对每个区域创建一个面板的方法,在面板方法中将这个区域内的组件加入到面板中,选择适合的布局(在本例中是网格布局)并且设置好组件大小。
③. 实例化面板方法的对象后,将面板对象添加到窗口上,注意选择合适的布局(本例中为流式布局)。
这是代码:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
publicclass Calculator {
publicstaticvoid main(String args[])
{
Calculator cal=new Calculator();
cal.InitUI();
}
publicvoid InitUI()
{
JFrame J=new JFrame();
J.setSize(350,245);
//创建一个编辑框对象
JTextField jta=new JTextField();
//设置编辑框大小
jta.setPreferredSize(new Dimension(330,21));
//创建一个留布局管理器对象
FlowLayout f=new FlowLayout(FlowLayout.LEFT);
J.setLayout(f);
//实例化面板对象
JPanel number=number();
JPanel Mahead=Mahead();
JPanel clear=clear();
//将面板都添加到窗口上
J.add(jta);
J.add(clear);
J.add(Mahead);
J.add(number);
J.setVisible(true);
J.setResizable(false);
J.setDefaultCloseOperation(3);
}
/*
* 创建数字符和运算符的面板
*/
public JPanel number()
{
//创建一个面板对象
JPanel np=new JPanel();
//创建网格布局管理器
GridLayout g=new GridLayout(4,5,3,3);
np.setLayout(g);
//创建按钮
JButton bu0=new JButton("0");
JButton bu1=new JButton("1");
JButton bu2=new JButton("2");
JButton bu3=new JButton("3");
JButton bu4=new JButton("4");
JButton bu5=new JButton("5");
JButton bu6=new JButton("6");
JButton bu7=new JButton("7");
JButton bu8=new JButton("8");
JButton bu9=new JButton("9");
JButton bu_add=new JButton("+");
JButton bu_cut=new JButton("-");
JButton bu_multiple=new JButton("*");
JButton bu_divide=new JButton("/");
JButton bu_equal=new JButton("=");
JButton bu_dao=new JButton("1/x");
bu_dao.setFont(new Font("宋体",0,10));
JButton bu_remainder=new JButton("%");
JButton bu_sqrt=new JButton("sqrt");
JButton bu_point=new JButton(".");
JButton bu_opposite=new JButton("+/-");
bu_opposite.setFont(new Font("宋体",0,10));
Font font=new Font("宋体",0,8);
bu_sqrt.setFont(font);
//设置按钮属性:大小
bu0.setPreferredSize(new Dimension(45,27));
bu1.setPreferredSize(new Dimension(45,27));
bu2.setPreferredSize(new Dimension(45,27));
bu3.setPreferredSize(new Dimension(45,27));
bu4.setPreferredSize(new Dimension(45,27));
bu5.setPreferredSize(new Dimension(45,27));
bu6.setPreferredSize(new Dimension(45,27));
bu7.setPreferredSize(new Dimension(45,27));
bu8.setPreferredSize(new Dimension(45,27));
bu9.setPreferredSize(new Dimension(45,27));
bu_add.setPreferredSize(new Dimension(45,27));
bu_cut.setPreferredSize(new Dimension(45,27));
bu_multiple.setPreferredSize(new Dimension(45,27));
bu_divide.setPreferredSize(new Dimension(45,27));
bu_dao.setPreferredSize(new Dimension(45,27));
bu_remainder.setPreferredSize(new Dimension(45,27));
bu_sqrt.setPreferredSize(new Dimension(50,27));
bu_equal.setPreferredSize(new Dimension(45,27));
bu_opposite.setPreferredSize(new Dimension(45,27));
bu_point.setPreferredSize(new Dimension(45,27));
//将组件添加到面板上
np.add(bu7);
np.add(bu8);
np.add(bu9);
np.add(bu_divide);
np.add(bu_sqrt);
np.add(bu4);
np.add(bu5);
np.add(bu6);
np.add(bu_multiple);
np.add(bu_remainder);
np.add(bu1);
np.add(bu2);
np.add(bu3);
np.add(bu_cut);
np.add(bu_dao);
np.add(bu0);
np.add(bu_opposite);
np.add(bu_point);
np.add(bu_add);
np.add(bu_equal);
return np;
}
/*
* 创建M开头的符号的方法
*/
public JPanel Mahead()
{
//创建一个面板对象
JPanel mahead=new JPanel();
//创建网格布局管理器
GridLayout g=new GridLayout(4,1,3,3);
mahead.setLayout(g);
//创建按钮对象
JButton bu_MC=new JButton("MC");
JButton bu_MR=new JButton("MR");
JButton bu_MS=new JButton("MS");
JButton bu_Madd=new JButton("M+");
//设置按钮的大小
bu_MC.setPreferredSize(new Dimension(60,27));
bu_MR.setPreferredSize(new Dimension(60,27));
bu_MS.setPreferredSize(new Dimension(60,27));
bu_Madd.setPreferredSize(new Dimension(60,27));
//将组件添加到面板上
mahead.add(bu_MC);
mahead.add(bu_MR);
mahead.add(bu_MS);
mahead.add(bu_Madd);
return mahead;
}
/*
* 创建清空面板的方法
*/
public JPanel clear()
{
//创建一个面板的对象
JPanel clear=new JPanel();
//创建网格布局管理器
GridLayout g=new GridLayout(1,4,3,3);
clear.setLayout(g);
//创建按钮对象
JButton bu_Backspace=new JButton("Backspace");
JButton bu_CE=new JButton("CE");
JButton bu_C=new JButton("C");
//设置按钮大小
bu_Backspace.setPreferredSize(new Dimension(105,27));
bu_CE.setPreferredSize(new Dimension(105,27));
bu_C.setPreferredSize(new Dimension(105,27));
//把按钮组件添加到面板上
clear.add(bu_Backspace);
clear.add(bu_CE);
clear.add(bu_C);
return clear;
}
}
这时,肯定有许多童鞋会有与我相同的疑惑,写一个界面要用这么多布局,还要加这么多面板,实在是有点麻烦啊!
其实,除了使用这些常用的布局之外,我们还可以使用空布局(也叫绝对布局来做)其实用空布局说白了就是不实用布局用一个 窗口对象.setLayout(null) 来实现。在这种情形之下,我们加在任何容器上的组件都可以通过
组件名.setBounds(int x,int y,int width,int height) 来设置组件在容器中的位置以及组件的大小。 虽然绝对布局很方便,但是有一个缺陷就是:一旦组件的位置确定了之后,组件相对于窗口零点的位置就不会再改变,这样也就造成了窗口放大时,组件不会随窗口一起放大,这也影响了整个界面的美观。
在swing界面的编写中还有一个新手容易忽视的问题:
郑重声明:以下内容纯属百度。
setDefaultCloseOperation(int operation):设置用户在此窗体上发起 "close" 时默认执行的操作。方法中的参数解释如下: 为“0”或DO_NOTHING_ON_CLOSE: (在 WindowConstants 中定义):不执行任何操作;要求程序在已注册的WindowListener 对象的 windowClosing 方法中处理该操作。 比如实例程序代码中更改为f.setDefaultCloseOperation(f. DO_NOTHING_ON_CLOSE);或者f.setDefaultCloseOperation(0),然后查看效果,可以发现窗口无法关闭,下面是相同测试方法,不再解释了。 为“1”或HIDE_ON_CLOSE 调用任意已注册的 WindowListener 对象后自动隐藏该窗体。此时没有关闭程序,只是将程序界面隐藏了。可以打开任务管理器,可以看到一个叫“java.exe”的进程(如果调试运行了多个java程序,则会看到多个“java.exe”的进程),如果此时用EditPlus测试程序,会发现当单击窗口的关闭按钮关闭窗口后,却无法再次对程序进行调试,因为程序线程没有关闭,在任务管理器中关闭java.exe(如果有多个“java.e xe”的进程,则先都关闭掉,再来测试该问题)基础后,EditPlus才可以重新编译改程序。 为“2”或DISPOSE_ON_CLOSE调用任意已注册 WindowListener 的对象后自动隐藏并释放该窗体。但继续运行应用程序,释放了窗体中占用的资源。 为“3”EXIT_ON_CLOSE(在 JFrame 中定义):使用 System exit 方法退出应用程序。仅在应用程序中使用。结束了应用程序。 默认情况下,该值被设置为 HIDE_ON_CLOSE。 |
我用自己的话概括一下就是:
如果 setDefaultCloseOperation(int operation) 括号里写的是0,那么,界面就无法关掉。
如果是1,那么,点“X”后界面会没掉,但是只是隐藏,也就是程序还在运行。打开任务管理器的进程里就可以看到 javaw.exe 说明程序还在运行。
如果是2,会把窗口所占用的资源释放,但是程序还在运行(这个我也不太理解)。
如果是3:这就是真正的退出程序了。