有没有一种标准的方法来处理java中鼠标事件的许多不同选项?

时间:2009-08-06 21:34:06

标签: java mouse actionlistener

我正在用java开发基于网格的sim游戏,我想知道是否有一种标准的方法来执行以下操作。 我有一个面板,它是游戏面板,单击面板时可能会发生许多不同的事情。例如,在构建房间时,有几个阶段,拖动鼠标和左键单击将有不同的操作。 现在,我这样做的方法是使用布尔值来检查正在构建的内容,然后检查它处于什么阶段。

有没有更好或更标准的方法来处理这样的事情?我有一个快速谷歌,但正如我之前所说,Stack Overflow上的人总是提供更好,更相关,最新的答案。

我认为自己仍然是java的新手。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可能会尝试寻找类似于策略模式的内容。

基本上,您首先点击工具栏上的房间按钮。工具栏通过并告诉网格使用'room place'actionlistener。可能是删除了正在侦听的任何先前的动作侦听器

房间位置actionlistener将依次实现左/右点击,拖动等所有有趣的逻辑。

如果你有多个阶段来建造一个房间(比如,放置门,然后是窗户,然后是门);动作监听器将负责将控制权交给下一阶段:一个有限的状态机。

因此,首先点击“房间”按钮,添加“放置房间”监听器。拖出你想要房间的区域,'放置房间'修改游戏状态,然后将actionlistener更改为'place windows'监听器。无限无疑......直到你完成。

一个非常简单(不可编译)的例子:

class GridPanel extends JPanel
{
    void SetMouseListener(MouseListener newListener)
    {
        for(MouseListener ml : getMouseListeners())
            removeMouseListener(ml);
        addMouseListener(newListener);
    }
}

class ControlPanel extends JPanel
{
    GridPanel gameGrid;

    void OnRectangleButtonClicked(some stuff)
    {
        gameGrid.SetMouseListener(new PlaceRoomListener(gameGrid));
    }
}

class PlaceRoomListener extends MouseAdapter
{
    GridPanel gameGrid;

    //constructor, etc

    void OnClick(mouse event)
    {
        gameGrid.doCoolStuff();
        gameGrid.SetMouseListener(new PlaceTrapDoorListener());
    }
}

//etc

现在,除了不可编辑的例子,Pyrolistical确实有一点:你通常不希望将你的游戏模型和图形界面组合成一个单一的类。您希望模型与GUI分离,并通过定义良好的界面对其进行操作。

(另外,有可能更好的方法来删除鼠标监听器,然后随机删除所有听众......我有点匆忙,抱歉)

答案 1 :(得分:0)

听起来您需要定义游戏模型/状态,并将其与鼠标操作分开。

您使用的是MVC吗?