【问题标题】:Java mvc get view mouse events in modelJava mvc在模型中获取查看鼠标事件
【发布时间】:2015-12-28 22:22:46
【问题描述】:

在我当前的项目中,我尝试实现 MVC 模式并在我的模型中获取鼠标事件。我目前有:(删除了一些代码以使其更具可读性)

我的模型

public class Game {
    public void checkMouseEvents(ArrayList<MouseEvent> events){

        for (MouseEvent mouseEvent : events) {
            System.out.println(mouseEvent.getX() + "," + mouseEvent.getY());
        }
    }
}

我的控制器

public class GameController {
    boolean notClosed = true;
    GameView myView;
    Game myGame;
    boolean _running = true;
    public GameController(){
        myView = new GameView();
        myGame = new Game();
        Run();
    }

    public void Run(){
        myGame.start();
        while(notClosed){
            checkActive();
            if(_running)
            {
                myGame.checkMouseEvents(myView.getMouseEvents());               
            }

            try {
                Thread.sleep(1000/20);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }

    }
    public void checkActive(){
        _running = myView.getRunning();
    }


}

我的视图

public class GameView implements ActionListener{
    JFrame frame;
    JButton button;
    boolean _running = true;
    MyDrawing drawing;
    ArrayList<MouseEvent> mouseEvents;

    public GameView(){
        frame = new JFrame("Hunter");
        button = new JButton(""+_running);
        button.addActionListener(this);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mouseEvents = new ArrayList<MouseEvent>();
        drawing = new MyDrawing();
        drawing.addMouseListener(new MouseAdapter() {// empty implementation of all
                // MouseListener`s methods
                @Override //I save the mouseclick in an array
                public void mousePressed(MouseEvent e) {
                    mouseEvents.add(e);
                }
            });
        frame.getContentPane().add(BorderLayout.SOUTH,button);
        frame.getContentPane().add(BorderLayout.CENTER,drawing);
        frame.setResizable(false);
        frame.setSize(800,600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }




    @Override
    public void actionPerformed(ActionEvent e) {
        handleClick();

    }

    public boolean getRunning(){
        return _running;
    }

    public void handleClick(){
        if(_running)
            _running = false;
        else 
            _running =true; 

        frame.repaint();
    }

    public void Render(){
        frame.repaint();
    }

    public ArrayList<MouseEvent> getMouseEvents(){
        ArrayList<MouseEvent> copy = mouseEvents;
        // command below returns the right amount
        // System.out.println(copy.size());
        mouseEvents.clear();
        return copy;

    }

}

总之,在我看来,如果用户点击 jpanel,我会观察,如果用户点击,则将其保存在数组中。

在我的控制器中,我每 1/20 秒执行一次 while 循环,将鼠标点击传递给我的模型。

在我的模型中,我尝试记录所有鼠标事件位置。

我知道我可以改进游戏循环并且线程被认为是不好的做法,但它不是关于循环,而是关于传递数据。

但是程序不写鼠标位置。如果我在 checkMouseEvent 中放置一个 printLine,我可以看到它被调用。我的问题是,当使用 mvc 模式时,我如何获得在模型视图中单击的位置?

【问题讨论】:

  • 引用了一些关于 Swing 控制器的常见问答 here

标签: java swing model-view-controller


【解决方案1】:

原来复制数组并清除原始数据也会清除副本。 How to make a separated copy of an ArrayList? 这就是我遇到的问题。我变了

public ArrayList<MouseEvent> getMouseEvents(){
    ArrayList<MouseEvent> copy = mouseEvents;
    // command below returns the right amount
    // System.out.println(copy.size());
    mouseEvents.clear();
    return copy;

}


   public ArrayList<MouseEvent> getMouseEvents(){
        ArrayList<MouseEvent> copy = new ArrayList<MouseEvent>();
        for (MouseEvent mouseEvent : mouseEvents) {
            copy.add(mouseEvent);
        }
        mouseEvents.clear();
        return copy;

    }

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2011-02-16
    • 2016-03-05
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多