- import javax.swing.*
java AWT(Abstract Window ToolKit)
- import java.awt.*
一、类JFrame
包: javax.swing.JFrame
类EventQueue: 事件分发的类
public static void main(String[] args) {
EventQueue.invokeLater( () -> {
JFrame frame = new JFrame("Welcome"); // 传入标题构造窗体
frame.setSize(500, 500); // 窗口大小设定
frame.setResizable(false); // 窗口大小固定
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设定点击X关闭程序
frame.setVisible(true); // 窗口设置可见
} );
}
二、自定义画布
自定义类继承JPanel类,重写public void paintComponent(Graphics g)函数,默认画布大小函数public Dimension getPreferredSize()。
import javax.swing.*;
import java.awt.*;
public class AlgoFrame extends JFrame {
private int canvasWidth;
private int canvasHeight;
public AlgoFrame(String title, int canvasWidth, int canvasHeight){
super(title);
this.canvasWidth = canvasWidth;
this.canvasHeight = canvasHeight;
Algocanvas canvas = new Algocanvas(); // 画布
setContentPane(canvas);
pack();
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public int getCanvasWidth() {
return canvasWidth;
}
public int getCanvasHeight() {
return canvasHeight;
}
// 内部类自定义画布
private class Algocanvas extends JPanel{
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(50, 50, 300, 300);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(canvasWidth, canvasHeight);
}
}
// 测试
public static void main(String[] args) {
EventQueue.invokeLater( () -> { // lambda表达式
AlgoFrame frame = new AlgoFrame("Welcome", 500, 500);
} );
}
}
三、Graphics2D
对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制;用于在 Java™ 平台上呈现二维形状、文本和图像的基础类。
通过Graphics2D 改写上述画布内部类
private class Algocanvas extends JPanel{
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
Ellipse2D circle1 = new Ellipse2D.Float(50.2f, 50, 300, 300);
g2d.setStroke(new BasicStroke(10));
g2d.setColor(Color.RED);
g2d.draw(circle1);
Ellipse2D circle2 = new Ellipse2D.Float(60.2f, 60, 250, 250);
g2d.fill(circle2);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(canvasWidth, canvasHeight);
}
}
Graphics2D的其他接口
四、自定义绘图工具类AlgoVisHelper
- 线段端点处理
- 线段拐点处理
封装绘图工具,使绘图过程与绘图参数设置分离。
import java.awt.*;
import java.awt.geom.Ellipse2D;
public class AlgoVisHelper {
private AlgoVisHelper(){}
// 设置画笔宽度及样式
public static void setStrokeWidth(Graphics2D g2d, int w) {
int strokeWidth = w;
g2d.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
}
public static void setColor(Graphics2D g2d, Color color) {
g2d.setColor(color);
}
// 绘制空心圆
public static void strokeCircle(Graphics2D g2d, int x, int y, int r){
Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
g2d.draw(circle);
}
// 绘制实心圆
public static void fillCircle(Graphics2D g2d, int x, int y, int r){
Ellipse2D circle = new Ellipse2D.Double(x-r, y-r, 2*r, 2*r);
g2d.fill(circle);
}
}
改写的绘制内部类
private class Algocanvas extends JPanel{
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
AlgoVisHelper.setStrokeWidth(g2d, 5);
AlgoVisHelper.setColor(g2d, Color.RED);
AlgoVisHelper.strokeCircle(g2d, canvasWidth/2, canvasHeight/2, 200);
AlgoVisHelper.setColor(g2d, Color.BLUE);
AlgoVisHelper.fillCircle(g2d, canvasWidth/2, canvasHeight/2, 200);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(canvasWidth, canvasHeight);
}
}
五、抗锯齿和双缓存
- 抗锯齿处理
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON );
g2d.addRenderingHints(hints);
-
双缓存
Jpanel的默认构造函数默认使用了双缓存
public Algocanvas(){ super(isDoubleBuffered:true); }
注: 该文为慕课网课程整理的笔记,若侵权请告知,立删。