Java自定义按钮(不是JButton)问题

时间:2014-09-14 18:10:36

标签: java swing button mouselistener

好吧,那么,我一直想弄清楚的是我如何为我的所有按钮制作一个自定义的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 getXgetXOnScreen吗?顺便说一下,我在我的JFrame上使用frame.addMouseListener注册了ButtonHandler,所以......

编辑2 : 似乎getX方法也不起作用。如果你可以帮助我,我会非常感激。

1 个答案:

答案 0 :(得分:2)

如果要获取按下并绊倒MouseListener的对象,请使用MouseEvent的getSource()方法。例如,可能工作:

public void mouseClicked(MouseEvent e) {
    (YourButton) button = (YourButton) e.getSource();
    button.onClicked(...);

}

其他位:

  • 将您的类从Button重命名为其他类,因为Button名称与java.awt.Button类冲突,这可能导致难以调试错误。
  • 每当我看到一个类中声明了一个Graphics字段时,我就会感到畏缩,因为它表明可能不合适的绘画。如果您使用其中一个作为字段,请确保您确实知道自己在做什么,因为它很容易丢失图像或者如果使用不正确则会出现NullPointerException,因为Graphics对象经常被更改为Java,这种变化完全超出了你(程序员的)控制范围。不要说你没有被警告过。

修改
关于你的意见:

  

是的,我确实知道我在使用图形字段时所做的事情,但是,如果它让你感觉更好,请知道它只是暂时的,我将在以后将其更改为其他内容。

好吧,我以前刚被烧过。只要你从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。