首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让addMouseListener与GridWorld的世界一起工作?

如何让addMouseListener与GridWorld的世界一起工作?
EN

Stack Overflow用户
提问于 2014-01-31 01:47:07
回答 2查看 673关注 0票数 0

我应该做一个连接的游戏,在网格世界与碎片作为光盘,但我的老师出于某种原因,没有告诉我们任何关于口香糖!因此,我确实查了一下,但我仍然不知道如何在网格中添加一个鼠标侦听器来跟踪鼠标单击。

PS:如果你真的想要片段类的代码,我可以添加它,我很确定World扩展了Jframe。

代码语言:javascript
复制
import java.awt.Color;    
import java.util.ArrayList;

import info.gridworld.grid.Grid;
import info.gridworld.grid.Location;
import info.gridworld.world.World;
import info.gridworld.grid.BoundedGrid;

import java.awt.MouseInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class ConnectFourWorld extends World<Piece> implements MouseListener
{
   private String whosTurn;
   private boolean gameOver;
   private String winner;
   Piece X = new Piece("ex", Color.WHITE, Color.RED);
   Piece O = new Piece("oh", Color.YELLOW, Color.BLUE);


   public ConnectFourWorld()
   {
    super(new BoundedGrid<Piece>(6,7));

    winner="no winner";
    whosTurn="X";
    gameOver=false;
      setMessage("Welcome to Connect Four World!  - -  Click a spot - "+whosTurn+"'s             turn.");           
   }

   public boolean locationClicked(Location loc)
   {
        Grid<Piece> grid = getGrid();
      if(grid == null)
        return false;

      if(grid.get(loc)!=null)
        return false;

      if(gameOver == true)
      {

        return false;
      }



      return true;  
   }

   public Location addPiece(Location loc)
   {

      return null;  
   }

  public void step()
   {    
   }

   public boolean isWorldFull()
   {
    return false;
   }

   public void resetWorld()
   {
   }

   public String getWinner(Location loc)
   {
        return "";
   }

@Override
public void mouseClicked(MouseEvent e) {
    if(e.getButton()==1&&whosTurn.equals("X")){

    }
}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-31 21:35:45

不是的。World class的实例变量是:

代码语言:javascript
复制
public class World<T>
{
    private Grid<T> gr;
    private Set<String> occupantClassNames;
    private Set<String> gridClassNames;
    private String message;
    private JFrame frame;

    private static Random generator = new Random();

    private static final int DEFAULT_ROWS = 10;
    private static final int DEFAULT_COLS = 10;
    ...
}

事实上,World不是一个JFrame,但实际上有一个,这是无法访问的,因为它是私有的。但是,您可以创建您自己的world类,它只将私有JFrame更改为受保护的JFrame,然后对其进行扩展。然后,可以访问JFrame并通过以下方法添加鼠标侦听器:

代码语言:javascript
复制
WorldVariableName.frame.addMouseListener(new listener).

我一直认为最好在主类中创建一个单独的私有MouseListener类,而不是在主类中实现MouseListener。

票数 0
EN

Stack Overflow用户

发布于 2014-06-06 17:20:56

您可以使用反射绕过可访问性限制,但如果您甚至不需要创建自己的World类,则这完全超出了您的范围。

代码语言:javascript
复制
Fields[] fields = World.class.getDeclaredFields();

for(Field f: fields){
    if(f.getName().equalsIgnoreCase("frame")){
        try{
            f.setAccessible(true);
            JFrame frame = (JFrame) f.get(worldInstance);
            f.setAccessible(false);
            return frame;
        }catch(IllegalArgumentException | IllegalAccessException e){
            e.printStackTrace();
        }
   }
}

return null;

这就是我用武力抓取JFrame的方法,这样我就可以不受限制地使用单击和按键。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21471112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档