《JAVA:从入门到精通》part 14

十七、Swing程序设计(一)

1. Swing概述

  • 原来的AWT组件来自java.awt包,当含有AWT组件的java应用程序在不同的平台上执行时,每个平台的GUI组件显示会有所不同,但是在不同平台上运行使用Swing开发的应用程序时,就可以统一GUI组件的风格,因为Swing组件允许编程人员在跨平台时指定统一的外观风格。

  • Swing组件通常被称为“轻量级组件”,因为它完全用JAVA语言编写,而JAVA是不依赖操作系统的语言,它可以在任何平台上运行;相反,依赖于本地平台的组件被称为“重量级组件”,如AWT组件就是依赖本地平台的窗口系统来决定组件的功能、外观和风格。


    窗体组件类结构

常用的Swing组件

组件名称 定义
JButton 代表Swing按钮,按钮可以带一些图片或文字
JCheckBox 代表Swing中的复选框组件
JComBox 代表下拉列表框,可以在下拉显示区域显示多个选项
JFrame 代表Swing框架类
JDialog 代表Swing版本的对话框
JLabel 代表Swing中的标签组件
JRadioButton 代表Swing的单选按钮
JList 代表能够在用户界面中显示一系列条目的组件
JTextField 代表文本框
JPasswordField 代表密码框
JTextArea 代表Swing中的文本区域
JOptionPane 代表Swing中的一些对话框

2. 常用窗体

JFrame窗体

  • JFrame窗体是一个容器,它是Swing程序中各个组件的载体,可以将JFrame看作是承载这些Swing组件的容器。在开发应用程序时可以通过继承java.swing.JFrame类创建一个窗体,在这个窗体中添加组件,同时为组件设置事件。由于该窗体继承了JFrame类,所以它拥有“最大化”“最小化”“关闭”等按钮。

  • JFrame在程序的语法格式如下:

JFrame jf=new JFrame(title);
Container container=jf.getContentPane();
container.add(new JButton("按钮"));    //JButton按钮组件
container.remove(new JButton("按钮"));    //删除按钮组件

创建JFrame窗体实例:

package lianxi3;
import java.awt.*;

import javax.swing.*;

public class Example1 extends JFrame {
    private static final long serialVersionUID = 1L;

    // 定义一个类继承JFrame类
    public void CreateJFrame(String title) { // 定义一个CreateJFrame()方法
        JFrame jf = new JFrame(title); // 实例化一个JFrame对象
        Container container = jf.getContentPane(); // 获取一个容器
        JLabel jl = new JLabel("这是一个JFrame窗体"); // 创建一个JLabel标签
        // 使标签上的文字居中
        jl.setHorizontalAlignment(SwingConstants.CENTER);
        container.add(jl); // 将标签添加到容器中
        container.setBackground(Color.white);//设置容器的背景颜色
        jf.setVisible(true); // 使窗体可视
        jf.setSize(200, 150); // 设置窗体大小
        // 设置窗体关闭方式
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String args[]){//在主方法中调用createJFrame()方法
        new Example1().CreateJFrame("创建一个JFrame窗体");
    }
}

运行结果:

  • 创建窗体后,需要给予窗体一个关闭方式,可以调用setDefaultCloseOperation()方法关闭窗体。JAVA为窗体关闭提供了多种方式,常用的有:DO_NOTHING_ON_CLOSE、DISPOSE_ON_CLOSE、HIDE-ON_CLOSE、EXIT_ON_CLOSE。

JDialog窗体

  • JDialog窗体的功能是从一个窗体中弹出另外一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。JDialog窗体实质上就是另一种类型的窗体,它与JFrame窗体类似,在使用时也需要调用getContentPane()方法将窗体转换为容器,然后在容器中设置窗体的属性。

创建JDialog窗体实例:

package com.lzw;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

class MyJDialog extends JDialog { // 创建新类继承JDialog类

    private static final long serialVersionUID = 1L;

    public MyJDialog(MyFrame frame) {
        // 实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型
        super(frame, "第一个JDialog窗体", true);
        Container container = getContentPane(); // 创建一个容器
        container.add(new JLabel("这是一个对话框")); // 在容器中添加标签
        setBounds(120, 120, 100, 100); // 设置对话框窗体大小
    }
}

public class MyFrame extends JFrame { // 创建新类

    private static final long serialVersionUID = 1L;

    public static void main(String args[]) {
        new MyFrame(); // 实例化MyJDialog类对象
    }
    
    public MyFrame() {
        Container container = getContentPane(); // 创建一个容器
        container.setLayout(null);
        JLabel jl = new JLabel("这是一个JFrame窗体"); // 在窗体中设置标签
        // 将标签的文字置于标签中间位置
        jl.setHorizontalAlignment(SwingConstants.CENTER);
        container.add(jl);
        JButton bl = new JButton("弹出对话框"); // 定义一个按钮
        bl.setBounds(10, 10, 100, 21);
        bl.addActionListener(new ActionListener() { // 为按钮添加鼠标单击事件
                    public void actionPerformed(ActionEvent e) {
                        // 使MyJDialog窗体可见
                        new MyJDialog(MyFrame.this).setVisible(true);
                    }
                });
        container.add(bl); // 将按钮添加到容器中
        
        container.add(bl);
        container.setBackground(Color.white);
        setSize(200, 200);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        setVisible(true);
    }
}

运行结果:

  • 由本实例可以看到,JDialog窗体与JFrame窗体形式基本相同,甚至在设置窗体的特性时调用的方法名称都基本相同,如设置窗体大小、窗体关闭状态等。

3. 标签组件与图标

  • 在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。在应用程序的用户界面中,一个简短的文本标签可以使用户知道这些组件的目的,所以标签在Swing中是比较常用的组件。

标签的使用

  • public JLabel():创建一个不带图标和文本的JLabel对象
  • public JLabel(Icon icon):创建一个带图标的JLabel对象
  • public JLabel(Icon icon,int aligment):创建一个带图标的JLabel对象,并设置图标水平对齐方式
  • public JLabel(String text,int aligment):创建一个带文本的JLabel对象,并设置文字水平对齐方式
  • public JLabel(String text,Icon icon,int aligment):创建一个带文本、带图标的JLabel对象,并设置标签内容的水平对齐方式

图标的使用

  • 直接使用程序案例说明更加容易理解:

创建图标:

package com.lzw;

import java.awt.*;

import javax.swing.*;

public class DrawIcon implements Icon { // 实现Icon接口
    private int width; // 声明图标的宽
    private int height; // 声明图标的长

    public int getIconHeight() { // 实现getIconHeight()方法
        return this.height;
    }

    public int getIconWidth() { // 实现getIconWidth()方法
        return this.width;
    }

    public DrawIcon(int width, int height) { // 定义构造方法
        this.width = width;
        this.height = height;
    }

    // 实现paintIcon()方法
    public void paintIcon(Component arg0, Graphics arg1, int x, int y) {
        arg1.fillOval(x, y, width, height); // 绘制一个圆形
    }

    public static void main(String[] args) {
        DrawIcon icon = new DrawIcon(15, 15);
        // 创建一个标签,并设置标签上的文字在标签正中间
        JLabel j = new JLabel("测试", icon, SwingConstants.CENTER);
        JFrame jf = new JFrame(); // 创建一个JFrame窗口
        Container c = jf.getContentPane();
        c.add(j);
        jf.setSize(100,100);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

运行结果:

使用图片图标:

package com.lzw;
import java.awt.*;
import java.net.*;

import javax.swing.*;

public class MyImageIcon extends JFrame {

    private static final long serialVersionUID = 1L;

    public MyImageIcon() {
        Container container = getContentPane();
        // 创建一个标签
        JLabel jl = new JLabel("这是一个JFrame窗体", JLabel.CENTER);
        // 获取图片所在的URL
        URL url = MyImageIcon.class.getResource("imageButton.jpg");
        Icon icon = new ImageIcon(url); // 实例化Icon对象
        jl.setIcon(icon); // 为标签设置图片
        // 设置文字放置在标签中间
        jl.setHorizontalAlignment(SwingConstants.CENTER);
        jl.setOpaque(true); // 设置标签为不透明状态
        container.add(jl); // 将标签添加到容器中
        setSize(250, 100); // 设置窗体大小
        setVisible(true); // 使窗体可见
        // 设置窗体关闭模式
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String args[]) {
        new MyImageIcon(); // 实例化MyImageIcon对象
    }
}

运行结果:

  • java.lang.Class类中的getResource()方法可以获取资源文件的URL路径。上例中该方法的参数是imageButton.jpg,这个路径是相对于MyImageIcon类文件的,所以可将imageButton.jpg图片文件与MyImageIcon类文件放在同一个文件夹下。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • java是面向过程的编程语言:Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越...
    Java小辰阅读 3,050评论 0 17
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,219评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,049评论 0 4
  • Swing 是一个为Java设计的GUI工具包。 Swing是JAVA基础类的一部分。 Swing包括了图形用户界...
    chenzg8080阅读 1,348评论 0 3
  • Java基础常见英语词汇(共70个)['ɔbdʒekt] ['ɔ:rientid]导向的 ...
    今夜子辰阅读 3,281评论 1 34