Как заставить addMouseListener работать с миром GridWorld?

Я должен был сделать 4 игры в gridworld с фигурами в качестве дисков, но мой учитель почему-то ничего не сказал нам о mouselistener! так что я немного поискал, но все еще не могу понять, как добавить прослушиватель мыши в сетку для отслеживания кликов мыши.

PS: Если вам действительно нужен код для класса Piece, я могу добавить его, и я почти уверен, что 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

    }
}

person codyy    schedule 31.01.2014    source источник


Ответы (2)


Нет. Переменная экземпляра класса World:

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, но фактически имеет один, который недоступен, потому что он частный. Однако вы можете создать свой собственный мировой класс, который просто изменяет частный JFrame на защищенный JFrame, а затем расширяет его. Затем вы можете получить доступ к JFrame и добавить прослушиватель мыши, используя

WorldVariableName.frame.addMouseListener(new listener).

P.S. Я всегда считал, что лучше создать отдельный закрытый класс MouseListener в основном классе, чем реализовывать MouseListener в основном классе.

person Spidermaninja    schedule 31.01.2014
comment
Да, но я не могу создать другой класс, я должен использовать этот. так как мне добавить mouselistener и что мне добавить? - person codyy; 01.02.2014
comment
похоже на что? this?:WorldVariableName.frame.addMouseListener(новый слушатель) с реальным именем мировой переменной? Я пробовал это, но этот фрейм является частным, поэтому я не могу получить к нему доступ. Редактировать: так что я не могу добавить mouselistener с тем, что у меня есть? - person codyy; 01.02.2014
comment
Внутри основного класса просто введите частный класс, который реализует MouseListener. Но проблема не в этом. Проблема в том, что настоящий JFrame недоступен, то есть вы не можете ни к чему добавить MouseListener. - person Spidermaninja; 01.02.2014
comment
Да. Вы должны переписать мировой класс. - person Spidermaninja; 01.02.2014
comment
хорошо, есть что-нибудь еще, к чему я могу добавить прослушиватель мыши? что бы вы сделали, если бы у вас было это задание? Например, я могу просто добавить Jframe или что-то в этом роде. - person codyy; 01.02.2014
comment
На вашем месте я бы рассказал учителю о вашей проблеме. Я также мог бы попытаться написать свой собственный класс World, в котором JFrame защищен, а не закрыт. Проблема, однако, в том, что попытка переупаковать все в JAR была бы кошмаром, но вы все равно могли бы пытаться. - person Spidermaninja; 01.02.2014

Вы могли бы использовать Reflection, чтобы обойти ограничения доступности, хотя это выходит за рамки ваших возможностей, если вам даже не требуется создавать свой собственный класс 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, чтобы я мог использовать щелчки и нажатия клавиш без их ограничений.

person Matthew Crocco    schedule 06.06.2014