目录
1、Swing(用户界面类)
2、Swing中的JFrame(顶层窗口类)
3、 在框架中显示信息
4、绘制2D图形
5、设置颜色
6、文本使用特殊字体
7、显示图像
1、Swing(用户界面类)
(1)Swing是基于AWT架构之上的,提供功能更强大的用户界面组件;AWT是基本GUI程序设计的类库
(2)Java中的GUI编程技术的发展:AWT,Swing,SWT,JavaFX
2、Swing中的JFrame(顶层窗口类)
(1)JFrame类是用于描述顶层窗口,JFrame就代表Swing中的窗口组件
(2)JFrame的修饰部件(按钮,标题栏,图标等)是由用户的窗口系统绘制,不由Swing绘制
举例:显示一个窗口,并介绍几个常用属性
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);
}
}
3、 在框架中显示信息
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);
}
}
4、绘制2D图形
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);
}
}
5、设置颜色
(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 )
6、文本使用特殊字体
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));
}
}
7、显示图像
package GUI;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class ImageTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new ImageFrame();//初始化窗口
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置:关闭窗口,则程序退出
frame.setVisible(true);//显示窗口
}
});
}
}
@SuppressWarnings("serial")
class ImageFrame extends JFrame{
public ImageFrame() {
add( new ImageComponent() );
pack();
}
}
@SuppressWarnings("serial")
class ImageComponent extends JComponent{
private static final int DEFAULT_WIDTH = 800;
private static final int DEFAULT_HEIGHT = 600;
private Image img;
public ImageComponent() {
img = new ImageIcon("src/icon.jpg").getImage();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
@Override
public void paintComponent(Graphics g) {
if(img == null) return;
int imgWidth = img.getWidth(this);
int imgHeight = img.getHeight(this);
g.drawImage(img, 0, 0 ,130, 190, null);
for(int i=0; i*imgWidth <= getWidth(); i++) {
for(int j=0; j*imgHeight <= getHeight(); j++) {
if(i+j > 0) {
g.copyArea(0, 0, imgWidth, imgHeight, i*130, j*190);
}
}
}
}
}