代码之家  ›  专栏  ›  技术社区  ›  Relequestual

在Java中是否有一种处理鼠标事件的不同选项的标准方法?

  •  0
  • Relequestual  · 技术社区  · 16 年前

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

    有没有更好或标准的方法来处理类似的事情?我有一个快速的谷歌,但正如我之前所说,人们在栈溢出总是给出一个更好,更相关,最新的答案。

    我认为自己对Java仍然很陌生。

    事先谢谢。

    2 回复  |  直到 16 年前
        1
  •  3
  •   CoderTao    16 年前

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

    基本上,首先单击工具栏上的“房间”按钮。工具栏通过并告诉网格使用“room place”actionListener。可能删除了以前正在侦听的任何操作侦听器

    RoomPlaceActionListener将依次实现左/右键单击、拖动等所有有趣的逻辑位。

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

    因此,首先单击“房间”按钮,添加“放置房间”侦听器。拖出你想要房间的区域,“PlaceRoom”修改游戏状态,然后将ActionListener更改为“PlaceWindows”侦听器。无限大…直到你完成。

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

    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
    

    现在,撇开不可编译的例子不谈,火爆的确实有一点:你通常不想把你的游戏模型和图形界面组合成一个单一的类。您希望模型与GUI分离,并通过一个定义良好的接口来操作它。

    (另外,可能还有更好的方法来删除鼠标监听器,然后随机删除所有监听器…我有点着急,对不起)

        2
  •  0
  •   Pyrolistical    16 年前

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

    你在使用MVC吗?

    推荐文章