一、绘图
1、图形环境和图形对象
(1)坐标
GUI左上角默认坐标(0,0)
(2)Graphics对象
专门管理图形环境,抽象类
提供了一个与平台无关的绘图接口
各平台上实现的Java系统将创建 Graphics类的一个子类,来实现绘图功能,但是这个子类对程序员是透明的。
在执行paint方法时,系统会传递一个指向特定平台的 Graphics子类的图形对象g
2、颜色和字体
(1)颜色
Color类以及Graphics类中与颜色有关的方法
(2)字体
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");
}
}