【发布时间】: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