第12章-Swing编程 --- Swing概述

(一)Swing概述

  将Swing组件按功能来分:

  ->顶层容器: JFrame、JApplet、JDialog和JWindow

  ->中间容器: JPanel、JScrollPane、JSplitPane、JToolBar等

  ->特殊容器:在用户界面上具有特殊作用的中间容器,如JInternalFrame、JRootPane、JLayeredPane和JDestopPane等

  ->基本组件:实现人机交互的组件,如JButton、JComboBox、JList、JMenu、JSlider等

  ->不可编辑信息的显示组件:向用户显示不可编辑信息的组件,如JLabel、JProgressBar和JToolTip等

  ->可编辑信息的显示组件:向用户显示能被编辑的格式化信息的组件,如JTable、JTextArea和JTextField等

  ->特殊对话框组件:可以直接产生特殊对话框的组件,如JColorChooser和JFileChooser等

Swing 提供了多种独立于各种平台的LAF(Look And Feel),为了获取获取当前JRE所支持的LAF,可以借助于UIManager的getInstalledLookAndFeels()方法,如下程序所示:

import javax.swing.UIManager;

public class AllLookAndFeel
{
    public static void main(String[] args)
    {
        System.out.println("当前系统可用的所有LAF:");
        for(UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels())
        {
            System.out.println(info.getName() + "---->"+info);
        }
    }
}

//运行结果:
当前系统可用的所有LAF:
Metal---->javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel]
Nimbus---->javax.swing.UIManager$LookAndFeelInfo[Nimbus javax.swing.plaf.nimbus.NimbusLookAndFeel]
CDE/Motif---->javax.swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel]
Windows---->javax.swing.UIManager$LookAndFeelInfo[Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel]
Windows Classic---->javax.swing.UIManager$LookAndFeelInfo[Windows Classic com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel] 

下面程序示范了使用Swing组件来创建窗口应用,该窗口里包含了菜单、右键菜单以及基本AWT组件的Swing实现。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SwingComponent
{
    private JFrame f = new JFrame("测试");
    //定义一个按钮,并为之指定图标
    private Icon okIcon = new ImageIcon("ico/ok.png");
    private JButton ok = new JButton("确认",okIcon);
    //定义一个单选按钮,初始处于选中状态
    private JRadioButton male = new JRadioButton("男",true);
    //定义一个单选按钮,初始处于没有选择状态
    private JRadioButton female = new JRadioButton("女",false);
    //定义一个ButtonGroup,用于将上面两个JRadioButton组合在一起
    private ButtonGroup bg = new ButtonGroup();
    //定义一个复选框,初始处于没有选择状态
    private JCheckBox married = new JCheckBox("是否已婚?",false);
    private String[] colors = new String[]{"红色","绿色","蓝色"};
    //定义一个下拉选择框
    private JComboBox<String> colorChooser = new JComboBox<>(colors);
    //定义一个列表选择框
    private JList<String> colorList = new JList<>(colors);
    //定义一个8行、20列的多行文本域
    private JTextArea ta = new JTextArea(8,20);
    //定义一个40列的单行文本域
    private JTextField name = new JTextField(40);
    private JMenuBar mb = new JMenuBar();
    private JMenu file = new JMenu("文件");
    private JMenu edit = new JMenu("编辑");

    //创建"新建"菜单项,并为之指定图标
    private Icon newIcon = new ImageIcon("ico/new.png");
    private JMenuItem newItem = new JMenuItem("新建",newIcon);
    //创建"保存"菜单项,并为之指定图标
    private Icon saveIcon = new ImageIcon("ico/save.png");
    private JMenuItem saveItem = new JMenuItem("保存",saveIcon);
    //创建"退出"菜单项
    private Icon exitIcon = new ImageIcon("ico/exit.png");
    private JMenuItem exitItem = new JMenuItem("退出",exitIcon);
    private JCheckBoxMenuItem autoWrap = new JCheckBoxMenuItem("自动换行 ");
    //创建"复制"菜单项,并为之指定图标
    private JMenuItem copyItem = new JMenuItem("复制",new ImageIcon("ico/copy.png"));
    //创建"粘贴"菜单项,并为之指定图标
    private JMenuItem pasteItem = new JMenuItem("粘贴",new ImageIcon("ico/paste.png"));
    private JMenu format = new JMenu("格式");
    private JMenuItem commentItem = new JMenuItem("注释");
    private JMenuItem cancelItem = new JMenuItem("取消注释");
    //定义一个右键菜单用于设置程序风格
    private JPopupMenu pop = new JPopupMenu();
    //用于组合3个风格菜单项的ButtonGroup
    private ButtonGroup flavorGroup = new ButtonGroup();
    //创建5个单选按钮,用于设定程序的外观风格
    private JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem("Metal风格",true);
    private JRadioButtonMenuItem nimbusItem = new JRadioButtonMenuItem("Nimbus风格");
    private JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem("Windows风格");
    private JRadioButtonMenuItem classicItem = new JRadioButtonMenuItem("Windows经典风格");
    private JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem("Motif风格");

    //用于执行界面初始化的init方法
    public void init()
    {
        //创建一个装载文本框、按钮的JPanel
        JPanel bottom = new JPanel();
        bottom.add(name);
        bottom.add(ok);
        f.add(bottom,BorderLayout.SOUTH);
        //创建一个装载了下拉选择框、三个JCheckBox的JPanel
        JPanel checkPanel = new JPanel();
        checkPanel.add(colorChooser);
        bg.add(male);
        bg.add(female);
        checkPanel.add(male);
        checkPanel.add(female);
        checkPanel.add(married);
        //创建一个垂直排列组件的Box,盛装多行文本域JPanel
        Box topLeft = Box.createVerticalBox();
        //使用JScrollPane作为普通组件的JViewPort
        JScrollPane taJsp = new JScrollPane(ta);
        topLeft.add(taJsp);
        topLeft.add(checkPanel);
        //创建一个水平排列组件的Box,盛装topLeft、colorList
        Box top = Box.createHorizontalBox();
        top.add(topLeft);
        top.add(colorList);
        //将top Box容器添加到窗口的中间
        f.add(top);

        //下面开始组合菜单,并为菜单添加监听器
        //为newItem设置快捷键,设置快捷键时要使用大写字母
        newItem.setAccelerator(KeyStroke.getKeyStroke(‘N‘,InputEvent.CTRL_MASK));

        newItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e)
            {
                ta.append("用户单击了  新建 菜单\n");
            }
        });

        //为file菜单添加菜单项
        file.add(newItem);
        file.add(saveItem);
        file.add(exitItem);
        //为edit菜单添加菜单项
        edit.add(autoWrap);
        //使用addSeparator方法添加菜单分隔线
        edit.addSeparator();
        edit.add(copyItem);
        edit.add(pasteItem);
        //为commentItem组件添加提示信息
        commentItem.setToolTipText("将程序代码注释起来");
        //为format菜单添加菜单项
        format.add(commentItem);
        format.add(cancelItem);
        //使用添加new JMenuItem("-")的方式不能添加菜单分隔符
        edit.add(new JMenuItem("-"));
        //将format菜单组合到edit菜单中,从而形成二级菜单
        edit.add(format);
        //将file、edit菜单添加到mb菜单条中
        mb.add(file);
        mb.add(edit);
        //为f窗口设置菜单条
        f.setJMenuBar(mb);

        //下面开始组合右键菜单,并安装右键菜单
        flavorGroup.add(metalItem);
        flavorGroup.add(nimbusItem);
        flavorGroup.add(windowsItem);
        flavorGroup.add(classicItem);
        flavorGroup.add(motifItem);
        pop.add(metalItem);
        pop.add(nimbusItem);
        pop.add(windowsItem);
        pop.add(classicItem);
        pop.add(motifItem);
        //为5个风格菜单创建事件监听器
        ActionListener flavorListener = new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                try
                {
                    switch(e.getActionCommand())
                    {
                        case "Metal风格":
                        {
                            changeFlavor(1);
                            break;
                        }

                        case "Nimbus风格":
                        {
                            changeFlavor(2);
                            break;
                        }

                        case "Windows风格":
                        {
                            changeFlavor(3);
                            break;
                        }

                        case "Windows经典风格":
                        {
                            changeFlavor(4);
                            break;
                        }

                        case "Motif风格":
                        {
                            changeFlavor(5);
                            break;
                        }
                    }
                }
                catch(Exception ee)
                {
                    ee.printStackTrace();
                }
            }
        };

        //为5个风格菜单项添加事件监听器
        metalItem.addActionListener(flavorListener);
        nimbusItem.addActionListener(flavorListener);
        windowsItem.addActionListener(flavorListener);
        classicItem.addActionListener(flavorListener);
        motifItem.addActionListener(flavorListener);

        //调用该方法即可设置右键菜单,无须使用事件机制
        ta.setComponentPopupMenu(pop);
        //设置关闭窗口时,退出程序
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

    //定义一个方法,用于改变界面风格
    private void changeFlavor(int flavor) throws Exception
    {
        switch(flavor)
        {
            //设置Metal风格
            case 1:
            {
                UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                break;
            }

            //设置Nimbus风格
            case 2:
            {
                UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
                break;
            }

            //设置windows风格
            case 3:
            {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                break;
            }

            //设置windows经典风格
            case 4:
            {
                UIManager.setLookAndFeel("Classic com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
                break;
            }

            //设置Motif风格
            case 5:
            {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                break;
            }
        }

        //更新f窗口内顶级容器以及内部所有组件的UI
        SwingUtilities.updateComponentTreeUI(f.getContentPane());
        //更新mb菜单条以及内部所有组件的UI
        SwingUtilities.updateComponentTreeUI(mb);
        //更新pop右键菜单以及内部所有组件的UI
        SwingUtilities.updateComponentTreeUI(pop);
    }

    public static void main(String[] args)
    {
        //设置Swing窗口视野JAVA风格
        new SwingComponent().init();
    }
}

第12章-Swing编程 --- Swing概述

时间: 2024-10-27 08:40:22

第12章-Swing编程 --- Swing概述的相关文章

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

Python for Infomatics 第12章 网络编程一(译)

注:以下文章原文来自于Dr Charles Severance 的 <Python for Informatics> 本书中的许多例子关注的是从读取文件并查找数据,但在互联网中还有许多不同信息源. 本章我们将伪装成浏览器用超文本传送协议(HTTP)从网站获取网页,通读并分析它. 12.1 超文本传送协议-HTTP 支撑网页运转的网络协议实际非常简单,在Python中内置了套接字(socket)模块,使得使用套接字创建网络连接并获取数据变得非常容易. 套接字最很像文件,可以对它进行读写,但它还提

Python for Infomatics 第12章 网络编程三(译)

注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 urllib库一项最常用的功能是抓取网页.就是我们编写一个程序,将自己伪装成网页浏览器,在获取网页之后,再以查找模式检索网页中的数据. 以搜索引擎Google为例,它将查看一个网页的源码,然后抽取其中的链接,再用这些链接获取网页.抽取链接,并一直循环.使用这个技巧,Google几乎爬遍网页上的所有页面. G

Python for Infomatics 第12章 网络编程四(译)

注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.7 用BeautifulSoup分析HTML 有很多Python库可以帮你分析HTML和抓取数据.每个库都有它们各自的强项和弱点,你可以基于你的需求选择一个. 下面的例子,我们将使用BeautifulSoup来分析一些HTML的输入,并抓取链接信息.你可以从www.crummy.com下载和安装BeautifulSoup代码.你可以在

Python for Infomatics 第12章 网络编程二(译)

注:以下文章原文来自于Dr Charles Severance 的 <Python for Informatics> 12.3 用HTTP协议获取一张图片 在上一节的例子中,我们获取的是一个有换行符的文本文件,并简单的把它显示在屏幕上.同样我们可以用一个小程序通过HTTP协议获取图片.下面这个程序运行时,不是直接在屏幕上显示数据,而是剔除头信息,然后将收到的数据合并保存为一个图片文件.具体代码如下: import socket import time mysock = socket.socke

第12章Swing编程

第12章Swing编程 Swing它采用100%java实现 不在依赖本地平台,所有平台都可以保持相同的运行效果,对跨平台支持比较出色  实现了MVC设计模式也称为Model-Delegate(模式-代理) 12.1 Swing概况 独立于本地平台的Swing(速度慢点)组件被称为轻量级组件,而依赖本地平台的AWT组件被称为重量级组件 12.2 Swing 基本组件的用法 12.2.1 Swing 组件层次 大部分Swing组件都是JComponent抽象类的直接或者间接子类,JComponen

第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条

第12章-Swing编程 --- 使用JProgressBar.ProgressMonitor和BoundedRangeModel创建进度条 (一)创建进度条 使用JProgressBar,可以很方便的创建进度条,其步骤如下: (1)创建一个JProgressBar对象,创建该对象时也可以指定3个参数,用于设置进度条的排列方向(竖直和水平).进度条的最大值和最小值.也可以在创建该对象时不传入任何参数,而是在后面程序中修改这3个属性. 下面代码创建了JProgressBar对象 //创建一条垂直进

第12章-Swing编程 --- 使用JToolBar创建工具条

Swing提供了JToolBar类来创建工具条,创建JToolBar对象时可以指定如下两个参数: -->name: 该参数指定该工具条的名称. -->orientation:该参数指定该工具条的方法. JToolBar对象还有如下几个常用方法: -->JButton add(Action a): 通过Action对象为JToolBar添加对应的工具按钮. -->void addSeparator(Dimension size):向工具条中添加指定大小的分隔符. -->void

第12章-Swing编程 --- 使用JOptionPane

通过使用JOptionPane可以非常方便的创建一些简单的对话框. JOptionPane提供了如下3个方法来创建对话框: (1)showMessageDialog/showInternalMessageDialog:消息对话框,告知用户某事已发生,用户只能单击"确认"按钮. (2)showConfirmDialog/showInternalMessageDialog:确认对话框,向用户确认某个问题,用户可以选择 yes.no.cancel等选项. (3)showInputDialog