Java SWing

来源:互联网 发布:数据库开发分为 编辑:程序博客网 时间:2024/06/08 07:34

UI组件: UI 的元素,除了在屏幕上看到的这些之外,还有更多都是 UI 元素。比如鼠标、键盘、音量、屏幕颜色、使用的字体,以及一个对象相对于另一个对象的位置,这些都包含在 UI 之中。实际上,在计算机和用户的交互之中扮演角色的任何对象都是 UI 的组成部分.

Swing 的角色

Swing 是 Java 平台的 UI —— 它充当处理用户和计算机之间全部交互的软件。它实际上充当用户和计算机内部之间的中间人.它提供了处理前面一节中描述的 UI 各方面内容的机制:

  • 键盘:Swing 提供了捕捉用户输入的方法。
  • 颜色:Swing 提供改变在屏幕上看到的颜色的方法。
  • 打字的地址栏:Swing 提供了文本组件,处理所有普通任务。
  • 音量:Swing 不太擅长。

Swing 提供了创建自己的 UI 所需要的所有工具

Swing 甚至走得更远一步,在基本的 UI 原则之上又放上了一个公共的设计模式。这个设计模式叫做模型-视图-控制器(Model-View-Controller,MVC),它试图“把角色分开”。MVC 让负责显示的代码、处理数据的代码、对交互进行响应并驱动变化的代码彼此分离。

 MVC 设计模式背后的概念:让 UI 的每个方面处理它擅长的工作

JComponent

Swing 的整个可视组件库的基础构造块是 JComponent。它是所有组件的父类。它是一个抽象类,所以不能创建 JComponent,但是作为类层次结构的结果,从字面意义来说它包含了数百个函数,Swing 中的每个组件都可以使用这些函数。显然,有些概念要比其他概念重要:

  • JComponent 不仅是 Swing 组件的基类,还是定制组件的基类(有关的更多信息在“中级 Swing”教程中)。
  • 它为所有组件提供了绘制的基础架构 —— 一些方便进行组件定制的东西(同样,在“中级 Swing”中,有关于这个主题的更多信息)。
  • 它知道如何处理所有的键盘按键。所以类只需要侦听特定的键。
  • 它包含 add() 方法,可以添加其他 JComponent。换种方式来看,可以把任意 Swing 组件添加到其他任何 Swing 组件,从而构造嵌套组件(例如,JPanel 包含 JButton,甚至包含一些古怪的组合,例如 JMenu 包含 JButton)。


简单的swing小部件

JLabel

Swing 库中最基础的组件是 JLabel。

JLabel

在整个应用程序中,不仅把 JLabel 用作文本描述,还将它用作图片描述。每当在 Swing 应用程序中看到图片的时候,它就有可能是 JLabel。JLabel 对于 Swing 初学者来说没有许多意料之外的方法。基本的方法包括设置文本、图片、对齐以及标签描述的其他组件:

  • get/setText(): 获取/设置标签的文本。
  • get/seticon(): 获取/设置标签的图片。
  • get/setHorizontalAlignment(): 获取/设置文本的水平位置。
  • get/setVerticalAlignment(): 获取/设置文本的垂直位置。
  • get/setDisplayedMnemonic(): 获取/设置标签的访问键(下划线文字)。
  • get/setLableFor(): 获取/设置这个标签附着的组件,所以当用户按下 Alt+访问键时,焦点转移到指定的组件。

 JButton

Swing 中的基本动作组件 JButton,是与每个窗口中都能看到的 OK 和 Cancel 一样的按钮

 

JButton

用来改变 JButton 属性的方法与 JLabel 的方法类似(您可能发现,在大多数 Swing 组件中,这些属性都类似)。它们控制文本、图片和方向:

  • get/setText(): 获取/设置标签的文本。
  • get/seticon(): 获取/设置标签的图片。
  • get/setHorizontalAlignment(): 获取/设置文本的水平位置。
  • get/setVerticalAlignment(): 获取/设置文本的垂直位置。
  • get/setDisplayedMnemonic(): 获取/设置访问键(下划线字符),与 Alt 按钮组合时,造成按钮单击。

除了这些方法,我还要介绍 JButton 包含的另外一组方法。这些方法利用了按钮的所有不同状态。状态是对组件进行描述的一个属性,通常采用真/假设置。在 JButton 中,可以包含以下可能状态:活动/不活动、选中/没选中、鼠标经过/鼠标离开、按下/没按下,等等。另外,可以组合这些状态,例如按钮可以在鼠标经过的同时被选中。现在您可能会问自己用这些状态到底要做什么。作为示例,请看看您的浏览器上的后退按钮。请注意在鼠标经过它的时候,图片是如何变化的,在按下该按钮时,图片又是如何变化的。这个按钮利用了不同的状态。每个状态采用不同的图片,这是提示用户交互正在进行的一种普遍并且有效的方式。JButton 上的状态方法是:

  • get/setDisabledIcon()
  • get/setDisableSelectedIcon()
  • get/setIcon()
  • get/setPressedIcon()
  • get/setRolloverIcon()
  • get/setRolloverSelectedIcon()
  • get/setSelectedIcon()

JTextField

Swing 中的基本文本组件是 JTextField,它允许用户在 UI 中输入文本。我肯定您熟悉文本字段:要掌握本教程,则必须使用一个文本字段输入用户名和口令。您输入文本、删除文本、选中文本、把文字四处移动 —— Swing 替您负责所有这些工作。作为 UI 开发人员,利用 JJTextField 时,实际上并不需要做什么。

在任何情况下,这是 JTextField 实际使用时看起来的样子:

JTextField

在处理 JTextField 时,只需要关注一个方法 —— 这应当是很明显的,这个方法就是设置文本的方法: get/setText(),用于获取/设置 JTextField 中的文本。

JFrame

迄今为止,我介绍了 Swing 的三个基本构造块:标签、按钮和文本字段;但是现在需要个地方放它们,希望用户知道如何处理它们。JFrame 类就是做这个的——它是一个容器,允许您把其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。它有许多其他好处,但是我认为先看看它的图片最简单:

 

JFrame

JFrame 实际上不仅仅让您把组件放入其中并呈现给用户。比起它表面上的简单性,它实际上是 Swing 包中最复杂的组件。为了最大程度地简化组件,在独立于操作系统的 Swing 组件与实际运行这些组件的操作系统之间,JFrame 起着桥梁的作用。JFrame 在本机操作系统中是以窗口的形式注册的,这么做之后,就可以得到许多熟悉的操作系统窗口的特性:最小化/最大化、改变大小、移动。但是对于本教程的目标来说,把 JFrame 当作放置组件的调色板就足够了。可以在 JFrame 上调用的一些修改属性的方法是:

  • get/setTitle(): 获取/设置帧的标题。
  • get/setState(): 获取/设置帧的最小化、最大化等状态。
  • is/setVisible(): 获取/设置帧的可视状态,换句话说,是否在屏幕上显示。
  • get/setLocation(): 获取/设置帧在屏幕上应当出现的位置。
  • get/setsize(): 获取/设置帧的大小。
  • add(): 将组件添加到帧中。

 简单应用程序

就像所有的“x 入门”教程一样,本教程也包含必不可少的 HelloWorld 演示。但这个示例不仅对观察 Swing 应用程序如何工作有用,还对确保设置正确很有用。一旦使这个简单的应用程序能够成功运行,那么之后的每个示例也将能够运行。下图显示了完成后的示例:

HelloWorld 示例

第一步是创建类。将组件放在 JFrame 上的 Swing 应用程序需要继承JFrame 类,如下所示:

public class HelloWorld extends JFrame

这样做之后,就得到上面描述的所有 JFrame 属性,最重要的是操作系统对窗口的本机支持。下一步是把组件放在屏幕上。在这个示例中,使用了一个 null 布局。在教程的后面部分,您将学到更多关于布局和布局管理器的内容。但对于这个示例,可以用数字表示 JFrame 上的像素位置:

   public HelloWorld()

   {

      super();

      this.setSize(300, 200);

      this.getContentPane().setLayout(null);

      this.add(getJLabel(), null);

      this.add(getJTextField(), null);

      this.add(getJButton(), null);

      this.setTitle("HelloWorld");

   }

 

   private javax.swing.JLabel getJLabel() {

      if(jLabel == null) {

         jLabel = new javax.swing.JLabel();

         jLabel.setBounds(34, 49, 53, 18);

         jLabel.setText("Name:");

      }

      return jLabel;

   }

 

   private javax.swing.JTextField getJTextField() {

      if(jTextField == null) {

         jTextField = new javax.swing.JTextField();

         jTextField.setBounds(96, 49, 160, 20);

      }

      return jTextField;

   }

 

   private javax.swing.JButton getJButton() {

      if(jButton == null) {

         jButton = new javax.swing.JButton();

         jButton.setBounds(103, 110, 71, 27);

         jButton.setText("OK");

      }

      return jButton;

   }

现在组件都放在了 JFrame 上,并且需要在屏幕上显示 JFrame,并让应用程序可以运行。就像在所有的 Java 应用程序中一样,必须添加一个 main 方法,才能让 Swing 应用程序运行。在这个 main 方法中,只需要创建 HelloWorld 应用程序对象,然后调用其setVisible()即可:

 

   public static void main(String[] args)

   {

      HelloWorld w = new HelloWorld();

      w.setVisible(true);

   }

完成了!这就是创建应用程序的所有过程。

 

完整代码如下:

 

package cn.edu.jnu.www;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class HelloWorld extends JFrame{
 private JLabel jLabel;
 private JTextField jTextField;
 private JButton jButton;
 
public HelloWorld()
{
   super();
   this.setSize(300, 200);
   this.getContentPane().setLayout(null);
   this.add(getJLabel(), null);
   this.add(getJTextField(), null);
   this.add(getJButton(), null);
   this.setTitle("HelloWorld");
}

private javax.swing.JLabel getJLabel() {
   if(jLabel == null) {
      jLabel = new javax.swing.JLabel();
      jLabel.setBounds(34, 49, 53, 18);
      jLabel.setText("Name:");
   }
   return jLabel;
}

private javax.swing.JTextField getJTextField() {
   if(jTextField == null) {
      jTextField = new javax.swing.JTextField();
      jTextField.setBounds(96, 49, 160, 20);
   }
   return jTextField;
}

private javax.swing.JButton getJButton() {
   if(jButton == null) {
      jButton = new javax.swing.JButton();
      jButton.setBounds(103, 110, 71, 27);
      jButton.setText("OK");
   }
   return jButton;
}


public static void main(String[] args)
{
   HelloWorld w = new HelloWorld();
   w.setVisible(true);
}

}


附加的swing小部件(上)

JComboBox

在这一节中,我将介绍 Swing 库中的其他全部组件、如何使用它们、它们看起来是什么样的,等等,这部分内容应当让您更好地了解 Swing 为 UI 开发人员提供了什么。

我们从 JComboBox 开始介绍。组合框与下拉选择相似,区别在于使用组合框时用户可以不从列表中选择项目,还可以选择一个(而且只有一个)项目。在某些版本的组合框中,还可以输入自己的选择。浏览器的地址栏就是一个示例:它是一个允许输入自己选项的组合框。以下是 JComboBox 在 Swing 中看起来的样子:

JComboBox

JComboBox 的重要函数包括 JComboBox 包含的数据。需要有一种方法来设置 JComboBox 中的数据、修改数据、在用户选择时得到用户的选择。可以使用以下 JComboBox 方法:

  • addItem():添加一个项目到 JComboBox.
  • get/setSelectedIndex():获取/设置 JComboBox 中选中项目的索引。
  • get/setSelectedItem():获取/设置选中的对象。
  • removeAllItems():从 JComboBox 删除所有对象。
  • remoteItem():从 JComboBox 删除特定对象。

JTextField

JTextField 的一个细微变化是 JPasswordField,它允许您隐藏在文本字段区域中显示的字符。毕竟,在您输入口令的时候,如果每个人都能看到,那可没什么好处?可能根本就不好,而且在私人数据如此脆弱的今天,您需要所有能够得到的帮助。以下是 JPasswordField 在 Swing 中看起来的样子:

JPasswordField

JPasswordField 上额外的“安全性”方法对 JTextField 的行为做了轻微改变,所以不能阅读文本:

  • get/setEchoChar():获取/设置每次字符输入时在 JPasswordField 中显示的字符。在获取口令时,不会返回“回声”,而是返回实际的字符。
  • getText(): 不应当 使用这个函数,因为它会带来可能的安全问题(String 会保存在内存中,可能的堆栈转储会暴露口令)。
  • getPassword():这是从 JPasswordField 中获得口令的恰当方法,因为它返回一个包含口令的 char[]。为了保证恰当的安全性,数组应当被清为 0,以确保它不会保留在内存中。

 




原创粉丝点击