(java学习随堂笔记)图形用户界面

一、绘图

1、图形环境和图形对象

(1)坐标

GUI左上角默认坐标(0,0)

(2)Graphics对象

专门管理图形环境,抽象类
提供了一个与平台无关的绘图接口
各平台上实现的Java系统将创建 Graphics类的一个子类,来实现绘图功能,但是这个子类对程序员是透明的。
在执行paint方法时,系统会传递一个指向特定平台的 Graphics子类的图形对象g

2、颜色和字体

(1)颜色

Color类以及Graphics类中与颜色有关的方法
在这里插入图片描述

(2)字体

Font类以及Graphics类中与字体有关的方法
Font类以及Graphics类中与字体有关的方法

3、Graphics类绘图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import javax.swing.*;
import java.awt.*;
import java.awt.Color;

//继承Jframe构造主窗口
public class GraphicsTester extends JFrame {
    public GraphicsTester(){
        super("演示字体、颜色、绘图");        //主窗口的标题栏
        setVisible(true);       //显示窗口
        setSize(480,250);       //窗口大小
    }
    public void paint(Graphics g){
        super.paint(g);//Graphics引用,传给超类的paint方法
        g.setFont(new Font("SansSerif",Font.BOLD,12));
        g.setColor(Color.BLUE);
        g.drawString("绘图绘图",50,50);

        g.drawRect(100,100,100,100);

        g.setColor(Color.darkGray);

        g.fillRect(300,300,100,100);
    }
    public static void main(String args[]){
        GraphicsTester application = new GraphicsTester();
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

4、Java2D API

分布在java.awt、java.awt. mage、java.awt. color、java.awt.font、java.awt.geomjava.awt.print和 ljava. awt. image renderable包中。

它能轻松使你完成以下功能

可以很容易绘制各种形状;可以控制笔画:粗细、端头样式、虚线 可以用单色、渐变色和纹理填充形状;
平移、旋转、伸缩、切变二维图形,对图像进行模糊、锐化等操作;构建重叠的文本和图形;可以对形状进行剪切,将其限制在任意区域内;

5、Graphics2D类绘图

是Graphics类的抽象子类,使用时需要建立该类的对象

import javax.swing.*;
import java.awt.*;


public class Graphics2DTester extends JApplet {
    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setPaint(new GradientPaint(0,0,Color.red,180,45,Color.blue));
        g2d.drawString("this in a java App;et",25,25);
    }
}

Swing基础

JFC与Swing

JFC( Java Foundation Classes)

是关于GUI组件和服务的完整集合。
作为 JAVA SE的一个有机部分,主要包含AWT、Java2D、Accessibility、Drag&Drop、Swing

Swing

JFC的一部分
提供按钮、窗口、表格等所有的组件。
纯Java组件(完全用Java写的)

AWT组件

在 java. awt包里,包括 Button、Checkbox、Scrollbar等,都是 Component类的子类。
大部分含有 native code,所以随操作系统平台的不同会显示出不同的样子,而不能进行更改,是重量级组件。

Swing组件

其名称都是在原来AWT组件名称前加上J,例如 Jbutton、JCheckBox、Jscrollbar等,都是Jcomponent类的子类。
架构在AWT之上,是AWT的扩展而不是取代。
完全是由java语言编写的,其外观和功能不依赖于任何由宿主平台的窗口系统所提供的代码,是轻量级组件。
可提供更丰富的视觉感受。

在Applet和Application中应用Swing

在 Applet中应用 Swing,就是要将 Swing组件加载到 Applet容器上(通常是 Japplet),这通常在init方法中完成;
在 Application中应用 Swing,也是要将 Swing组件加载到这个Application的顶层容器(通常Jframe)中。

Swing的层次

多数Swing组件的继承层次

Component类

包含 paint、 repaint方法,可以在屏幕上绘制组件。
大多数GUI组件直接或间接扩展 Component.

Container类

容纳相关组件。
包括add方法,用来添加组件
包括 setLayout方法,用来设置布局,帮助 Container对象对其中的组件进行定位和设置组件大小。

JComponent类一一多数 Swing组件的超类

可定制的观感,即可根据需求定制观感。
快捷键(通过键盘直接访问GUI组件)
一般的事件处理功能

Swing的组件和容器层次

顶层容器

JFrame:实现单个主窗口
JDialog:实现一个二级窗口(对话框)
JApplet:在浏览器窗口中实现一个applet显示区域

必须和操作系统打交道,所以都是重量级组件。
从继承结构上来看,它们分别是从原来AWT组件的 Frame、 Dialog和Applet类继承而来。
每个使用 Swing组件的Java程序都必须至少有一个顶层容器,别的组件都必须放在这个顶层容器上才能显现出来

中间层容器

一般用途的JPanel、JScrollPane、JSplitPane、JTabbedPane、JToolBar
特殊用途的JInternalFrame(在一个应用窗口中开多个子窗口)、JRootPane

原子组件(直接与用户交互的)

显示不可编辑信息的,例如: JLabel、 JProgressBar、 JToolTip
有控制功能、可以用来输入信息的,例如:JButton、JCheckBox、JRadioButton、JComboBox、JList、JMenu、JSlider、JSpinner、JTexComponent等
能提供格式化的信息并允许用户选择的,例如:JColorChooser、JFile Chooser、 JTable、 JTree

常用Swing组件

在这里插入图片描述

布局管理器

调用容器对象的 JsetLayout方法,并以布局管理器对象为参数,例如:
Container contentpane=frame.getContentPane();
contentPane. setLayout(new FlowLayout())
使用布局管理器可以更容易地进行布局,而且当改变窗口大小时,它还会自动更新版面来配合窗口的大小,不需要担心版面会因此混乱。

在Java中有很多实现 Layoutmanager接口的类,经常用到的有以下几个
BorderLayout
FlowLayout
GridLayout
Cardlayout
GridbagLayout
BoxLayout
SpringLayout
内容面板( content pane)默认使用的就是 BorderLayout,它可以将组件放置到五个区域:东、西、南、北、中。

内部类

在另一个类或者方法体的定义中定义的类
可访问其外部类中的所有的数据成员和方法成员
可以对逻辑上相互联系的类进行分组
对于同一个包中的其他类来说,能够隐藏
可非常方便地编写事件驱动程序
声明方式:
命名的内部类:可在类的内部多次使用
匿名内部类:可在new关键字后声明内部类,并立即创建一个对象
假设外层类名为Myclass,则该类的内部类名为
Myclass#cl. class(c为命名的内部类名)
Myclass$1.class(表示类中声明的第一个匿名内部类

public class Parcel1 {
    class Contents{
        private int i = 11;
        public int value(){
            return i;
        }
    }
    class Destination{
        private String label;
        Destination(String whereTo){
            label = whereTo;
        }
        String readLabel(){
            return label;
        }
    }
    public void ship(String dest){
        Contents c = new Contents();
        Destination d =new Destination(dest);
        System.out.println(d.readLabel());
    }
    public Destination to(String s){
        return new Destination(s);
    }
    public Contents co(){
        return new Contents();
    }
    public static void main(String[] args) {
        Parcel1 p =new Parcel1();
        p.ship("zhongguo");

        Parcel1 p1 = new Parcel1();
        Parcel1.Destination d = p1.to("shandong");
        Parcel1.Contents c = p1.co();
    }
}

隐藏实现细节

内部类实现接口、继承抽象类:
可以完全不被看到,而且不能被调用。
可以方便实现“隐藏实现细则”,外部能得到的仅仅是指向超类或者接口的一个引用。

abstract class Contents{
    abstract public int value();
}
interface Destination{
    String readLabel();
}
public class Parcel3 {
    public class PContents extends Contents{
        private int i = 11;
        @Override
        public int value() {
            return i;
        }
    }
    public class PDestination implements Destination{
        private String label;
        private PDestination(String label){
            this.label = label;
        }
        @Override
        public String readLabel() {
            return null;
        }
    }
    public Destination dest(String s){
        return new PDestination(s);
    }
    public Contents cont(){
        return new PContents();
    }
}
class Test{
    public static void main(String[] args) {
        Parcel3 p = new Parcel3();
        Contents c = p.cont();
        Destination d = p.dest("qingzhou");
    }
}

局部作用域中的内部类

//方法中的内部类
public class Parcel4 {
    public Destination dest(String s){
        class PDestination implements Destination{
            private String label;
            private PDestination(String s){
                label = s;
            }
            @Override
            public String readLabel() {
                return label;
            }
        }
        return new PDestination(s);
    }

    public static void main(String[] args) {
        Parcel4 p = new Parcel4();
        Destination d = p.dest("shandongqingzhou");
    }
}

事件处理

Swing组件

其他Swing特性

桌面API简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值