当前位置: 首页 > 知识库问答 >
问题:

对GridLayout的移动限制仅限于相邻的网格按钮

叶鹭洋
2023-03-14
    public boolean goodMove(int x, int y) {

    int val = Math.abs(current.x - x) + Math.abs(current.y - y);

    return val == 1;
}
      public void actionPerformed(ActionEvent e) {

    JButton clicked = (JButton) e.getSource();

    if (clicked == SHOWMINES) {

        if (SHOWMINES.getText().equals("Show Mines")) {
            showMines();
            SHOWMINES.setText("Hide Mines");
        } else {
            hideMines();
        }
    } else {
        if (clicked == NEWGAME) {
            newGame();
        } else {
            if (clicked == SHOWPATH) {
                if (SHOWPATH.getText().equals("Show Path")) {
                    showPath();
                    SHOWPATH.setText("Hide Path");
                } else {
                    hidePath();
                }
            } else {
                if (clicked == OKAY) {
                    resetGridSize(Integer.parseInt(gridSizeInput.getText()));
                    newGame();
                } else {

                }
                int gs = Integer.parseInt(gridSizeInput.getText());
                for (int i = 0; i < gs - 1; i++) {
                    for (int j = 0; j < gs - 1; j++) {
                        if (clicked == grid[i][j]) {
                            if (goodMove(i, j)) {//debug tester ,this is where the problem is.
                                System.out.println("TEST");
                                current = new Point(i, j);
                                grid[i][j].setBackground(Color.green);
                                grid[i][j].setText("=");
                            }else{System.out.println("TEST2");}
                        }
                    }
                }
            }
        }
    }
}// end of action listener

提前致谢(我是编程新手,所以如果可以的话请保持简单:)

编辑:我忘了提,它不识别我的if(goodMove())循环,它只是为我的else打印出两个。

编辑:我的问题是为什么不工作,没有按钮将被识别为点击在我的网格,我猜我是问如果我写的东西是明显的错误。多谢了。

共有1个答案

曾元忠
2023-03-14

您的问题可能很简单,因为您没有将for循环扩展得足够远。请尝试更改以下内容:

for (int i = 0; i < gs - 1; i++) {
    for (int j = 0; j < gs - 1; j++) {

对此:

for (int i = 0; i < gs; i++) {
    for (int j = 0; j < gs; j++) {

编辑
这是我为测试概念而创建的最小代码示例:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.*;

import javax.swing.*;

public class Foo extends JPanel {
   public static final int GRID_SIZE = 10;
   private Point current;
   private JButton[][] grid;

   public Foo() {
      ButtonListener listener = new ButtonListener();
      setLayout(new GridLayout(GRID_SIZE, GRID_SIZE));
      grid = new JButton[GRID_SIZE][GRID_SIZE];
      for (int i = 0; i < grid.length; i++) {
         for (int j = 0; j < grid[i].length; j++) {
            grid[i][j] = new JButton("   ");
            grid[i][j].addActionListener(listener);
            add(grid[i][j]);
         }
      }

      current = new Point(GRID_SIZE - 1, GRID_SIZE - 1);
   }

   private class ButtonListener implements ActionListener {
      public void actionPerformed(ActionEvent e) {
         JButton clicked = (JButton) e.getSource();
         // !! int gs = Integer.parseInt(gridSizeInput.getText());
         int gs = GRID_SIZE;
         // !! for (int i = 0; i < gs - 1; i++) {
         // for (int j = 0; j < gs - 1; j++) {
         for (int i = 0; i < gs; i++) {
            for (int j = 0; j < gs; j++) {

               if (clicked == grid[i][j]) {
                  if (goodMove(i, j)) {
                     System.out.println("TEST");
                     current = new Point(i, j);
                     grid[i][j].setBackground(Color.green);
                     grid[i][j].setText("=");
                  } else {
                     System.out.println("TEST2");
                  }
               }
            }
         }
      }
   }

   public boolean goodMove(int x, int y) {
      int val = Math.abs(current.x - x) + Math.abs(current.y - y);
      return val == 1;
   }

   private static void createAndShowGui() {
      Foo mainPanel = new Foo();
      JFrame frame = new JFrame("Foo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
 类似资料:
  • JVM文档说明short是作为int实现的,所以我想知道使用它是否有好处。它是否使用更少的内存或处理速度更快?

  • 问题内容: 我正在通过migrations.changeColumn函数在迁移中添加一个约束。 添加约束是可行的,但是由于您需要提供Possibly unhandled SequelizeDatabaseError: relation “myAttribute_unique_idx” already exists`。 (使用的数据库是postgres) 我也尝试过使用removeIndex 但是在

  • 问题内容: 我试图在不重新创建存根的情况下编译由IBM的WSDL2Java在Java5上创建的Java 1.4代码,并在Eclipse中看到此错误。我的假设是,只要运行时jar可用(它们存在),生成的存根就应该编译。 完整的班级名称是 这到底是怎么回事?这是我要用香肠重构猪的情况吗?我最好重新创建存根吗? 问题答案: 还有另一个解决方案,也可以。 转到项目属性中的“ 构建路径”设置。 删除JRE系

  • 我设置了滑块的最小值和最大值(例如从1..100开始)。但我有另一个控件,它限制滑块的值范围,比如说从30..60。现在用户应该无法将滑块拇指移动到30以下和60以上,但最小值和最大值仍然应该是1和100。

  • 问题内容: 我在Eclipse中收到以下错误消息: 这是什么意思?在同一主题上还有另一个SO问题,但在这种情况下似乎不适用。我没有创建一个新的Java类,而是尝试使用一个。 问题答案: 猜测您正在使用的另一个库也需要Apache Commons I /O,但是版本不同。拥有一段代码(以传递方式)可以访问同一软件包的两个版本有些棘手。您可能可以安排它,以便您的代码和其他库使用相同的版本。使用CLAS