Java图形程序设计学习(2)对JFrame的使用

目录

1、顶层窗口类(框架)JFrame

2、 在框架中显示信息

3、绘制2D图形

4、设置颜色

5、文本使用特殊字体


1、顶层窗口类(框架)JFrame

(1)JFrame类是用于描述顶层窗口,JFrame就代表Swing中的窗口组件

(2)JFrame的修饰部件(按钮,标题栏,图标等)是由用户的窗口系统绘制,不由Swing绘制

阅读下面例子,需要理解的几个API

EventQueue.invokeLater(new Runnable(){ ... }) 只需要将其看作是启动Swing程序的作用即可

Component的API:

boolean isVisible()

void setVisible(boolean b) 设置显示与否,一般组件默认是可见的,只有JFrame例外

void setSize(int width, int height)

void setLocation(int x, int y) 设置组件的位置。JFrame则是相对屏幕左上角而言,其它组件则是相对包含它的容器左上角而言

void setBounds(int x, int y, int w, int h)

Dimension getSize() 获得当前组件的size属性,又可以通过size获得width和height

void setSize(Dimension d) 设置当前组件的size属性

Window的API:

void toFront() 将该窗口显示在其它窗口前面

void toBack()

boolean isLocationByPlatform()

void setLocationByPlatform(boolean b) 这个属性在窗口显示之前被设置,由平台选择一个合适的位置放该窗口

Frame的API:

boolean isResizable()

void setResiable(boolean b) 设置该属性后,用户可以对框架变大变小

String getTitle()

void setTitle(String s) 设置框架标题栏中的文字

Image getIconImage()

void setIconImage(Image img) 这个属性确定了框架的图标

boolean isUndecorated()

void setUndecorated(boolean b) 框架显示前调用,true则该框架不会显示标题栏和关闭按钮等装饰

int getExtendedState()

void setExtendedState(int state) 设置窗口状态(Frame.NORMAL等5种)

Toolkit的API:

static Toolkit getDefaultToolkit() 返回默认的工具箱

Dimension getScreenSize() 返回用户屏幕的尺寸

ImageIcon的API:

ImageIcon(String filename) 根据一个文件路径构造一个图标,其图像存储在一个文件中

Image getImage() 获得该图标的图像
 

package GUI;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class JFrameDemo {
	public static void main(String[] args) {
		/*所有的Swing组件必须由事件分派线程进行配置*/
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				SimpleFrame frame = new SimpleFrame();//初始化窗口
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置:关闭窗口,则程序退出
				frame.setVisible(true);//显示窗口
			}
		});
	}
}

class SimpleFrame extends JFrame{
	private static final long serialVersionUID = 1L;
	
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	public SimpleFrame() {
		this.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
		
		/*setLocation(x,y)仅设置窗口显示位置,相对屏幕左上角*/
//		this.setLocation(500, 500);
		
		/*setBounds(x,y,width,height)重置窗口显示位置和大小*/
//		this.setBounds(200, 200, 500, 400);
		
		/*让窗口系统控制窗口的位置*/
		this.setLocationByPlatform(true);
		
		/*设置窗口标题*/
		setTitle("贪吃蛇");
		
		/*先获得屏幕大小,再设置窗口大小是屏幕大小的一半*/
		Toolkit kit = Toolkit.getDefaultToolkit();
		Dimension screenSize = kit.getScreenSize();
		int screenWidth = screenSize.width;
		int screenHeight = screenSize.height;
		setSize(screenWidth/2, screenHeight/2);
		
		/*设置窗口图标*/
//		Image img = new ImageIcon("src/icon.jpg").getImage();
//		setIconImage(img);
		
		
	}
}

2、 在框架中显示信息(先在JComponent中绘制信息,再将JComponent添加到JFrame中)

阅读下面例子需要掌握的API

JFrame的API:

Container getContent() 返回JFrame的内容窗格对象(JFrame的内部有许多层次,内容窗格就是用来展示内容的,其它组件

就是放到内容窗格中的)

Component add(Component c) 将一个给定的组件添加到该框架的内容窗格中(JDK 1.5以下版本中,该方法会报错)

Component的API:

void repaint() 重新绘制组件

Dimension getPreferredSize() 需要重写该方法,获得当前组件的首选大小

JComponent的API:

void paintComponent(Grphics g) 重写这个方法,描述应该如何绘制自己的组件

Window的API:

void pack() 会考虑组件的首选大小,调整窗口大小

package GUI;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class NotHelloWorld {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				NotHelloWorldFrame frame = new NotHelloWorldFrame();//初始化窗口
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置:关闭窗口,则程序退出
				frame.setVisible(true);//显示窗口
			}
		});
	}
}

class NotHelloWorldFrame extends JFrame{
	private static final long serialVersionUID = 1L;

	/**
	 * 添加消息面板到框架的内容窗格中去
	 */
	public NotHelloWorldFrame() {
		this.add(new NotHelloWorldComponent());
		pack();//根据面板的首选大小,调整窗口大小
	}
}

class NotHelloWorldComponent extends JComponent{
	private static final long serialVersionUID = 1L;
	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;
	
	/**
	 * 给面板绘制信息
	 */
	@Override
	public void paintComponent(Graphics g) {
		g.drawString("Not a Hello World Program", MESSAGE_X, MESSAGE_Y);
	}
	
	/**
	 * 返回面板的首选大小
	 */
	@Override
	public Dimension getPreferredSize() {
		return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
	}
}

3、绘制2D图形

可能会用到的API

double getCenterX() 获得矩形中心x坐标值

double getMinX() 获得最小的x坐标值

double getMaxX() 获得最大的x坐标值

double getWidth() 获得矩形的宽

double getHeight() 获得矩形的高

double getX() 获得矩形左上角的x坐标

Rectangle2D.Double(double x,double y,double w,double h) 利用给定的左上角和宽高,构造一个矩形

Rectangle2D.Float(float x,float y,float w,float h) 利用给定的左上角和宽高,构造一个矩形

Ellipse2D.Double(double x,double y,double w,double h) 利用给定的左上角和宽高的外接矩形,构造一个椭圆(宽高相同时就是圆)

Point2D.Double(double x,double y) 利用给定坐标构造一个

Line2D.Double(Point2D start, Point2D end) 构造一条直线

Line2D.Double(double startX,double startY,double endX,double endY) 构造一条直线

package GUI;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class DrawTest {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				DrawFrame frame = new DrawFrame();//初始化窗口
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置:关闭窗口,则程序退出
				frame.setVisible(true);//显示窗口
			}
		});
	}
}

@SuppressWarnings("serial")
class DrawFrame extends JFrame{
	public DrawFrame() {
		add(new DrawComponent());
		pack();
	}
}

@SuppressWarnings("serial")
class DrawComponent extends JComponent{
	private static final int DEFAULT_WIDTH = 500;
	private static final int DEFAULT_HEIGHT = 400;
	
	@Override
	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);//填充颜色,右侧和下方少绘制一个像素的颜色
		
	}
	
	@Override
	public Dimension getPreferredSize() {
		return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
	}
}

4、设置颜色

(1)获取和改变当前颜色,所有后续的绘图操作都使用这个新颜色

Color getColor( )

void setColor( Color c )

创建一个颜色对象:Color( int r, int g, int b )

(2)获取和设置这个图形环境的绘制属性,即设置画笔的颜色

Paint getPaint( )

void setPaint( Paint p )

void fill( Shape s )

(3)背景色和前景色

setBackground( Color c )

setForeground( Color c )

5、文本使用特殊字体

package GUI;

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class FontTest {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				JFrame frame = new FontFrame();//初始化窗口
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置:关闭窗口,则程序退出
				frame.setVisible(true);//显示窗口
			}
		});
	}
}

@SuppressWarnings("serial")
class FontFrame extends JFrame{
	public FontFrame() {
		add(new FontComponent());
		pack();
	}
}

@SuppressWarnings("serial")
class FontComponent extends JComponent{
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	
	@Override
	public Dimension getPreferredSize() {
		return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
	}
	
	@Override
	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D)g;
		
		String msg = "Hello World";
		
		//创建一个新字体对象,字体名,字体风格,字体大小
		Font f = new Font("Serif", Font.BOLD, 36);
		g2.setFont(f);
		
		//----要想字符串在面板的中央位置
		//返回指定字体特征的字体绘制环境
		FontRenderContext context = g2.getFontRenderContext();
		//返回包围字符串的矩形
		Rectangle2D bounds = f.getStringBounds(msg, context);
		double x = (getWidth() - bounds.getWidth()) / 2;
		double y = (getHeight() - bounds.getHeight()) / 2; 
		double ascent = -bounds.getY();
		double baseY = y + ascent;
		g2.drawString(msg, (int)x, (int)baseY);
		
		//---显示基线
		g2.draw(new Line2D.Double(x, baseY, x+bounds.getWidth(), baseY));
		
	}
}

 

猜你喜欢

转载自blog.csdn.net/Carl_changxin/article/details/82925917