关于Java中具有图形表示和绘制自身的对象

时间:2015-03-05 01:31:58

标签: java

我正在尝试创建一个简单的类来制作按钮。

然而,我遇到了一个严重的问题,因为我无法弄清楚如何正确地实现绘制这些按钮。

我在类本身内部有一个paint和update方法,但是,当我在另一个(主)类中创建所述类的对象时,我无法实际运行它,或者以任何其他方式与它交互就此而言。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Buttons extends Canvas implements MouseListener {
    private Graphics g;
    private int xPos, yPos, width, hight;
    private Color DefultBG1;
    private boolean mouseOver, mousePressed;
    private Image im1, im2, im3, buff;
    private static ButtonListener btn;

public Buttons(ButtonListener btn, int x, int y, int width1, int hight1) {
    this.setBounds(x, y, x + width1, y + hight1);
    xPos=x;
    yPos=y;
    width=width1;
    hight=hight1;
    DefultBG1 = new Color(255, 255, 51);
    setBackground(DefultBG1);
    this.btn = btn;
    addMouseListener(this);
}

public void paint(Graphics g) {
        Dimension dim = getSize();
        if (buff == null) {
            buff = createImage(dim.width, dim.height);
            g = buff.getGraphics();
        }

    int bgwidth, bgheight = 0;

    if (mousePressed)
    {
        g.setColor(DefultBG1);
        g.fillRect(0,0,dim.width,dim.height);

        if (im3 != null)
        {
            bgwidth = im3.getWidth(this);
            bgheight = im3.getHeight(this);

            g.drawImage(im3,0,0,width,hight,this);
        }

    }
    else if (mouseOver)
    {
        g.setColor(DefultBG1);
        g.fillRect(0,0,dim.width,dim.height);
        if (im2 != null)
        {
            bgwidth = im2.getWidth(this);
            bgheight = im2.getHeight(this);

            g.drawImage(im2,0,0,width,hight,this);
        }


    }
    else
    {
        g.setColor(DefultBG1);
        g.fillRect(0,0,dim.width,dim.height);
        if (im1 != null)
        {
            bgwidth = im1.getWidth(this);
            bgheight = im1.getHeight(this);

            g.drawImage(im1,0,0,width,hight,this);
        }

    }
    g.drawImage(buff,0,0,this);

}

public void TestImage(int x){

    switch (x) {
    case 1:
        g.drawImage(im1,0,0,width,hight,this);
        break;
    case 2:
        g.drawImage(im2,0,0,width,hight,this);
        break;
    case 3:
        g.drawImage(im3,0,0,width,hight,this);
        break;
    }

}

public void ResizeBounds(int x, int y, int width1, int hight1) {
    this.setBounds(x, y, x + width1, y + hight1);
    xPos=x;
    yPos=y;
    width=width1;
    hight=hight1;
}

public void setImage(Image img, int state) {
    switch (state) {
    case 1:
        this.im1 = img;
        break;
    case 2:
        this.im2 = img;
        break;
    case 3:
        this.im3 = img;
        break;
    default:
        this.im1 = img;
    }

}

public void update(Graphics g) {
    paint(g);
}

@Override
public void mouseClicked(MouseEvent arg0) {
    repaint();

}

@Override
public void mouseEntered(MouseEvent arg0) {
    mouseOver =true;
    setCursor(new Cursor(Cursor.HAND_CURSOR));

    repaint();
}

@Override
public void mouseExited(MouseEvent arg0) {
    mouseOver =false;
    setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

    repaint();
}

@Override
public void mousePressed(MouseEvent arg0) {
    mousePressed = true;

    repaint();
}

@Override
public void mouseReleased(MouseEvent arg0) {
    btn.ButtonEvent(this);
    mousePressed = false;

    repaint();

}

有人可以告诉我如何从其他课程访问这些按钮吗?

编辑:当然,这也是一个普遍的问题 - 你如何制作具有" paint"的类的对象?实际上在其他类中绘制自己(不复制所有对象的所有代码)?

1 个答案:

答案 0 :(得分:1)

绘画是从组件顶部/左侧角的上下文完成的,也就是说,0x0是组件的顶部/左侧位置,这意味着当您需要时,无需计算组件的位置画。

在您当前的绘画代码中,您使用xPosyPos位置进行绘画,这意味着内容已在xPos + xPos x yPos + yPos上绘制...

首先删除xPosyPoswidthhight变量。宽度和高度应通过在需要时调用getWidthgetHeight来计算。

这个private static ButtonListener btn;是一个非常糟糕的主意,这意味着在创建Buttons的所有其他实例时使用的内容无关紧要,只有btn的最后一个值才会永远会收到Buttons

的所有实例的通知

很少有人可以要求重新绘制组件,最好的方法是简单地调用repaint

请查看Painting in AWT and Swing,了解有关绘画在AWT中如何运作的更多详细信息