效果
代码:
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类是封装单个对象中组件的宽度和高度