利用Swing在窗体上绘制线条与文字(二)——绘制简单形状

效果

在这里插入图片描述

代码:

TestFrame.java:

package Test;


import javax.swing.*;
import java.awt.*;

public class TestFrame extends JFrame {
    public TestFrame(){
          setLayout(new GridLayout(2,3,5,5));
          add(new FigurePanel(FigurePanel.LINE));
          add(new FigurePanel(FigurePanel.RECTANGLE));
          add(new FigurePanel(FigurePanel.ROUND_RECTANGLE));
          add(new FigurePanel(FigurePanel.OVAL));
          add(new FigurePanel(FigurePanel.RECTANGLE,true));
          add(new FigurePanel(FigurePanel.ROUND_RECTANGLE,true));


    }

    public static void main(String[] args) {
        TestFrame frame=new TestFrame();
        frame.setTitle("TestFigurePanel");
        frame.setSize(400,200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

FigurePanel.java:

package Test;

import javax.swing.*;
import java.awt.*;

public class FigurePanel extends JPanel {
    public static final int LINE=1;
    public static final int RECTANGLE=2;
    public static final int ROUND_RECTANGLE=3;
    public static final int OVAL=4;

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
        repaint();
    }

    private int type=1;

    public boolean isFilled() {
        return filled;
    }

    public void setFilled(boolean filled) {
        this.filled = filled;
        repaint();
    }

    private boolean filled=false;

    public FigurePanel(){

    }
    public FigurePanel(int type){
        this.type=type;
    }
    public FigurePanel(int type,boolean filled){
        this.type=type;
        this.filled=filled;
    }
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        int width=getWidth();
        int height=getHeight();

        switch(type){
            case LINE:
                g.setColor(Color.BLACK);
                g.drawLine(10,10,width-10,height-10);
                g.drawLine(width-10,10,10,height-10);
                break;
            case RECTANGLE:
                g.setColor(Color.BLUE);
                if(filled)
                    g.fillRect((int)(0.1*width),(int)(0.1*height),
                            (int)(0.8*width),(int)(0.8*height));
                else
                    g.drawRect((int)(0.1*width),(int)(0.1*height),
                            (int)(0.8*width),(int)(0.8*height));
                break;
            case ROUND_RECTANGLE:
                g.setColor(Color.RED);
                if(filled)
                    g.fillRoundRect((int)(0.1*width),(int)(0.1*height),
                            (int)(0.8*width),(int)(0.8*height),20,20);
                else
                    g.drawRoundRect((int)(0.1*width),(int)(0.1*height),
                            (int)(0.8*width),(int)(0.8*height),20,20);
                break;
            case OVAL:
                g.setColor(Color.BLACK);
                if(filled)
                    g.fillOval((int)(0.1*width),(int)(0.1*height),(int)(0.8*width),(int)(0.8*height));
                else
                    g.drawOval((int)(0.1*width),(int)(0.1*height),(int)(0.8*width),(int)(0.8*height));

        }
    }
    public Dimension getPreferredSize(){
        return new Dimension(80,80);
    }
}

讲解:

 add(new FigurePanel(FigurePanel.LINE));

这里面的FigurePanel.LINE在FigurePanel类里面已经定义了若干个常量。

   public static final int LINE=1;
   public static final int RECTANGLE=2;
   public static final int ROUND_RECTANGLE=3;
   public static final int OVAL=4;

方便下面的case选择。

在FigurePanel类里面,有两个私有成员,一个是type,一个是filled,type就是上面定义的四个常量,取值范围是1~4的整数,filled是一个boolean类型成员,即是否填充。

给成员变量填上getter和setter方法。

  switch(type)

开始选择要绘制的图像的类型,在case里面,如果选择的未填充的图形,那么会采用draw_type来绘制图形。

 case LINE:
            g.setColor(Color.BLACK);
            g.drawLine(10,10,width-10,height-10);
            g.drawLine(width-10,10,10,height-10);
            break;

例如选择绘制直线,这里会绘制一个交错的直线。颜色是随意的,这里的width和height就是

 public static void main(String[] args) {
    TestFrame frame=new TestFrame();
    frame.setTitle("TestFigurePanel");
    frame.setSize(400,200);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

里面的高和宽。

case OVAL:
            g.setColor(Color.BLACK);
            if(filled)
                g.fillOval((int)(0.1*width),(int)(0.1*height),(int)(0.8*width),(int)(0.8*height));
            else
                g.drawOval((int)(0.1*width),(int)(0.1*height),(int)(0.8*width),(int)(0.8*height));

如果想要绘制椭圆,首先会判断是否填充,如果是填充的,就会调用fill_type来绘制,反之调用draw_oval绘制一个空心的。

    repaint();

repaint这个方法是在Component类里面定义的,调用repaint方法会导致paintComponent方法被调用,即刷新视图。一般情况下,如果要显示新的东西,就要调用这个方法。

public Dimension getPreferredSize(){
    return new Dimension(80,80);
}

Dimension类是封装单个对象中组件的宽度和高度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值