使用gui创建一个窗口:
public class TestApp {
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);
frame.setVisible(true);
});
}
}
创建一个窗口和面板:
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;
//setSize(canvasWidth, canvasHeight);
AlgoCanvas canvas = new AlgoCanvas();
// canvas.setPreferredSize(new Dimension(canvasWidth,canvasHeight));
setContentPane(canvas);
pack();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
// System.out.println(getContentPane().getBounds());
}
public AlgoFrame(String title){
this(title, 1024, 768);
}
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);
}
}
}
Graphics2D 进行画图操作:
private class AlgoCanvas extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// g.drawOval(50, 50, 300, 300);
Graphics2D g2d = (Graphics2D) g;
int strokeWidth = 5;
g2d.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));//设置线条宽度
g2d.setColor(Color.RED);//设置颜色,直到下次颜色改变
Ellipse2D circle = new Ellipse2D.Double(50, 50, 300, 300);
g2d.draw(circle);
g2d.setColor(Color.BLUE);
Ellipse2D circle2 = new Ellipse2D.Double(50, 50, 300, 300);
g2d.fill(circle2);
}
通过指定圆心、半径来绘制圆形:
public class AlgoVisHelper {
private AlgoVisHelper() {
}
public static void strokeCircle(Graphics2D g, int x, int y, int r) {
Ellipse2D circle = new Ellipse2D.Double(x - r, y - r, 2 * r, 2 * r);
g.draw(circle);
}
public static void fillCircle(Graphics2D g, int x, int y, int r) {
Ellipse2D circle = new Ellipse2D.Double(x - r, y - r, 2 * r, 2 * r);
g.fill(circle);
}
public static void setColor(Graphics2D g, Color color) {
g.setColor(color);
}
public static void setStrokeWidth(Graphics2D g, int w) {
int strokeWidth = w;
/**
* 第一个参数:线条宽度
* 第二个参数:线条末端的形状 原点
* 第三个参数:折点的形状 平滑的圆形
*/
g.setStroke(new BasicStroke(strokeWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
}
}
private class AlgoCanvas extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// g.drawOval(50, 50, 300, 300);
Graphics2D g2d = (Graphics2D) g;
// 抗锯齿
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.addRenderingHints(hints);
// 具体绘制
AlgoVisHelper.setColor(g2d, Color.BLUE);
AlgoVisHelper.fillCircle(g2d, width/2,height/2,200);
AlgoVisHelper.setStrokeWidth(g2d,5);
AlgoVisHelper.setColor(g2d, Color.RED);
AlgoVisHelper.strokeCircle(g2d, width/2,height/2,200);
}
}
public AlgoCanvas(){
// 双缓存
super(true);
}