0

我们的小组项目是使用 Java Eclipse 创建一个滑动益智游戏。我们有代码来创建一个具有相同图片的 3x3 网格(它应该是一张图片,但分成 9 块,但稍后会很好地学习)。我的部分是创建一个鼠标侦听器,该侦听器单击选定的“磁贴”,然后显示一条消息测试以查看是否正确单击了选定的磁贴。(例如:如果用户单击 tile 1,消息显示“tile 1 is clicked”)我想我必须为每个 tile 创建单独的鼠标侦听器。有什么建议么?

继承人的代码:

   import javax.swing.*;
   import javax.swing.event.*;
   import java.awt.*;
   import java.awt.event.*;

   public class Puzzle 
   {
// Initialize the Frame for the Puzzle
private JFrame frame = new JFrame("Puzzle");
private JPanel puzzlePanel = new JPanel( null );
private JLabel status;


// Itemize Menu
private JMenuBar menu = new JMenuBar();
private JMenu menuFile = new JMenu("File");
private JMenuItem menuFileNew = new JMenuItem("New Game");
private JMenuItem menuFileQuit = new JMenuItem("Quit");
private JMenu menuHelp = new JMenu("Help");
private JMenuItem menuHelpAbout = new JMenuItem("About");

// Variables
// Easy(3) Medium(4) Hard(5)
private int dimm = 3;
private int spacing = 5;
private int tileDimm = 96;

// Constructor
public Puzzle() 
{
    status = new JLabel("Default");
    frame.add(status,BorderLayout.SOUTH);


    // Build Menu
    frame.setJMenuBar(menu);
    menuFile.add(menuFileNew);
    menuFile.add(menuFileQuit);
    menuHelp.add(menuHelpAbout);
    menu.add(menuFile);
    menu.add(menuHelp);

    // Panel
    puzzlePanel.setPreferredSize(new Dimension((dimm*tileDimm)+(spacing*(dimm+1)),(dimm*tileDimm)+(spacing*(dimm+1))) );
    frame.add(puzzlePanel);

    // Puzzle Logic
    PuzzleLogic puzzleLogic = new PuzzleLogic(dimm);



    Tile[][] tiles = puzzleLogic.createTileArray();
    puzzleLogic.shuffleTiles(tiles);
    for(int i = 0; i < dimm; i++) 
    {
        for(int ii = 0; ii < dimm; ii++) 
        {
            puzzlePanel.add(tiles[i][ii].getLabel());
            int x = i*tileDimm+(spacing*(i+1));
            int y = ii*tileDimm+(spacing*(ii+1));
            tiles[i][ii].getLabel().setBounds(x,y,tileDimm,tileDimm);

            System.out.print(tiles[i][ii].getContent() + " ");
        }
    }

    HandlerClass handler = new HandlerClass();
    puzzlePanel.addMouseListener(handler);
}

// create listener - inner class
class HandlerClass implements MouseListener
{

    public void mouseClicked(MouseEvent e)
    {

        status.setText(String.format("Tile 1 is clicked"));
    }

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

    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
        status.setText(String.format(" "));

    }

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

    }

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

}

public void launch() 
{
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack(); //Adjusts panel to components for display
    frame.setVisible(true);
    frame.setResizable(false);
}

// Calls Everything to Action
public static void main(String[] args) 
{
    Puzzle puzzle = new Puzzle();
    puzzle.launch();
}

}

4

2 回答 2

1

您已经编写的代码为整个谜题提供了一个侦听器。因此,在mouseClicked处理程序中,您可以计算鼠标相对于拼图中位置的位置,计算它是否位于顶部/底部/中间三分之一和左侧/右侧/中间三分之一,然后您可以从那里计算出玩家点击了哪一块?

您可以使用e.getX()和获取鼠标位置的坐标e.getY()

于 2013-03-14T04:29:07.443 回答
0

您可以获取鼠标单击的 X 和 Y 坐标,然后分别除以宽度和高度,您可以获得块编号.. 但它会返回 X: 0,1,2 Y:0,1,2 [对于 3x3 块] ..所以请确保在最后添加一个(+1)。您的代码看起来像:

Xblock = event.getX()/blockwidth + 1;同样对于 Y

您可能需要获取边框宽度和其他内容才能获得正确的单击位置,以使拼图的左上角为 0,0;

于 2013-03-14T04:43:53.543 回答