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

标签 java

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

但是,我遇到了一个严重的问题,因为我不知道如何正确实现绘制这些按钮。

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

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”的类的对象实际上在其他类中绘制自己(而不复制所述对象的所有代码)?

最佳答案

绘画是从组件左上角/左上角的上下文完成的,即 0x0是组件的上/左位置,这意味着您在绘制时不需要计算组件的位置。

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

首先删除 xPos , yPos , widthhight变量。宽度和高度应通过调用 getWidth 来计算和getHeight当您需要它们时。

这个private static ButtonListener btn;是一个非常糟糕的主意,这意味着在创建 Buttons 的所有其他实例时使用什么并不重要。 ,仅 btn 的最后一个值将收到有关 Buttons 的所有实例的通知

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

看看Painting in AWT and Swing有关 AWT 中绘画工作原理的更多详细信息

关于java - 关于 Java 中具有图形表示和自身绘制的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28868457/

相关文章:

Java Doubles 不擅长数学

java - Grails Hibernate session 问题 - 未能延迟初始化集合

java - 设置 JOptionPane.showMessageDialog 显示前面

java - 如果我已经拥有 key (作为字符串),则使用 AES 加密 Windows Phone 8 中的数据

java - Spring Tool Suite:“属性”中的“部署程序集”选项

java - Google Firebase 退出并忘记 Google 帐户

java - Seam - IdentityManager.isUserEnabled() 的问题

java - 检查样式 : always receive File contains tab characters (this is the first instance)

java eclipse 格式化(如果条件不必要的空白)

java - 从智能卡读取数据(CNS/CNR)