画板的重绘
这一周学习了画板以及画板的重绘。
画板就是针对JFrame的掌握,还有获取画布graphics,在画布上进行绘图。主要掌握MouseListener和ActinListener接口的使用。
1.画板的完成及理解
创建窗体->添加按钮->添加事件->对象间相互调用
2.画板重绘关键点
1.定义一个JFrame的子类,重写JFrame父类的paint函数
2.要讲图形存放到队列里
3.在paint函数中将队列中保存的图形重新绘制
重绘要使用自定义队列,所以要创建一个自定义的队列,来存放所画的图形。每一次对窗口的缩小或者别的使用,在显示窗口时就调用重绘。
package cn.java.hsm;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.JButton;
import javax.swing.JFrame;
public class DrawTest extends JFrame {
//自定义队列
private MyArray array = new MyArray();
//paint的方法
public void paint(Graphics g){
super.paint(g);//super关键字
int x1,x2,y2,y1;
String type = "line";
//即重新绘制,画板的重绘,以数组的形式保存图形并重新绘制
for(int i = 0; i < array.getLength(); i++)
{
shape sp= array.getAdd(i);
x1=sp.getX1();
y1=sp.getY1();
x2=sp.getX2();
y2=sp.getY2();
type = sp.getType();
if(type=="line"){
g.drawLine(x1, y1, x2, y2);
}
if(type=="oval"){
g.drawOval(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}
if(type=="rect"){
g.drawRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}
}
}
public static void main(String[] args)
{
DrawTest dt = new DrawTest();
dt.showUI();
}
//showUI的方法
public void showUI()
{
this.setTitle("简单画板");
this.setSize(600,550);
this.setDefaultCloseOperation(3);
this.setLayout(new FlowLayout());
//添加按钮
JButton jButtonLine = new JButton("line");
JButton jButtonOval = new JButton("oval");
JButton jButtonRect = new JButton("rect");
JButton jButtonColor = new JButton("color");
this.add(jButtonColor);
this.add(jButtonLine);
this.add(jButtonOval);
this.add(jButtonRect);
//使其窗口可见
this.setVisible(true);
Graphics g = this.getGraphics();//获取画布
MouseListenerImpl mouseListenerImpl= new MouseListenerImpl(g, array) ;
this.addMouseListener(mouseListenerImpl);//画板上添加监听器
ActionListenerImpl actionListenerImpl = new ActionListenerImpl(mouseListenerImpl);
jButtonLine.addActionListener(actionListenerImpl);
jButtonOval.addActionListener(actionListenerImpl);
jButtonRect.addActionListener(actionListenerImpl);//按钮上添加监听器
jButtonColor.addActionListener(actionListenerImpl);
}
}
-----------------------------------------------------
package cn.java.hsm;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class MouseListenerImpl implements MouseListener{
private Graphics g;
private int x1;
private int y1;
private int x2;
private int y2;
private String type = "line";
private MyArray array;
public MouseListenerImpl(Graphics g, MyArray array) {
this.g = g;
this.array = array;
}
public void mouseClicked(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
x1=e.getX();
y1=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
x2=e.getX();
y2=e.getY();
if(type.equals("line")){
g.drawLine(x1, y1, x2, y2);
}
if(type.equals("oval")){
g.drawOval(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}
if(type.equals("rect")){
g.drawRect(x1, y1, Math.abs(x1-x2), Math.abs(y1-y2));
}
shape a= new shape(x1, y1, x2, y2, type);
array.add(a);
}
public void setType(String type) {
this.type = type;
}
}
-----------------------------------------------------------------
package cn.java.hsm;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class ActionListenerImpl implements ActionListener{
private MouseListenerImpl mouseListenerImpl ;
//构造函数
public ActionListenerImpl(MouseListenerImpl mouseListenerImpl ){
this.mouseListenerImpl = mouseListenerImpl;
}
public void actionPerformed(ActionEvent e)
{
JButton button = (JButton) e.getSource();
mouseListenerImpl.setType(button.getText());
}
}
--------------------------------------------------------------
package cn.java.hsm;
public class MyArray {
//自定义队列
private shape[] old = new shape[0];
public void add(shape a){
shape[] newly = new shape[old.length+1];
newly[old.length] = a;
for(int i=0;i<old.length;i++){
newly[i] = old[i];
}
old = newly;
}
public shape getAdd(int i){
return old[i];
}
public int getLength(){
return old.length;
}
}
--------------------------------------------------------------
package cn.java.hsm;
public class shape {
private int x1;
private int x2;
private int y1;
private int y2;
private String type;
//构造函数
public shape(int x1,int y1,int x2,int y2, String type){
this.x1=x1;
this.x2=x2;
this.y1=y1;
this.y2=y2;
this.type=type;
}
public int getX1() {
return x1;
}
public void setX1(int x1) {
this.x1 = x1;
}
public int getX2() {
return x2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getY1() {
return y1;
}
public void setY1(int y1) {
this.y1 = y1;
}
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}