好吧,那么,我一直想弄清楚的是我如何为我的所有按钮制作一个自定义的MouseListener,它不需要在Handler中列出每一个按钮,因为我' m会有很多他们。以下是我在Listener中的代码:
package com.dinobuilding.handler;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import com.BLANK.BLANKScreen;
import com.BLANK.BLANKWindow;
import com.BLANK.menufeature.Button;
public class ButtonHandler implements MouseListener {
public BLANKWindow dbw;
public BLANK Screen dbs;
static Button button = new Button();
public int buttonX = button.x;
public int buttonY = button.y;
public int buttonSizeX = button.xSize;
public int buttonSizeY = button.ySize;
public ButtonHandler(BLANKWindow dbw, BLANKScreen dbs) {
this.dbw = dbw;
this.dbs = dbs;
}
public static void setButton(Button b) {
button = b;
}
public int mouseEventX;
public int mouseEventY;
Graphics g;
public void mouseClicked(MouseEvent e) {
mouseEventX = e.getLocationOnScreen().x;
mouseEventY = e.getLocationOnScreen().y;
if(mouseEventX <= buttonX && mouseEventX >= buttonX + buttonSizeX) {
if(mouseEventY <= buttonY && mouseEventY >= buttonY + buttonSizeY) {
button.onClicked(dbs, dbw, g);
}
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
以下是我尝试实施的第一个按钮中的代码:
package com.BLANK.menus;
import java.awt.Color;
import java.awt.Graphics;
import com.BLANK.BLANKScreen;
import com.BLANK.BLANKWindow;
import com.BLANK.handler.ButtonHandler;
import com.BLANK.menufeature.Button;
public class MainMenuPlayButton extends Button {
public static int x;
public static int y;
public static int xSize;
public static int ySize;
public static String s;
public static Graphics g;
public MainMenuPlayButton(int x, int y, int xSize, int ySize, String s, Graphics g) {
super(x, y, xSize, ySize, s, g);
this.x = x;
this.y = y;
this.xSize = xSize;
this.ySize = ySize;
this.s = s;
this.g = g;
setColor(new Color(0, 226, 26));
draw();
}
public MainMenuPlayButton() {
}
public static void draw() {
drawButton(x, y, xSize, ySize, g, s);
ButtonHandler.setButton(new MainMenuPlayButton());
}
public void onClicked(BLANKScreen dbs, BLANKWindow dbw, Graphics g) {
setColor(new Color(216, 0, 0));
}
我认为我的主要问题是ButtonHandler中的代码在Button类中的代码之前被调用,因此ButtonHandler正在使用Button类本身,而不是MainMenuPlayButton类。如果您还需要Button类,只需告诉我,但我无法想象为什么。提前谢谢!
修改
好的,经过调试后,我发现事实上我遇到了相反的问题。永远不会点击该按钮。 getSource()
方法可行,但我并不知道如何使用它,我不认为我可以使用它而无需对每个按钮进行硬编码,这实际上是我不想要的要做。
编辑1 :
您认为我可以使用MouseEvent getX
或getXOnScreen
吗?顺便说一下,我在我的JFrame上使用frame.addMouseListener注册了ButtonHandler,所以......
编辑2 :
似乎getX
方法也不起作用。如果你可以帮助我,我会非常感激。
答案 0 :(得分:2)
如果要获取按下并绊倒MouseListener的对象,请使用MouseEvent的getSource()方法。例如,可能工作:
public void mouseClicked(MouseEvent e) {
(YourButton) button = (YourButton) e.getSource();
button.onClicked(...);
}
其他位:
修改强>
关于你的意见:
好吧,我以前刚被烧过。只要你从BufferedImage获得它并且不试图通过在组件上调用getGraphics()或通过从paint或paintComponent方法中取出它来获得它,那么你可能没问题。是的,我确实知道我在使用图形字段时所做的事情,但是,如果它让你感觉更好,请知道它只是暂时的,我将在以后将其更改为其他内容。
另外,我非常确定我正确地获取了它所点击的对象,但我无法访问Button的正确子类。它只获取Button类本身,而不是MainMenuPlayButton。
很抱歉,但这没有任何意义,因为你没有获得&#34;课程&#34;当你获得一个引用时,一个纯粹而简单的对象,实际上你会得到一个与ButtonListener相同的对象,并且它会使监听器跳闸,而这个引用的类将是你的按钮所在的类。我假设你将MouseListener直接添加到你的&#34; Button&#34;对象,对吗?再次,是时候做一些调试了。
编辑2
关于您问题的最新修改:
好的,经过调试后,我发现事实上我遇到了相反的问题。永远不会点击该按钮。 getSource()方法可以工作,但我真的不知道如何使用它,我不认为我可以使用它而不需要对每个按钮进行硬编码,这实际上是我不想做的事情
不,没有必要对每个按钮进行硬编码,相信我。这就是使用添加到按钮的侦听器的全部原因。
编辑1:您认为我可以使用MouseEvent的getX或getXOnScreen吗?顺便说一下,我在我的JFrame上使用frame.addMouseListener注册了ButtonHandler,所以......
你的一个问题。如果你想听你的按钮,你会想要能够在按钮上注册听众。如果你有一个数组或集合,那么注册监听器很容易。不,我不建议在屏幕上使用x和y,因为这会使你的程序非常脆弱。如果您这样做,对GUI结构的任何更改都需要对x和y处理进行后续硬编码更改。啊。
这引出了为什么要创建自己的Button类,以及为什么不使用JButtons或JButtons的子类。你似乎正在重新发明轮子,但(抱歉是直言不讳)创造一个正方形。
编辑3
但是你把变量转换成了一个按钮,这意味着如果我有多个按钮,我必须将它们中的每一个投射到不同的东西。
绝对不是因为多态的魔力应该在这里起作用。但他们是同类型的对象,不是吗?或者你有许多不同的Button类子类?而且,无论在mouseClicked(...)
方法内部,您似乎只想在按钮上调用一个方法onClicked(...)
,我想这必须是超类的对象,对吧?因此,通过在当前按钮上调用此方法,它应该调用自己正确的代码。
我对JButton的问题是它们已经存在。我无法对其进行编辑,我无法对其进行自定义,...
这显然不是真的。您可以通过多种方式更改其外观和行为,包括通过子类化或工厂创建方法。此外,他们已经配备了能够注册听众并响应鼠标操作的机器。
...另外,我是否必须为每个按钮注册/创建一个新的处理程序?
同样,你似乎忘记了多态性应该处理所有这些。一个处理程序应该,具体取决于您的代码表现如何。
我将有很多按钮,我不认为这将是一个可行的解决方案。如果没有,
getX
如果点击这个东西,我该如何做呢?
我已经向您推荐了我的建议,除非有时候如果可以改进设计,最好重新编写代码段,这意味着您可能需要考虑改进代码以使用JButton。