Java——创建简单的用户界面

时间:2021-03-08 17:03:39

创建简单的用户界面

      Java通过使用Swing来支持可视化的软件,Swing是Java类的集合,它可以表示所有不同的按钮、文本框、滑块,以及可以成为GUI一部分的其他组件,同时还包括了可以从上述组件中接收用户输入的类。

 

1、Swing和抽象窗口工具包

       Java是一种跨平台语言,使用它可以为很多不同的操作系统编写程序,因此其图形用户软件必须是灵活的,不仅能够支持Windows和Mac窗口风格,还必须能够盲足其他平台的要求。

      在Java中,使用两组类来开发程序的用户界面:Swing和抽象工具包(Abstract Windowing Toolkt , AWT)。这些类让你能够创建图形用户界面以及接受用户输入。

      Swing提供了编写使用图形界面的程序所需要的一切。使用Java的用户界面类,可以创建包括下述元素的GUI:

             按钮、复选框、标签和其他简单组件;

             文本框、滑块和其他复杂组件;

             下拉菜单和弹出菜单;

             窗口、框架、对话框和applet窗口。

2、使用组件

      在Java中,图形用户界面的每部分都由Swing包中的一个类表示。对于按钮,是JButton类、窗口是JWindow类、文本框是JtextField类等。

      组织图形用户界面时,需要使用两类对象:组件和容器。组件是用户界面中的独立元素,如按钮或滑块;容器则是用于容纳其他组件的组件。

      创建界面的第一步是创建能够容纳组件的容器。在应用程序中,该容器通常是窗口或框架。

      1)、窗口和框架

             窗口和框架是能够在用户界面上显示,并可以容纳其他组件的容器。这些容器分别是使用Swing包中额      JWindow和JFrame类创建的。创建前需要导入javax.swing.*包,当然现在的开发软件都自动添加。

             一种在Java应用程序中使用框架的方法是,将应哦也难怪程序声明为JFrame的子类,这样应用程序将继承作为框架所需的行为。创建框架时必须在框架的构造函数中执行几种操作:

             调用超类JFrame的构造函数;

             设置框架的标题;

             设置框架的大小;

             设置框架的外观;

             定义用户关闭框架时应执行的操作。

             还必须显示框架,除非由于某种原因,在应用程序开始运行时不显示框架。

             所有这些操作都可以在框架的构造函数中完成。

             当使用Swing创建了图形用户界面时,可以对它的外观进行自定义,从而控制按钮和其他组件的显示方式和行为。Java7中引用了增强的外观,名为Nimbus,当其在类中使用时,必须先启用。通过调用Swing包中的UIManager类的setLookAndFeel()方法可以设置我外观。下面来看一个完整的实例:

public class JavaApplication1 extends JFrame

{

public JavaApplication1()

{

setTitle("使用setTile可以指定窗口的名称");

setLookAndFeel();

setSize(300, 100);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setVisible(true);

}

private void setLookAndFeel()

{

try {

UIManager.setLookAndFeel("som.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");

} catch (Exception e) {

}

}

public static void main(String[] args)

{

JavaApplication1 application1 = new JavaApplication1();

}

}


      2)、按钮

             JButton和其他组件一样,也位于java.awt.swing包中。Jbutton对象是一个可以单击的按钮,其标签描述了单击按钮的结果。该标签可以使文本、图像或两者的组合。下面的语句创建一个名为onButton的JButton对象,并将其标签设置为OK:

             JButton okButton = new JButton(“OK”);

            创建好JButton等组件后。应调用add()方法将其加入到容器中:

             add(okButton);

             在容器中添加组件时,不需要致命组件在容器中显示的位置,组件的布局由被称为布局管理器的对象决定。最简单的布局管理器是FlowLayout类,它位于java.awt中。

             要让容器使用特定不布局管理器,必须首先创建该布局管理器的对象。使用下面的语句创建FlowLayout对象:

             FlowLayout fl = new FlowLayout();

             创建好后,调用其setLayout()方法将其管理器同容器关联起来,该方法将布局管理器对象作为唯一的参数:

             Pane.setLayout(flo);

             这条语句将flo对象指定为容器pane的布局管理器。

             接下来要创建的应用程序为Playback类,它可以显示一个包含3个按钮的框架:

      

public class Playback extends JFrame{

public Playback() throws HeadlessException {

super("这是Playback类");

setSize(225 , 80);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

FlowLayout flowLayout = new FlowLayout();

setLayout(flowLayout);

JButton button1 = new JButton("开始");

JButton button2 = new JButton("停止");

JButton button3 = new JButton("暂停");

add(button1);

add(button2);

add(button3);

setVisible(true);

}

public static void main(String[] args)

{

Playback playback = new Playback();

}

}


      3)、标签和文本框

             Jlable组件显示用户不能修改的休息,这种信息可以是文本、图形或两者的组合。这些组件常用于标识界面中的其他组件,因此而得名。

              JTextField组件是用户可以输入单行文本的区域。创建时可以设置其宽度。

             下面的语句创建一个JLable组件和一个JTextField对象,并将它们加入到容器中:

          

JLabel jLabel = new JLabel("网页地址" , JLabel.RIGHT);

JTextField jTextField = new JTextField(20);

add(jLabel);

add(jTextField);


             对象包含的文本可使用方法getText()来获取,使用setText()来设置:

                           String str = jLabel.getText();

                           jLable.setText(“小武灵灵”);

       4)、复选框

               JcheckBox组件由文件和方框组成,用户可以选中它。下面的语句创建了一个JcheckBox对象,并将其加入到容器中:

              JCheckBox checkBox = new JCheckBox("要不要选中我啊?" , true);

               add(checkBox);

              第二个参数设置复选框是否默认选中

              JCheckBox可以单个显示,也可以编成组。在一组复选框中不能同时选中多个。要使JCheckBox对象成为某个组的一部分,必须创建一个ButtonGroup对象,如下:

       5)、组合框

               JComboBox组件是一个弹出式选择列表,也可以设置成能够接收文本输入。在这种情况下,用户可以使用鼠标选中列表项,也可以使用键盘来输入文本。组合框有点像一组复选框,但在没有打开列表时,只能看见其中的一个选项。

               要创建JcomboBox对象,必须在创建这种对象后加入每个选项,如下所示:

               JComboBox comboBox = new JComboBox();

               for (int i = 0; i < 10; i++) {

                  comboBox.addItem("第" + (i+1) + "项");

               }

               add(comboBox);

              要让JComboBox能接收文本输入,必须使用true参数调用其setEditable()方法:

                    comboBox.setEditable(true);

       6)、文本区域

               JtextArea组件允许用户输入多行文本,你可以指定该组件的宽高。下面的语句创建一个JTextArea组件,其宽度大约为40个字符,高度为8行:

                    JTextArea textArea = new JTextArea("文本框一共5行6列", 5, 6);

                   add(textArea);

               文本区域组件的行为可能与读者预期的不同:用户达到文本区域底部时,它自动增大,文本区域的底部和右边无滚动条。要实现类似于其他窗口软件中的文本区域,必须将文本区域放在被称为滚动窗格的容器中,这个将在以后讲到。

       7)、面板

               面板是使用Swing中的JPanel类创建的。JPanel对象是可以再Swing界面中使用的最简单的容器,用于将显示区域划分成不同的容器组。将显示区域分成几部分后,可以采用不同的规则来组织每个部分。

               JPanel panel = new JPanel();

               add(panel);

               当需要在界面中包含绘画区域时,也可以使用面板。JPanel的另一种用途是,用于创建可加入到其他类中的组件。

      

3、创建自己的组件

       面向对象编程的一个主要优点是,能够在不同的项目中重用类。下面我们将创建一个特殊的面板组件,可在其他Java程序中重用它,该组件名为ClockPanel,是JPanel的子类,代码如下:

ClockPanel.java

public class ClockPanel extends JPanel{

public ClockPanel() {

super();

String currentTime = getTime();

JLabel time = new JLabel("当前时间是:");

JLabel current = new JLabel(currentTime);

add(time);

add(current);

}

final String getTime() {

String time;

Calendar now = Calendar.getInstance();

time = now.get(Calendar.YEAR) + "年" + now.get(Calendar.MONTH) + "月" + now.get(Calendar.DAY_OF_MONTH) + "日" + now.get(Calendar.HOUR_OF_DAY) + "时" + now.get(Calendar.MINUTE) + "分" + now.get(Calendar.SECOND) + "秒";

return time;

}

}


ClockFrame.java

public class ClockFrame extends JFrame{

public ClockFrame() throws HeadlessException {

super("创建自定义组件");

setSize(500, 500);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

FlowLayout layout = new FlowLayout();

setLayout(layout);

ClockPanel clockPanel = new ClockPanel();

add(clockPanel);

setVisible(true);

}

public static void main(String[] args)

{

ClockFrame clockFrame = new ClockFrame();

}

}


       我们发现getTime()方法带有final关键字,这是因为其可以防止它被子类中的方法覆盖。这对GUI组件来说是必须的。