gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:50:03 27 4
gpt4 key购买 nike

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

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

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com