我正在尝试创建一个简单的类来制作按钮。
然而,我遇到了一个严重的问题,因为我无法弄清楚如何正确地实现绘制这些按钮。我在类本身内部有一个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"的类的对象?实际上在其他类中绘制自己(不复制所有对象的所有代码)?
答案 0 :(得分:1)
绘画是从组件顶部/左侧角的上下文完成的,也就是说,0x0
是组件的顶部/左侧位置,这意味着当您需要时,无需计算组件的位置画。
在您当前的绘画代码中,您使用xPos
和yPos
位置进行绘画,这意味着内容已在xPos + xPos
x yPos + yPos
上绘制...
首先删除xPos
,yPos
,width
和hight
变量。宽度和高度应通过在需要时调用getWidth
和getHeight
来计算。
这个private static ButtonListener btn;
是一个非常糟糕的主意,这意味着在创建Buttons
的所有其他实例时使用的内容无关紧要,只有btn
的最后一个值才会永远会收到Buttons
很少有人可以要求重新绘制组件,最好的方法是简单地调用repaint
。
请查看Painting in AWT and Swing,了解有关绘画在AWT中如何运作的更多详细信息