1.创建框架
代码示例
import java.awt.*;
import javax.swing.*;// javax表示这个包为扩展包
public class SimpleFrameTest{
public static void main(String[] args) {
// 所有的Swing组件都必须由事件分派线程(event dispatch thread)进行配置,线程将鼠标点击和按键控制转移到用户接口组件。
EventQueue.invokeLater(()->{
SimpleFrame frame=new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 定义用户关闭框架的响应动作
frame.setVisible(true);// 显示框架
//frame.setUndecorated(true);// 关闭所有框架装饰
});
}
}
class SimpleFrame extends JFrame{
//设置框架大小
private static final int DEFAULT_HEIGHT=300;
private static final int DEFAULT_WIDTH=200;
public SimpleFrame(){
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
2.框架定位
代码示例
import java.awt.*;
import javax.swing.*;
public class SizedFrameTest {
public static void main(String[] args) {
EventQueue.invokeLater(()->{
JFrame frame=new SizedFrame();
frame.setTitle("SizedFrame");// 设置标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setExtendedState(Frame.MAXIMIZED_BOTH);//将框架设置为最大
});
}
}
class SizedFrame extends JFrame{
public SizedFrame(){
//获取屏幕尺寸
Toolkit kit=Toolkit.getDefaultToolkit();// Toolkit类包含很多与本地窗口系统打交道的方法
Dimension screenSize=kit.getScreenSize();// Dimension对象包含公有实例变量width和height
int screenHeight=screenSize.height;
int screenWidth=screenSize.width;
//设置框架尺寸使得
setSize(screenWidth/2,screenHeight/2);
setLocationByPlatform(true);//定位框架
//设置框架图标
Image img=new ImageIcon("icon.gif").getImage();
setIconImage(img);
}
}
java.awt.Components
boolean isVisible()
void setVisible(boolean b)
获取或设置visible属性。组件最初是可见的,但JFrame这样的顶层组件除外void setSize(int width, int height)
使用给定的宽度和高度重新设置组件的大小- ```void setLocation(int x, int y)
void setBounds(int x ,int y, int width, int height)
移动并重新设置组件的大小Dimension getSize()
void setSIze(Dimension d)
获取或设置当前组件的size属性
java.awt.Window
void toFront()
将这个窗口显示在其他窗口前面。- ```void toBack()` `` 将这个窗口移到桌面窗口栈的后面,并相应地重新排列所有地可见窗口
boolean isLocationByPlatform()
- ```void setLocationByPlatform(boolean b)
java.awt.Frame
boolean isResizable()
void setResizable(boolean b)
获取或设置resizable属性。这个属性设置后,用户可以重新设置框架的大小String getTitle()
void setTitle(String s)
获取或设置title属性,这个属性设置后,用户可以重新设置框架的大小Image getIconImage()
void setIconImage(Image image)
获取或设置iconImage属性,这个属性确定框架的图标。窗口系统可能会将图标作为框架装饰或其他部位的一部分显示boolean isUndecorated()
- ```void setUndecorated(boolean b)
获取或设置undecorated属性。这个属性设置后,框架显示中将没有标题栏或关闭按钮这样的装饰。在框架显示之前,必须调用这个方法 int getExtendedState()
void setExtendedState(int state)
获取或设置窗口状态。状态是下列值之一:
Frame.NORMAL
Frame.ICONIFIED
Frame.MAXIMIZED_HORIZ
Frame.MAXIMIZED_VERT
Frame.MAXIMIZED_BOTH
java.awt.Toolkit
static Toolkit getDefaultToolkit()
返回默认的工具箱Dimesion getScreenSize()
返回用户屏幕的尺寸
javax.swing.ImageIcon
ImageIcon(String filename)
构造一个图标,其图像存储在一个文件中。Image getImage()
获得该图标的图像
3.在组件中显示信息
JFrame 内部结构
代码示例
import javax.swing.*;
import java.awt.*;
public class NotHelloWorld {
public static void main(String[] args) {
EventQueue.invokeLater(()->{
JFrame frame=new NotHelloWorldFrame();
frame.setTitle("NotHelloWorld");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
//包含消息面板的框架
class NotHelloWorldFrame extends JFrame{
public NotHelloWorldFrame(){
add(new NotHelloWorldComponent());
pack();//在框架中填入一个或多个组件时,如果你只想使用它们的首选大小,可以调用pack方法
}
}
//显示消息的组件
class NotHelloWorldComponent extends JComponent{
public static final int MESSAGE_X=75;
public static final int MESSAGE_Y=100;
private static final int DEFAULT_HEIGHT=200;
private static final int DEFAULT_WIDTH=300;
//创建一个能够进行绘制的组件
public void paintComponent(Graphics g){
g.drawString("Not a Hello, World program",MESSAGE_X,MESSAGE_Y);
}
//返回一个有首选宽度和高度的Dimension类对象
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
/*
JPanel是一个可以包含其他组件的容器(container),但同样可以在其上绘制。
有一点不同之处是,面板不透明,这意味着需要在面板的边界内绘制所有的像素。
最容易实现的方法是,在每个面板子类的paintComponent方法中调用super.paintComponent来用背景色绘制面板:
* class NotHelloWorldPanel extends JPanel{
* public void paintComponent(Graphics g){
* super.paintComponent(g);
* code for drawing;
* }
* }
*/
javax.swing.JFrame
Container getContentPane()
返回这个JFrame的内容窗格对象Component add(Component c)
将一个给定的组件添加到该框架的内容窗格中
java.awt.Component
void repaint()
“尽可能快地”重新绘制组件Dimension getPreferredSize()
要覆盖这个方法,返回这个组件的首选大小
javax.swing.JComponent
void paintComponent(Graphics g)
覆盖这个方法来描述应该如何绘制自己的组件
java.awt.Window
void pack()
调整窗口大小,要考虑到其组件的首选大小
4.处理2D图形
代码示例
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class DrawTest {
public static void main(String[] args) {
JFrame frame=new DrawFrame();
frame.setTitle("DrawTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//有绘图面板的框架
class DrawFrame extends JFrame{
public DrawFrame(){
add(new DrawComponent());
pack();
}
}
//显示矩形和椭圆的组件
class DrawComponent extends JComponent{
private static final int DEFAULT_HEIGHT=400;
private static final int DEFAULT_WIDTH=400;
public void paintComponent(Graphics g){
Graphics2D g2=(Graphics2D)g;
//矩形
double leftX=100;
double topY=100;
double width=200;
double height=150;
Rectangle2D rect=new Rectangle2D.Double(leftX,topY,width,height);
g2.draw(rect);
//椭圆
Ellipse2D ellipse=new Ellipse2D.Double();
ellipse.setFrame(rect);
g2.draw(ellipse);
//对角线
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);
}
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
java.awt.geom.RectangularShape
double getCenterX()
double getCenterY()
double getMinX()
double getMinY()
double getMaxX()
double getMaxY()
返回闭合矩形的中心,以及最大最小x和y的坐标值double getWidth()
double getHeight()
返回闭合矩形的宽和高double getX()
double getY()
返回闭合矩形左上角的x和y的坐标
java.awt.geom.Rectangle2D.Double
Rectangle2D.Double(double x, double y, double w, double h)
利用给定的左上角、宽和高构造矩形
java.awt.geom.Rectangle2D.Float
Rectangle2D.Float(float x, float y, float w, float h)
利用给定的左上角、宽和高构造矩形
java.awt.geom.Ellipse2D.Double
Ellipse2D.Double(double x, double y, double w,double h)
利用给定的左上角、宽和高的外接矩形,构造一个椭圆
java.awt.geom.Point2D.Double
Point2D.Double(double x, double y)
利用给定坐标构造一个点
java.awt.geom.Line2D.Double
Line2D.Double(Point2d start, Point2D end)
Line2D.Double(double startX, double startY, double endX, double endY)
利用给定的起点和终点,构造一条直线
5.使用颜色
代码示例
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class DrawTest {
public static void main(String[] args) {
JFrame frame=new DrawFrame();
frame.setTitle("DrawTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
//有绘图面板的框架
class DrawFrame extends JFrame{
public DrawFrame(){
add(new DrawComponent());
pack();
}
}
//显示矩形和椭圆的组件
class DrawComponent extends JComponent{
private static final int DEFAULT_HEIGHT=400;
private static final int DEFAULT_WIDTH=400;
public void paintComponent(Graphics g){
Graphics2D g2=(Graphics2D)g;
//矩形
double leftX=100;
double topY=100;
double width=200;
double height=150;
Rectangle2D rect=new Rectangle2D.Double(leftX,topY,width,height);
g2.draw(rect);
g2.setPaint(Color.RED);// 设置当前颜色
g2.fill(rect);//给矩形填充颜色
//椭圆
Ellipse2D ellipse=new Ellipse2D.Double();
ellipse.setFrame(rect);
g2.draw(ellipse);
//定制颜色
g2.setPaint(new Color(128,128,128));
g2.drawString("Welcome!",75,125);
//对角线
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);
}
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
java.awt.Color
Color(int r, int g, int b)
创建一个颜色对象
java.awt.Graphics
Color getColor()
void setColor(Color c)
获取或改变当前颜色。所有后续的绘图操作都会使用这个新颜色
java.awt.Graphics2D
Paint getPaint()
void setPaint(Paint p)
获取或设置这个图形环境的绘制属性。Color类实现了Paint接口。因此,可以使用这个方法将绘制属性设置为纯色void fill(Shape s)
用当前的颜料填充该图形
java.awt.Component
Color getBackgrourd()
void setBackground()
获取或设置背景色Color getForeground()
void setForeground()
获取或设置前景色
6.设置字体
打印系统上所有字体名
import java.awt.*;
public class ListFonts {
public static void main(String[] args) {
String[] fontNames=GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for(String fontName:fontNames){
System.out.println(fontName);
}
}
}
代码示例
import java.awt.*;
import java.awt.font.*;
import javax.swing.*;
import java.awt.geom.*;
public class FontTest {
public static void main(String[] args) {
EventQueue.invokeLater(()->{
JFrame frame=new FontFrame();
frame.setTitle("FontTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
//有文本信息组件的框架
class FontFrame extends JFrame{
public FontFrame(){
add(new FontComponent());
pack();
}
}
class FontComponent extends JComponent{
private static final int DEFAULT_WIDTH=300;
private static final int DEFAULT_HEIGHT=200;
public void paintComponent(Graphics g){
Graphics2D g2=(Graphics2D)g;
String message="Hello, World!";
Font f=new Font("Serif",Font.BOLD,36);
g2.setFont(f);
//测量文本的大小
FontRenderContext context=g2.getFontRenderContext();
Rectangle2D bounds=f.getStringBounds(message,context);
//设置文本的坐标
double x=(getWidth()-bounds.getWidth())/2;
double y=(getHeight()-bounds.getHeight())/2;
double ascent=-bounds.getY();
double baseY=y+ascent;
//绘制文本信息
g2.drawString(message, (int)x, (int)baseY);
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);
}
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
java.awt.Font
Font (String name, int style, int size)
创建一个新字体对象。String getFontName()
返回字体名, 例如,“ Helvetica Bold ”。String getFamily()
返回字体家族名, 例如,“ Helvetica ”。String getName()
如果采用逻辑字体名创建字体,将返回逻辑字体, 例如,“ SansSerif”;否则,返回字
体名。Rectangle2D getStringBounds(String s, FontRenderContext context)
返回包围这个字符串的矩形。 矩形的起点为基线。 矩形顶端的 y 坐标等于上坡度的负
值。 矩形的高度等于上坡度、 下坡度和行间距之和。 宽度等于字符串的宽度LineMatrics getLineMetrics(String s, FontRenderContext context)
返回测定字符串宽度的一个线性 metrics 对象。Font deriveFont(int style)
Font deriveFont(float size)
Font deriveFont(int style, float size)
返回一个新字体, 除给定大小和字体风格外, 其余与原字体一样。
java.awt.font.LineMetrics
float getAscent()
返回字体的上坡度——从基线到大写字母顶端的距离。float getDescent()
返回字体的下坡度——从基线到坡底的距离。float getLeading()
返回字体的行间距——从一行文本底端到下一行文本顶端之间的空隙。float getHeight()
返回字体的总高度——两条文本基线之间的距离 ( 下坡度 + 行间距 + 上坡度 )。
java.awt.Graphics
Font getFont()
void setFont(Font font)
获取或设置当前的字体。 这种字体将被应用于后续的文本绘制操作中。void drawString(String str,int x, int y)
采用当前字体和颜色绘制一个字符串。
java.awt.Graphics2D
FontRenderContext getFontRenderContext()
返回这个图形文本中, 指定字体特征的字体绘制环境。void drawString(String str, float x, float y)
采用当前的字体和颜色绘制一个字符串。
7.显示图像
代码示例
import java.awt.*;
import javax.swing.*;
public class ImageTest {
public static void main(String[] args) {
EventQueue.invokeLater(()->{
JFrame frame=new ImageFrame();
frame.setTitle("ImageTest");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
class ImageFrame extends JFrame{
public ImageFrame(){
add(new ImageComponent());
pack();
}
}
//显示平铺图像的组件
class ImageComponent extends JComponent{
private static final int DEFAULT_WIDTH=300;
private static final int DEFAULT_HEIGHT=200;
private Image image;
public ImageComponent(){
image=new ImageIcon("haha.gif").getImage();
}
public void paintComponent(Graphics g){
if(image==null)
return;
int imageWidth=image.getWidth(this);
int imageHeight=image.getHeight(this);
//在左上角绘制图像
g.drawImage(image, 0, 0, null);
//在组件上平铺图像
for(int i=0;i*imageWidth<=getWidth();i++){
for(int j=0;j*imageHeight<=getHeight();j++){
if(i+j>0){
g.copyArea(0, 0, imageWidth, imageHeight, i*imageWidth, j*imageHeight);
}
}
}
}
public Dimension getPreferredSize(){
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
java.awt.Graphics
boolean drawImage(Image img, int x, int y, ImageObserver observer)
绘制一幅非比例图像。 注意: 这个调用可能会在图像还没有绘制完毕就返回。boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
绘制一幅比例图像。 系统按照比例将图像放人给定宽和高的区域。 注意: 这个调用可
能会在图像还没有绘制完毕就返回。