zoukankan      html  css  js  c++  java
  • 《Java从入门到精通》第十三章学习笔记

    第十三章 Swing程序设计

    一、Swing概述

    Swing是GUI(图形用户界面Graphic User Interface)开发工具包,在AWT(抽象窗口工具 Abstract Windows Tool)的基础上使开发跨平台的Java应用程序界面成为可能。使用Swing开发的Java程序,其界面是不受本地系统平台限制的。

    二、Swing常用窗体

    1、JFrame框架窗体

    JFrame窗体是一个容器,它是Swing程序中各个组建的载体,可以通过继承java,swing.JFrame类创建一个窗体,在这个窗体中添加组建,同时为各个组建设置事件(方法)。

    1 JFrame jf=new JFrame(title);        //创建一个标题栏内容为title字符串的JFrame窗体
    2 Container container=jf.getContentPane();      
    3 //通过jf的getContentPan()方法为jf窗体对象转换成一个Container类的容器对象
    4 //对于这个容器,可以通过add()方法为其添加组件,也可以通过remove()方法移除组件
    import java.awt.Color;
    import java.awt.Container;
    
    import javax.swing.*;
    
    public class Example  {
    
        public void CreateJFrame(String title){             
            JFrame jf=new JFrame(title);                //实例化一个JFrame对象
            Container container=jf.getContentPane();    //获取jf的一个容器
            JLabel jl=new JLabel("这是一个JFRAME窗体");        //创建一个标签
            jl.setHorizontalAlignment(SwingConstants.CENTER);    //设置标签文字居中
            container.add(jl);                    //把标签添加到容器中
            container.setBackground(Color.gray);    //设置容器背景颜色
            jf.setVisible(true);        //设置窗体是否可见
            jf.setSize(200,150);         //设置窗体尺寸
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);     //设置窗体关闭方法
        }
        
        public static void main(String args[]){
            new Example().CreateJFrame("创建一个JFrame窗体");
        }
    }

    2、JDialog窗体:是Swing组件中的对话框,继承了AWT组件中的java.awt.Dialog类。其功能是从一个窗体中弹出另一个窗体,JDialog窗体在使用时需要调用getContentPane()方法将其转换为容器,然后在容器中设置相关特性。一般使用如下构造方法:

    public JDialog();   //创建一个没有标题和父窗体的对话框
    public JDialog(Frame f);  //创建一个指定父窗体的对话框,没有标题
    public JDialog(Frame f,boolean model);  //创建一个指定类型的对话框,并指定父窗体,没有标题
    public JDialog(Frame f,String title);  //创建一个父窗体为f标题栏内容为title的对话框
    public JDialog(Frame f,String title,boolean model);//创建一个指定标题、父窗体和指定类型的对话框
     1 import java.awt.*;
     2 import java.awt.event.*;
     3 
     4 import javax.swing.*;
     5 public class Example extends JDialog{
     6     public Example(){
     7         //实例化一个JDialog类对象,指定父窗体,标题和类型
     8         super(new MyFrame(),"第一个JDialog窗体",true);
     9         Container container=getContentPane();        //创建一个容器
    10         container.add(new JLabel("这是一个对话框"));        //在容器中添加标签
    11         setSize(100,100);            //设置对话框窗体大小        
    12     }
    13     public static void main(String[] args){
    14         new Example();
    15     }
    16 }
    17 class MyFrame extends JFrame{        //创建新类
    18     public MyFrame(){
    19         Container container=getContentPane();        //创建一个容器
    20         container.setLayout(null);
    21         JLabel jl=new JLabel("这是一个JFrame窗体");                    //在窗体中设置标签
    22         jl.setHorizontalAlignment(SwingConstants.CENTER);        //标签文字设置居中
    23         container.add(jl);
    24         JButton bl=new JButton("弹出对话框");            //定义一个按钮
    25         bl.setBounds(10,10,100,21);
    26         bl.addActionListener(new ActionListener() {        //为按钮添加鼠标单机事件
    27             public void actionPerformed(ActionEvent e) {
    28                 new Example().setVisible(true);     //使MyJDialog窗体可见
    29             }
    30         });
    31         container.add(bl);      //添加按钮到容器中
    32     }
    33 }

    3、标签组件与图标
    (1)标签的使用:Java中由JLabel类定义标签,父类为JComponent类。一般只显示一行只读文本,一个图像或带图像的文本,并不能产生任何事件,仅仅单纯显示文本和图片。

    public JLabel();    //创建一个不带图标和文本的标签对象
    public JLabel(Icon icon);    //创建一个带图标的JLabel对象
    public JLabel(Icon icon,int alignment);  //创建一个带图标的JLabel对象,并设置图标水平对齐方式
    public JLabel(String string,int alignment);  //创建一个带文本的JLabeil对象,并设置文字水平对齐方式
    public JLabel(String string,Icon icon,int alignment);  //创建一个带文本和图标的JLabeil对象,并设置标签内容水平对齐方式

     (2)图标的使用:Swing中的图标可以设置在按钮、标签等组件上。

    //图标的创建方式,可以通过Icon接口来创建,如果使用该接口,必须实现接口中的三个方法:
    public int getIconHeight();
    public int getIconWidth();
    public void paintIcon(Compent arg0,Graphics arg1,int arg2,int arg3);
     1 import java.awt.*;
     2 import javax.swing.*;
     3 public class DrawIcon implements Icon {
     4     private int width;
     5     private int height;
     6     public int getIconWidth(){
     7         return this.width;
     8     }
     9     public int getIconHeight(){
    10         return this.height;
    11     }
    12     public DrawIcon(int width,int height){
    13         this.width=width;
    14         this.height=height;                
    15     }
    16     public void paintIcon(Component arg0,Graphics arg1,int x,int y){
    17         arg1.fillOval(x,y,width,height);
    18     }
    19 
    20     public static void main(String[] args) {
    21         DrawIcon icon=new DrawIcon(15, 15);
    22         
    23         //创建一个标签,并设置标签上的文字居中
    24         JLabel jl=new JLabel("Test",icon,SwingConstants.CENTER);
    25         JFrame jf=new JFrame();
    26         Container c=jf.getContentPane();
    27     }
    28 
    29 }

    上述通过绘制方法创建图标,也可以使用图片创建,Swing通过javax.swing.ImageIcon类根据图片实现图标,ImageIcon类实现了Icon接口。

    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.net.URL;
    
    import javax.swing.*;
    public class MyImageIcon extends JFrame{
        public MyImageIcon(){
            Container container=getContentPane();
            JLabel jl=new JLabel("这是一个JFrame窗体",JLabel.CENTER);
            URL url=MyImageIcon.class.getResource("1.jpg");
            ImageIcon icon=new ImageIcon(url);
            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();
    
        }
    
    }

     三、常用布局管理器

    Swing提供的常用布局管理器包括流布局管理器、边界布局管理器、网格布局管理器。除使用布局管理器之外也可以使用绝对布局。

    1、绝对布局:即明确指定组件在容器中的位置和大小,步骤如下:

    使用Container.setLayout(null)先取消使用布局管理器;再使用Component.setBounds()方法设置每个组件的大小和位置。

    import java.awt.Container;
    import javax.swing.*;
    public class AbsolutePosition extends JFrame {
        public AbsolutePosition(){
            setTitle("本窗体使用绝对布局");
            setLayout(null);        //使该窗体取消布局管理器设置
            setBounds(0,0,200,150);        //绝对定位窗体的位置和大小
            Container c=getContentPane();        //创建容器对象
            JButton b1=new JButton("按钮1");
            JButton b2=new JButton("按钮2");
            b1.setBounds(100,30,80,30);         //设置按钮的位置和大小
            b2.setBounds(60,70,100,20);
            c.add(b1);
            c.add(b2);
            setVisible(true);        //使窗体可见
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    //设置窗体关闭方式
        }
        public static void main(String[] agrs){
            new AbsolutePosition();
        }
        
    
    }

    2、流(FlowLayout)布局管理器:是布局管理器中最基本的布局管理器,像“流”一样从左到右摆放各个组件,直到占据了这一行的所有空间,然后再向下移动一行。默认情况下,组件在每一行都是居中排列,但这个也可以通过设置更改。常用构造方法如下:
    public FlowLayout();

    public FlowLayout(int alignment);

    public FlowLayout(int alignment,int horizGap,int vertGap);

    构造方法中的alignment参数表示组件在每一行的具体摆放位置,具体可以被赋予三个值:FlowLayout.LEFT=0;FlowLayout.CENTER=1;FlowLayout.RIGHT=2;分别对应左对齐、居中、右对齐。

    horizGap和vertGap分别对应以像素为单位的各组件之间的水平间隔与垂直间隔。

    import java.awt.Container;
    import java.awt.FlowLayout;
    import java.awt.LayoutManager;
    
    import javax.swing.*;
    
    public class FlowLayoutPosition extends JFrame {
        public FlowLayoutPosition(){
            setTitle("本窗体采用流布局管理器");
            Container c=getContentPane();
            //设置窗体使用流布局管理器,使组件用右对齐方式排列,并设置水平间隔10px,垂直间隔10px
            setLayout(new FlowLayout(0,10,10));  //书上代码,为何不行?
            for(int i=0;i<10;i++){
                c.add(new JButton("button"+i));
            }
            setSize(300,200);
            setVisible(true);        //使窗体可见
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
        
        public static void main(String[] agrs){
            new FlowLayoutPosition();
        }
    
    }

    3、边界布局管理:该布局是窗体的默认布局管理器。一般边界布局管理器可以把容器划分为东西南北中五个区域,容器在使用add()方法时可以设置该添加组件在容器中的设置区域。

    import java.awt.BorderLayout;
    import java.awt.Container;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.WindowConstants;
    
    
    public class BorderLayoutPosition extends JFrame {
        String[] border={"Center","North","South","West","East"};
        String[] buttonName={"center button","north button","south button","west button","east button"};
        public BorderLayoutPosition(){
            setTitle("XXX");
            Container c=getContentPane();
            setLayout(new BorderLayout(5,5));
            for(int i=0;i<border.length;i++){
                c.add(border[i],new JButton(buttonName[i]));
            }
            setSize(350,200);
            setVisible(true);        //使窗体可见
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
        
        public static void main(String[] agrs){
            new BorderLayoutPosition();
        }
    
    
    }

    4、网格布局管理器:组件按行和列进行布置,每个组件大小都相同,并且填满整个网格,网格和组件的大小随窗体而编号。

    import java.awt.Container;
    import java.awt.GridLayout;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.WindowConstants;
    
    
    public class GridLayoutPositon extends JFrame {
        public GridLayoutPositon(){
            setTitle("网格布局");
            Container c=getContentPane();
            setLayout(new GridLayout(3,5));    //设置网格为3*5
            for(int i=0;i<19;i++){
                c.add(new JButton("button"+i));
            }
            setSize(300,300);
            setVisible(true);        //使窗体可见
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
        
        public static void main(String[] agrs){
            new GridLayoutPositon();
        }
    }
  • 相关阅读:
    行为型模式之Template Method模式
    【翻译】无需安装Python,就可以在.NET里调用Python库
    SciSharpCube:容器中的SciSharp,.NET机器学习开箱即用
    [翻译] NumSharp的数组切片功能 [:]
    C#
    API做翻页的两种思路
    C#相等性
    C#相等性
    SpringBoot进阶教程(五十八)整合Redis之Sentinel哨兵模式
    org.springframework.cache.interceptor.SimpleKey cannot be cast to java.lang.String
  • 原文地址:https://www.cnblogs.com/tsembrace/p/4662988.html
Copyright © 2011-2022 走看看