Java Swing GUI 编程基础

  • 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);
    }
    

注: 该文为慕课网课程整理的笔记,若侵权请告知,立删。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值