java - java中是否有一个标准的方法来处理鼠标事件的许多不同选项?

标签 java mouse actionlistener

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

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

我认为自己对 java 还很陌生。

提前致谢。

最佳答案

您可以尝试研究类似于策略模式的东西。

基本上,您首先单击工具栏上的房间按钮。工具栏遍历并告诉网格使用“房间位置” Action 监听器。大概删除任何先前正在监听的操作监听器

房间位置 Action 监听器将依次实现左/右单击、拖动等所有有趣的逻辑。

如果您有多个阶段来 build 一个房间(例如,先放置门,然后放置 window ,然后放置活板门); Action 监听器将负责将控制权移交给下一阶段:有点像有限状态机。

因此,首先单击“房间”按钮,添加“放置房间”监听器。拖出您想要房间所在的区域,“放置房间”修改游戏状态,然后将 Action 监听器更改为“放置窗口”监听器。无限循环...直到您完成。

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

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 分离,并通过定义良好的界面来操作它。

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

关于java - java中是否有一个标准的方法来处理鼠标事件的许多不同选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1241633/

相关文章:

javascript - 鼠标监听器位于某个对象(如 swf)上时?

java - 在 Java 中捕获(捕获)窗口中的鼠标光标

java - 使用 Action 监听器在文本字段中将 double 显示为整数

java - 用于选择文件并将文本读入 GUI 的按钮 (JTextArea)

java - 为什么 "client"包中的类在服务器上工作正常?

java - 使用按键在 JPanel 中 move 矩形

java - 如何合并具有相同/公共(public)字段的对象?

java - java输入法——准备面试

emacs - 如何让 Emacs 鼠标滚动更慢、更流畅?

java - 从 Action 监听器获取答案