zoukankan      html  css  js  c++  java
  • java图形化Swing教程(一)

    与多线程、泛型等不同,Swing主要在于使用。
    以下主要放代码和凝视。少说话。

    (一)基本框架

    package Swing;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * 
     * @author QuinnNorris
     * 基本框架
     */
    public class FrameTest {
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            // 开启一个线程,全部的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
            EventQueue.invokeLater(new Runnable() {
                // 匿名内部类。是一个Runnable接口的实例,实现了run方法
                public void run() {
    
                    SimpleFrame frame = new SimpleFrame();
                    // 创建以下自定义的SimpleFrame类对象。以便于调用构造器方法
    
                    frame.setExtendedState(Frame.MAXIMIZED_BOTH);
                    // 将窗体最大化
                    // 其它可选属性:Frame.NORMAL ICONIFIED MAXIMIZED_HORIZ MAXIMIZED_VERT
                    // MAXIMIZED_BOTH
    
                    frame.setTitle("Christmas");
                    // 设置窗体标题
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    // 选择当用户关闭框架时进行的操作 。在有些时候须要将窗体隐藏,不能直接退出须要用到这种方法
    
                    frame.setVisible(true);
                    // 将窗体可见化,这样以便用户在第一次看见窗体之前我们能够向当中加入内容
                }
    
            });
        }
        // main结束时,程序并没有结束,而是结束了主线程。知道全部框架关闭或者调用了 System.exit事才终止程序
    }
    
    class SimpleFrame extends JFrame {
        public SimpleFrame() {
    
            Toolkit kit = Toolkit.getDefaultToolkit();
            // 改动窗体在屏幕上面的位置。改变窗体大小
            // Toolkit类包含非常多与本地窗体交互的方法
    
            Dimension screenSize = kit.getScreenSize();
            // Toolkit的获取频幕大小的方法返回一个Dimension的类对象
    
            setSize((int) (screenSize.getWidth()), (int) (screenSize.getHeight()));
            // setBounds(0,0,(int)(screenSize.getWidth()),(int)(screenSize.getHeight()));
            // 定义窗体的位置和大小
            // setLocation(0,0); 定位窗体距离左上角的位置
            // setLocationByPlatform(true); 让窗体系统控制窗体位置,距离上一个窗体非常小的偏移量
    
            // 用图片来替换窗体图标
            Image img = new ImageIcon("D:/icon.png").getImage();
            setIconImage(img);
    
        }
    }

    输出结果:一个充满整个屏幕的框体。标题栏名字叫做Christmas,图表是自己填充的图片。

    (二)输出文字

    package Swing;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     * 
     * @author QuinnNorris
     * 输出文字
     */
    public class HelloWorld {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            // 开启一个线程,全部的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件
            EventQueue.invokeLater(new Runnable() {
                // 匿名内部类。是一个Runnable接口的实例,实现了run方法
                public void run() {
    
                    JFrame frame = new HelloWorldFrame();
                    // HelloworldFrame在以下定义,继承了JFrame,使用当中的构造器方法
    
                    frame.setTitle("HelloWrold");
                    // 设置标题
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    // 选择当用户关闭框架时进行的操作 。在有些时候须要将窗体隐藏。不能直接退出须要用到这种方法
    
                    frame.setVisible(true);
                    // 将窗体可见化。这样以便用户在第一次看见窗体之前我们能够向当中加入内容
                }
            });
    
        }
    
    }
    
    // 编写继承了JFrame的类,我们的工作在这里进行
    class HelloWorldFrame extends JFrame {
        public HelloWorldFrame() {
    
            add(new HelloWorldComponent());
            //向当中加入一个实例化的实现JComponent类的子类
    
            pack();
            //调用框架组件的首选大小,或者我们能够用SetSize方法来替换它
        }
    }
    
    class HelloWorldComponent extends JComponent {
        public static final int MESSAGE_X = 75;
        public static final int MESSAGE_Y = 100;
    
        private static final int DEFAULT_WIDTH = 300;
        private static final int DEFAULT_HEIGHT = 200;
    
        /**
         * 我们覆盖了这个以用来书写内容
         * 
         * @param g
         *            Graphics对象保存着用于绘制图像和文本的设置
         */
        public void paintComponent(Graphics g) {
            g.drawString("Hello World!", MESSAGE_X, MESSAGE_Y);
            // 參数:书写内容。字符串中第一个字符位于从左向右75像素,字符串中第一个字符从上向下100像素
        }
    
        /**
         * 我们覆盖了这种方法来表示出这个类的组件的大小
         * 
         * @return 返回这个类的组件本身应该有多大
         */
        public Dimension getPreferredSize() {
            return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            // 返回一个Dimension对象,表示这个组件的大小
        }
    }
    

    输出结果:位于左上角的名字叫做HelloWrold的小窗体,在窗体中部有“Hello World!”字样。

    (三)打印图形

    package Swing;
    
    import java.awt.EventQueue;
    
    import javax.swing.*;
    
    import java.awt.*;
    import java.awt.geom.*;
    
    /**
     * 
     * @author QuinnNorris
     * 打印图形
     */
    public class DrawTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            // 开启一个线程。全部的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
            EventQueue.invokeLater(new Runnable()
            {
                // 匿名内部类,是一个Runnable接口的实例。实现了run方法
                public void run(){
    
                    JFrame frame = new DrawFrame();
                    // 创建以下自定义的SimpleFrame类对象。以便于调用构造器方法
    
                    frame.setTitle("DrawTest");
                    // 设置标题
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    // 选择当用户关闭框架的时候进行的操作 。在有些时候须要将窗体隐藏。不能直接退出须要用到这种方法
    
                    frame.setVisible(true);
                    // 将窗体可见化。这样以便用户在第一次看见窗体之前我们能够向当中加入内容
                }
            });
        }
    
    }
    
    
    class DrawFrame extends JFrame
    {
        public DrawFrame(){
    
            add(new DrawComponent());
            //向当中加入一个实例化的实现JComponent类的子类
    
            pack();
            //调用框架组件的首选大小,或者我们能够用SetSize方法来替换它
        }
    }
    
    class DrawComponent extends JComponent
    {
        private static final int DEFAULT_WIDTH = 400;
        private static final int DEFAULT_HEIGHT = 400;
    
        /**
         * 我们覆盖了这个以用来打印图形
         * 
         * @param g
         *            Graphics对象是我们须要用的Graphics2D的父类
         */
        public void paintComponent(Graphics g){
    
            Graphics2D g2 = (Graphics2D)g;
            //实例化Graphics2D这个类的对象,他是參数Graphics2D的一个子类
    
            double leftX = 100;
            double topY = 100;
            double width = 200;
            double height = 150;
            //我们设置矩形的四个属性
    
            Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
            //创建一个Rectangle2D的对象,这个对象继承了Sharp接口
            //Double是当中的一个静态内部类。当我们初始化时须要在Double中设置參数
    
            g2.draw(rect);
            //传入一个实现Sharp接口的实例,并在画布上画出
    
            Ellipse2D ellipse = new Ellipse2D.Double();
            //创建一个椭圆的实例
    
            ellipse.setFrame(rect);
            //椭圆和矩形类是兄弟关系,由于他们有着同样的边界推断方式
            //这里我们直接用rect来对椭圆形进行描写叙述(通过椭圆的外接矩形)
    
            g2.draw(ellipse);
            //传入一个实现Sharp接口的实例,并在画布上画出
    
            g2.draw(new Line2D.Double(leftX,topY,leftX+width,topY+height));
            //在画布上画出一条直线
    
            double centerX = rect.getCenterX();
            double centerY = rect.getCenterY();
            double radius = 150;
            //定义圆心坐标和半径
    
            Ellipse2D circle = new Ellipse2D.Double();
            //创建一个圆的实例
            circle.setFrameFromCenter(centerX, centerY, centerX+radius, centerY+radius);
            //设置坐标和半径
            g2.draw(circle);
            //在画布上画出一个圆
        }
    
        /**
         * 我们覆盖了这种方法来表示出这个类的组件的大小
         * 
         * @return 返回这个类的组件本身应该有多大
         */
        public Dimension getPreferredSize(){
            return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
            // 返回一个Dimension对象,表示这个组件的大小
        }
    }

    输出结果:左上角的窗体中有一个椭圆,外面有一个外界矩形,有一条从矩形左上角到右下角的直线,以这个矩形中心为原点有一个半径为150像素的圆。

    (四)图形上色

    Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
    //创建一个Rectangle2D的对象。这个对象继承了Sharp接口
    //Double是当中的一个静态内部类,当我们初始化时须要在Double中设置參数
    
    g2.setColor(Color.BLUE);
    //为g2对象设置一种填充颜色,会影响线条颜色
    
    g2.fill(rect);
    //将我们选择的颜色填充到rect表示的封闭图形中
    
    g2.draw(rect);
    //传入一个实现Sharp接口的实例,并在画布上画出

    在上一个代码其它部分不改变的情况下。插入这样两行代码(在1。4行代码的原位置中间插入2。3行代码)。

    得到上色效果。

    输出结果:中间为蓝色矩形,以矩形中心为原点。150像素为半径有个蓝色线条的圆形。

    (五)特殊字体

    package Swing;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.font.*;
    import java.awt.geom.*;
    
    /**
     * 
     * @author QuinnNorris 特殊字体
     */
    public class FontTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            // 开启一个线程,全部的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
            EventQueue.invokeLater(new Runnable() {
                // 匿名内部类。是一个Runnable接口的实例。实现了run方法
                public void run() {
                    JFrame frame = new FontFrame();
                    // 创建以下自定义的SimpleFrame类对象。以便于调用构造器方法
    
                    frame.setTitle("FontTest");
                    // 设置标题
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    // 选择当用户关闭框架的时候进行的操作 ,在有些时候须要将窗体隐藏,不能直接退出须要用到这种方法
    
                    frame.setVisible(true);
                    // 将窗体可见化,这样以便用户在第一次看见窗体之前我们能够向当中加入内容
                }
            });
        }
    
    }
    
    class FontFrame extends JFrame {
        public FontFrame() {
            add(new FontComponent());
            // 向当中加入一个实例化的实现JComponent类的子类
    
            pack();
            // 调用框架组件的首选大小。或者我们能够用SetSize方法来替换它
        }
    }
    
    class FontComponent extends JComponent {
        private static final int DEFAULT_WIDTH = 300;
        private static final int DEFAULT_HEIGHT = 200;
    
        /**
         * 我们覆盖了这个以用来做一些工作
         * 
         * @param g
         *            Graphics对象是我们须要用的Graphics2D的父类
         */
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            // 实例化Graphics2D这个类的对象,他是參数Graphics2D的一个子类
    
            String message = "Hello World!";
            // 写出我们要操作的文字
    
            Font f = new Font("Dialog", Font.BOLD, 36);
            // 创建一个字体类型,參数包含字体族,风格类型,大小
            // 也能够通过特殊的方法。调用载入得到本地的字体包
    
            g2.setFont(f);
            // 将f设置在g2之中
    
            FontRenderContext context = g2.getFontRenderContext();
            // 通过调用方法,得到屏幕设备字体属性的描写叙述对象
    
            Rectangle2D bounds = f.getStringBounds(message, context);
            // getStringBounds方法返回一个包围着字符串的矩形
    
            double x = (DEFAULT_WIDTH - bounds.getWidth()) / 2;
            // bounds.getWidth方法能够获得字符串的宽度
    
            double y = (DEFAULT_HEIGHT - bounds.getHeight()) / 2;
            // bounds.getHeight方法能够获得字符串的高度
    
            double ascent = -bounds.getY();
            // 获得字体的上坡度
    
            double baseY = y + ascent;
            // 文字的基线位置
    
            g2.drawString(message, (int) x, (int) y);
            // 设置字符串位置
    
            g2.setPaint(Color.LIGHT_GRAY);
            // 设置线条颜色为亮灰色
    
            g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));
            // 在文字的基线上画下一条横线
    
            Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(),
                    bounds.getHeight());
    
            g2.draw(rect);
        }
    
        /**
         * 我们覆盖了这种方法来表示出这个类的组件的大小
         * 
         * @return 返回这个类的组件本身应该有多大
         */
        public Dimension getPreferredSize() {
            return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            // 返回一个Dimension对象,表示这个组件的大小
        }
    }

    输出结果:窗体正中间有文字“Hello World”。外围被一个灰色矩形包含,在基线的地方有一条横线切割。

    (六)加入图片

    package Swing;
    
    import javax.swing.*;
    import java.awt.*;
    
    /**
     * 
     * @author QuinnNorris 加入图片
     */
    public class ImageTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            // 开启一个线程。全部的Swing组件必须由事件分派线程进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
            EventQueue.invokeLater(new Runnable() {
                // 匿名内部类,是一个Runnable接口的实例。实现了run方法
                public void run() {
                    JFrame frame = new ImageFrame();
                    // 创建以下自定义的SimpleFrame类对象,以便于调用构造器方法
    
                    frame.setTitle("ImageTest");
                    // 设置标题
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    // 选择当用户关闭框架的时候进行的操作 ,在有些时候须要将窗体隐藏,不能直接退出须要用到这种方法
    
                    frame.setVisible(true);
                    // 将窗体可见化。这样以便用户在第一次看见窗体之前我们能够向当中加入内容
                }
            });
        }
    
    }
    
    class ImageFrame extends JFrame {
        public ImageFrame() {
            add(new ImageComponent());
            // 向当中加入一个实例化的实现JComponent类的子类
    
            pack();
            // 调用框架组件的首选大小。或者我们能够用SetSize方法来替换它
        }
    }
    
    class ImageComponent extends JComponent {
    
        private static final int DEFAULT_WIDTH = 300;
        private static final int DEFAULT_HEIGHT = 200;
    
        private Image image;
    
        /**
         * ImageComponent的构造函数,用来实例化图片
         */
        public ImageComponent(){
            image = new ImageIcon("D:/image.jpg").getImage();
            //通过路径得到图片
        }
    
        /**
         * 我们覆盖了这个以用来做一些工作
         * 
         * @param g
         *           
         */
        public void paintComponent(Graphics g) {
            if(image == null ) return;
            //假设图片不对,则直接返回避免错误发生
    
            g.drawImage(image, 0,0,null);
            //在画布上给出图片
        }
    
        /**
         * 我们覆盖了这种方法来表示出这个类的组件的大小
         * 
         * @return 返回这个类的组件本身应该有多大
         */
        public Dimension getPreferredSize() {
            return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            // 返回一个Dimension对象。表示这个组件的大小
        }
    }

    输出结果:在画布以左上角为開始放置你加入的图片。

  • 相关阅读:
    PAT 甲级 1128 N Queens Puzzle
    HDU 1995 R-汉诺塔V
    PAT L1-039 古风排版
    PAT L2-028 秀恩爱分得快
    ZOJ 2060 A-Fibonacci Again
    HDU 2079 选课时间
    HDU 1016 Prime Ring Problem
    理论相关概念原理
    单播字符、字符串收发
    OSAL的原理
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7350487.html
Copyright © 2011-2022 走看看