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对象。表示这个组件的大小
    }
}

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

时间: 2024-11-08 20:07:29

java图形化Swing教程(一)的相关文章

Java图形化界面设计——容器(JFrame)

Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类(“JavaFoundationClasses”,JFC),由一些软件包组成.这些软件包主要包括下面一些应用程序接口(API): ·抽象窗口工具集(AWT)(1.1及以上版本). ·Swing构件. ·Java 2D应

三十三、Java图形化界面设计——布局管理器之null布局(空布局)

摘自http://blog.csdn.net/liujun13579/article/details/7774267 三十三.Java图形化界面设计--布局管理器之null布局(空布局) 一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1)       首先利用setLayout(null)语句将容器的布局设置为null布局(空布局). 2)       再调用组件的setBounds(int x, int y, int width,int

三十一、Java图形化界面设计——布局管理器之GridLayout(网格布局)

摘自http://blog.csdn.net/liujun13579/article/details/7772491 三十一.Java图形化界面设计--布局管理器之GridLayout(网格布局) 网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式为:从上到下,从左到右. l  组件放入容器的次序决定了它在容器中的位置. l  容器大小改变时,组件

39.JAVA编程思想之外篇——JAVA图形化设计精简大全一文覆盖

39.JAVA编程思想之外篇--JAVA图形化设计精简大全一文覆盖 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51204948 目录 Java图形化界面设计--容器(JFrame)...1 Java基本类(JFC)...1 l     AWTAbstract Window Toolkit(AWT)抽象窗口工具包... 2 l     Swing包... 2 l     AWT和Swing的区别... 6 Swing基本框

二十七、Java图形化界面设计——容器(JFrame)

摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Java基本类(JFC) Java基本类("JavaFoundationClasses",JFC),由一些软件包组成.这些

三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) 卡片布局能够让多个组件共享同一个显示空间,共享空间的组件之间的关系就像一叠牌,组件叠在一起,初始时显示该空间中第一个添加的组件,通过CardLayout类提供的方法可以切换该空间中显示的组件. 1.  CardLayout类的常用构造函数及方法 2.  使用CardLayout类提供的方法可以切换显

java图形化编程

转载 学习Java Swing图形化编程,我们首先要了解三个最基本的概念:顶层容器,控件,布局. 下面就来介绍一下这三个基本概念 1.顶层容器 什么是顶层容器?当我们使用Java进行图形编程的时候,图在哪里绘制呢?我们需要一个能够提供图形绘制的容器,这个容器就被称为顶层容器,你也可以把它想象成一个窗口.顶层容器是进行图形编程的基础,一切图形化的东西,都必然包括在顶层容器中.在Swing中,我们有三种可以使用的顶层容器,它们分别是: ·JFrame:用来设计类似于Windows系统中的窗口形式的应

三十、Java图形化界面设计——布局管理器之BorderLayout(边界布局)

边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次相应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENTER),例如以下图所看到的. 特征: l  能够把组件放在这五个位置的随意一个,假设未指定位置,则缺省的位置是CENTER. l  南.北位置控件各占领一行,控件宽度将自己主动布满整行.东.西和中间位置占领一行;若东.西.南.北位置无控件,则中间控件将自己主动布满整个屏幕.若东.西.南.北位置中不管

04 Java图形化界面设计——布局管理器之BorderLayout(边界布局)

边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次对应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENTER),如下图所示. 特征: l  可以把组件放在这五个位置的任意一个,如果未指定位置,则缺省的位置是CENTER. l  南.北位置控件各占据一行,控件宽度将自动布满整行.东.西和中间位置占据一行;若东.西.南.北位置无控件,则中间控件将自动布满整个屏幕.若东.西.南.北位置中无论哪个位置没有控件