初学 swing界面



                                                         Swing
界面开发

  应该说,swing界面真的是个神奇的东西,简单地敲几句代码,就可以出来一个窗口。当然,神奇的东西总是不那么好学,就好比这个swing界面,虽然要写个界面很简单,但是要把一个界面写得整齐美观就没有那么容易了。就比如说我们初学者拿来练手的“计算器”界面,

看似一个界面就那么几个按钮,但是要把这写按钮整齐的排列在窗口上,着实得花不少功夫。

  当然,言归正传,先看看这个计算器界面。

 

 

这是我自己写的,虽然还是略丑(- -!)。

首先得分析整个界面是由哪几部分组成的。  仔细观察可以发现这个计算器组成部分可以分为3大块:

.输入框②.3个长按钮③.24个小的按钮。

然后,我们再分析这三个部分是按什么布局排列的。  乍一看,3个区域按上中下排列,可以用流布局或者是边框布局。  当然,在②③区域中还包括了网格布局。

搞明白布局之后,我们要做的就是如何实现它,这个其实也不难,将三个区域的组件分别放在3个面板中,由于面板之间有间隙,所以面板采用流式布局。

这样一来思路就很清晰了:我们要做的是创建3个面板的方法

public JPanel p1(){}

public JPanel p2(){}

public JPanel p3(){}         这样做主要是让面板的管理更加有条理

然后在三个面板中加入需要的组件,并且将组件的大小和文字设置好。并且注意,此例子的p2p3面板中采用网格布局;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:这就是真正的退出程序了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值