Java图形界面编程

一:基本概念

  AWT(Abstract Window Toolkit)    

    抽象窗口工具包,SUN 公司提供的用于图形界面编程(GUI)的类库。但是AWT得实现严重依赖于下层操作系统,所以导致组件AWT的外观取决于程序运行的平台。AWT的类和接口都定义在java.awt包中。

  Swing

     Swing组件是实在AWT基础上开发的新型GUI组件,它是纯Java实现的轻量级(light-weight)组件,它不依赖任何特定平台,Swing组件在不同平台具有一致性的表现,但是Swing应用程
序的界面外观不再和原生应用程序的外观相似。而且消耗太多的内存,这样Swing不适于一些小设备.
    Swing 采用了MVC(模型-视图-控制,Model-View-Controller)设计模式。 

    Swing的视图部分有两个基本元素组成:容器和组件

    组件:独立的可视化控件。常用到的组件:按钮(类JButton)、单选按钮(类JRadioButton)、复选框(类JCheckBox)、组合框(类JComboBox)、列表框(类JList)、文本字段(类JTextField)、纯文本区(类JTextArea)等等。

    容器:是一种设计用来存放其它组件的特殊类型组件。常用到的容器:窗体(JFrame)、对话框(JDialog)、面板(JPanel)、Panel等等。

  布局管理器    

     定义容器中组件摆放位置和大小接口.

    AWT 中的五种布局管理器边界布局管理器(BorderLayout)、流式布局管理器(FlowLayout)、网格布局管理器(GridLayout)、卡片布局管理器(CardLayout)、网格包布局管理器(GridBagLayout).

       窗体(JFrame,JDialog)的默认布局为 BorderLayout(边界布局管理器)

        面板()的默认布局管理器是 FlowLayout(流式布局管理器)

二:常用类和方法

  JFrame

  JFrame类是一个顶层窗口,也是一个容器,允许将其他组件添加到它里面,把它们组织起来,并把它们呈现给用户。

  常用构造方法:

    •   JFrame():可以创建一个无标题的窗口。
    •   JFrame(String title):创建一个标题为title的窗口

  常用方法:

    •   getTitle()/setTitle():获取/设置窗口的标题。
    •   getState/setState():获取/设置窗口的最小化、最大化等状态。
    •   isVisible()/setVisible():获取/设置窗口的可视状态(即是否在屏幕上显示)。
    •   getLocation/setLocation():获取/设置窗口在屏幕上应当出现的位置。
    •   getSize()/setSize():获取/设置窗口的大小。
    •   setBounds():获取/设置窗口出现在屏幕上时的初始位置与大小。
    •   setResizable():设置窗口是否可调整大小,窗口默认是可调整大小的。
    •   add():将组件添加到窗口中。
    •   setDefaultCloseOperation() :设置单击窗体右上角的关闭图标后,程序会做出怎样的处理。 

  JTextField

  单行文本框,用来建立文本框的组件,用户可以在文本框中输入单行的文本。

  常用构造方法:

    •   JTextField(int x):创建文本框对象,可以在文本框中输入若干个字符,文本框的可见字符个数由参数x指定。

    •   JTextField(String s):创建文本框对象,则文本框的初始字符串为s,可以在文本框中输入若干个字符。

  常用方法:

    •   public void setText(String text):设置文本框中的文本为参数text指定的文本。
    •   public String getText():获取文本框中的文本。
    •   public void setEditable(boolean b):指定文本框的可编辑性(默认为true-可编辑的)。
    •   public void setHorizontalAlignment(int alignment):设文本在文本框中的对齐方式,其中alignment的有效值确定对齐方式,如:LEFT、CENTER、RIGHT。

  

  JPasswordField

  密码框,用于接收密码信息,输入的文本不会以明文形式显示出来。

  常用方法:

    •   setEchoChar(char echoChar):设置回显字符(默认的回显字符是‘*’)。
    •   char[] getPassword():获取密码框中的密码。

  

  JTextArea

  多行文本框,用户可以在文本区输入多行的文本。

  常用构造方法:

    •   JTextArea(int rows, int columns):构造一个可见行和可见列分别是rows、columns的文本区。

  常用方法:

    •   setLineWrap(boolean b):决定输入的文本能否在文本区的右边界自动换行。
    •   setWrapStyleWord(boolean b):决定是以单词为界(b取true时)或以字符为界(b取false时)进行换行。
    •   getText():获取文本区的文本。
    •   setText(String text):设置文本内容。
    •   append(String text):尾部加文本。
    •   insert(String text,int index):在文本区的指定位置处插入文本。
    •   public void copy():拷贝选定的区域。
    •   public void cut():剪切选定的区域。
    •   public void paste():在指定的区域粘贴。

  JButton

  按钮组件,常用构造方法:

    •   public JButton(String text):创建名字是text的按钮。
    •   public JButton(Icon icon):创建带有图标icon的按钮。
    •   public JButton(String text, Icon icon):创建名字是text且带有图标icon的按钮。

  常用方法:

    •   public String getText():获取当前按钮上的名字。
    •   public void setText(String text):重新设置当前按钮的名字,名字由参数text指定。
    •   public Icon getIcon():获取当前按钮上的图标。
    •   public void setIcon(Icon icon):重新设置当前按钮上的图标。
    •   public void setHorizontalTextPosition(int textPosition):设置按钮名字相对按钮上图标的水平位置。
    •   public void setVerticalTextPosition(int textPosition):设置按钮上名字相对按钮上图标的垂直位置。
    •   public void addActionListener(ActionListener):按钮对象调用该方法可以向按钮增加动作监视器。
    •   public void removeActionListener(ActionListener):按钮对象调用该方法可以移去按钮上的动作监视器。

  JLabel

  标签组件,一般用来显示信息,但没有编辑功能。

  常用构造方法:

    •   public JLabel():创建空标签对象。
    •   public JLabel(String text):创建带文本的标签对象。
    •   public JLabel(String text, int aligment):创建带文本的标签对象,并设置文本对齐方式

  常用方法:

    •   String getText():获取标签的名字。
    •   void setText(String s):设置标签的名字。

  JCheckBox

  复选框,提供两种状态,一种是选中,另一种是未选中,用户通过单击该组件切换状态。如果不对复选框进行初始化设置,默认的初始化设置均为未选中。

  常用构造方法:

    •   public JCheckBox():创建一个没有名字的复选框。
    •   public JCheckBox(String text):创建一个名字是text的复选框。

  常用方法:

    • public void setSelected(boolean b):设置按钮状态--是否选中
    • public boolean isSelected():如果复选框处于选中状态该方法返回true,否则返回false。 

 

三:事件处理

  事件和事件源:

  事件:当用户在界面上执行一个操作,例如按下键盘、拖动或者单击鼠标时,都将产生一个事件。Java中事件是用来描述不同类型用户操作的对象,Java中有很多不同类型的事件。例如:单击,双击,右击,拖动,键盘的按下、释放,文本域内容改变等。

  事件源:产生事件的组件就是一个事件源。例如,当在一个Button上单击鼠标是,将产生一个ActionEvent类型的事件,而这个Button就是事件源。
 事件驱动模型的三大要素:
    •   事件源:能够接收外部事件的源体。
    •   监听器:能够接收事件源通知的对象。
    •   事件处理程序:用于处理事件的对象。

 

四:示例代码

  1 import java.awt.GridLayout;
  2 import java.awt.event.ActionEvent;
  3 import java.awt.event.ActionListener;
  4 import javax.swing.JButton;
  5 import javax.swing.JFrame;
  6 import javax.swing.JLabel;
  7 import javax.swing.JOptionPane;
  8 import javax.swing.JPasswordField;
  9 import javax.swing.JTextField;
 10 
 11 /**
 12  * java图形界面编程演示,以登录为例
 13  * 
 14  * @author
 15  *
 16  */
 17 public class LoginFrame extends JFrame implements ActionListener {
 18 
 19     private JTextField username; // 用户名
 20     private JPasswordField password; // 密码
 21     private JButton login; // 登录
 22     private JButton cancel; // 取消
 23 
 24     public LoginFrame(String title) {
 25         setTitle(title);
 26         // 设置大小
 27         setSize(200, 100);
 28         // 设置居中
 29         setLocationRelativeTo(null);
 30         // 退出应用程序
 31         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 32         // 不允许修改窗口大小
 33         setResizable(false);
 34 
 35         // 生成界面
 36         generateInterface();
 37 
 38         // 注册监听器:匿名内部类
 39         // registerListener();
 40 
 41         // 设置窗体可见
 42         setVisible(true);
 43     }
 44 
 45     /**
 46      * 生成界面
 47      */
 48     private void generateInterface() {
 49         username = new JTextField();
 50         password = new JPasswordField();
 51         login = new JButton("登录");
 52 
 53         /* 注册监听器的方式 */
 54 
 55         // 普通类,实现XxxListener接口
 56         // login.addActionListener(new Listener(username, password));
 57 
 58         // 成员内部类,实现XxxListener接口
 59         // login.addActionListener(new Listener()); // 成员内部类
 60 
 61         // 当前类实现XxxListener接口
 62         login.addActionListener(this);
 63 
 64         cancel = new JButton("取消");
 65         cancel.addActionListener(this);
 66 
 67         JLabel uname = new JLabel("用户名:");
 68         JLabel upwd = new JLabel("密 码:");
 69 
 70         setLayout(new GridLayout(3, 2));
 71 
 72         this.add(uname);
 73         this.add(username);
 74         this.add(upwd);
 75         this.add(password);
 76         this.add(login);
 77         this.add(cancel);
 78     }
 79 
 80     /**
 81      * 成员内部类实现ActionListener
 82      * 
 83      * @author
 84      *
 85      */
 86     class Listener implements ActionListener {
 87         @Override
 88         public void actionPerformed(ActionEvent e) {
 89             String uname = username.getText();
 90             String upwd = new String(password.getPassword());
 91             if ("admin".equals(uname) && "123456".equals(upwd)) {
 92                 // 消息框
 93                 JOptionPane.showMessageDialog(null, "登录成功");
 94             } else {
 95                 // 消息框
 96                 JOptionPane.showMessageDialog(null, "用户名或密码错误");
 97             }
 98         }
 99     }
100 
101     /**
102      * 匿名内部类实现ActionListener
103      */
104     private void registerListener() {
105         // 匿名内部类
106         login.addActionListener(new ActionListener() {
107             @Override
108             public void actionPerformed(ActionEvent e) {
109                 String uname = username.getText();
110                 String upwd = new String(password.getPassword());
111                 if ("admin".equals(uname) && "123456".equals(upwd)) {
112                     // 消息框
113                     JOptionPane.showMessageDialog(null, "登录成功");
114                 } else {
115                     // 消息框
116                     JOptionPane.showMessageDialog(null, "用户名或密码错误");
117                 }
118             }
119         });
120     }
121 
122     /**
123      * 本类实现ActionListener
124      */
125     @Override
126     public void actionPerformed(ActionEvent e) {
127         JButton btn = (JButton) e.getSource();
128         if ("登录".equals(btn.getText())) {
129             JOptionPane.showMessageDialog(null, "你点击了登录");
130         } else {
131             JOptionPane.showMessageDialog(null, "你点击了取消");
132         }
133     }
134 
135     public static void main(String[] args) {
136         LoginFrame frame = new LoginFrame("登录");
137     }
138 }
139 
140 /**
141  * 外部类实现ActionListener
142  * 
143  * @author
144  *
145  */
146 class Listener implements ActionListener {
147 
148     private JTextField username;
149     private JPasswordField password;
150 
151     public Listener(JTextField username, JPasswordField password) {
152         super();
153         this.username = username;
154         this.password = password;
155     }
156 
157     @Override
158     public void actionPerformed(ActionEvent e) {
159         String uname = username.getText();
160         String upwd = new String(password.getPassword());
161         if ("admin".equals(uname) && "123456".equals(upwd)) {
162             // 消息框
163             JOptionPane.showMessageDialog(null, "登录成功");
164         } else {
165             // 消息框
166             JOptionPane.showMessageDialog(null, "用户名或密码错误");
167         }
168     }
169 }
原文地址:https://www.cnblogs.com/renchang/p/4490489.html