我应该做一个连接的游戏,在网格世界与碎片作为光盘,但我的老师出于某种原因,没有告诉我们任何关于口香糖!因此,我确实查了一下,但我仍然不知道如何在网格中添加一个鼠标侦听器来跟踪鼠标单击。
PS:如果你真的想要片段类的代码,我可以添加它,我很确定World扩展了Jframe。
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
}
}发布于 2014-01-31 21:35:45
不是的。World class的实例变量是:
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并通过以下方法添加鼠标侦听器:
WorldVariableName.frame.addMouseListener(new listener).我一直认为最好在主类中创建一个单独的私有MouseListener类,而不是在主类中实现MouseListener。
发布于 2014-06-06 17:20:56
您可以使用反射绕过可访问性限制,但如果您甚至不需要创建自己的World类,则这完全超出了您的范围。
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的方法,这样我就可以不受限制地使用单击和按键。
https://stackoverflow.com/questions/21471112
复制相似问题