使用 getActionCommand String 将字符串子字符串化为行和列

Using getActionCommand String to substring into a row and column

我正在执行一项任务,我使用 Java 创建一个 GUI。目前,我正在为扫雷制作布局 - 但我对这种方法的说明有点困惑。

说明如下:

mousePressed 方法

这就是我想要的mousePressed()

    public void mousePressed(MouseEvent b)
    {
        
        Component a = b.getComponent(); 
        JButton x = (JButton)a;
        System.out.println(x.getActionCommand());
        String s = x.getActionCommand();
        // substring for row and col
        // set text
    }

最后两个怎么办?特别是

break the actionCommand String into a row and column

set the button text of the row and column to "!"

有了子字符串,我该如何将 actionCommand 字符串“分解”成一行和一列? (休息不是字面上的意思)。带有开始索引和结束索引的字符串的子字符串 returns 部分,但是我将使用来自 actionCommand 的哪个字符串作为子字符串?我将如何设置行和列以将文本显示为“!”?我是否也需要为此使用子字符串?

这是我到目前为止的布局的全部代码。

import java.awt.GridLayout;
import java.awt.Component;
import java.awt.Label;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class GridOfButtons extends JFrame implements MouseListener
{
    private JButton [][] grid;

    public GridOfButtons()
    {
        grid = new JButton[10][10];
        BuildGUI();
    }
    
    public void BuildGUI()
    {
        setSize(1200, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(10, 10));
        setVisible(true);

        for(int r = 0; r < grid.length; r++)
        {
            for(int c = 0; c < grid[r].length; c++)
            {
                grid[r][c] = new JButton("*");
                grid[r][c].setActionCommand(r + ":" + c);
                addMouseListener(this);
                getContentPane().add(grid[r][c]);
            }
        }
    }

    public void mouseClicked(MouseEvent b)
    {
    }

    public void mouseEntered(MouseEvent b)
    {
    }

    public void mouseExited(MouseEvent b)
    {
    }

    public void mouseReleased(MouseEvent b)
    {
    }   

    public void mousePressed(MouseEvent b)
    {
        
        Component a = b.getComponent(); 
        JButton x = (JButton)a;
        System.out.println(x.getActionCommand());
        String s = x.getActionCommand();
        // substring for row and col
        // set text
    }

    public static void main(String[] args)
    {
        new GridOfButtons();
    }
}

这些也是我遵循的说明:

创建一个 class,它是使用接口 MouseListener 的 JFrame 的子class:

实例变量:

默认构造函数:

GUI 生成器方法:

鼠标按下方法:

我不能严格遵守文本(我正在添加说明中未阐明的其他代码行),但我也不能做任何太高级的事情,因为我在限制条件下工作.

我知道,对于作业,您通常只能使用到目前为止所学的东西。因此,我了解到您只能使用方法 substring(属于 class java.lang.String)来操作每个 JButton 的文本。 (我希望你也可以使用方法 indexOf 因为我在下面的代码中使用了它。)

除了更改 JButton 文本的 [缺失] 代码外,您的代码还有两个问题。

  1. 调用方法 setVisible 应该是您的 BuildGUI 方法的最后一行。
  2. 您正在向 JFrame 添加 MouseListener,即 class GridOfButtons。您需要为每个 JButton 添加一个 MouseListener

这是您更正的代码,包括更改 JButton 文本的代码。如上所述,我移动了行 setVisible(true);。我还为每个 JButton 添加了一个 MouseListener。 (请参阅下面代码中的评论 CHANGE HERE。)我添加了代码以更改方法 mousePressed.

中的 JButton 文本
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GridOfButtons extends JFrame implements MouseListener {
    private JButton [][] grid;

    public GridOfButtons()
    {
        grid = new JButton[10][10];
        BuildGUI();
    }
    
    public void BuildGUI()
    {
        setSize(1200, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(10, 10));

        for(int r = 0; r < grid.length; r++)
        {
            for(int c = 0; c < grid[r].length; c++)
            {
                grid[r][c] = new JButton("*");
                grid[r][c].setActionCommand(r + ":" + c);
                grid[r][c].addMouseListener(this); // CHANGE HERE
                getContentPane().add(grid[r][c]);
            }
        }
        setVisible(true);
    }

    public void mouseClicked(MouseEvent b)
    {
    }

    public void mouseEntered(MouseEvent b)
    {
    }

    public void mouseExited(MouseEvent b)
    {
    }

    public void mouseReleased(MouseEvent b)
    {
    }   

    public void mousePressed(MouseEvent b)
    {
        Component a = b.getComponent(); 
        JButton x = (JButton)a;
        System.out.println(x.getActionCommand());
        String s = x.getActionCommand();
        // substring for row and col
        // set text
        int ndx = s.indexOf(':');
        if (ndx >= 0) {
            String row = s.substring(0, ndx);
            String col = s.substring(ndx + 1);
            String text = row + '!' + col;
            x.setText(text);
        }
    }

    public static void main(String[] args)
    {
        new GridOfButtons();
    }
}

关于上述代码的一些注释。

  1. 建议使用Java naming conventions,也就是说方法BuildGui应该命名为buildGui.
  2. 通常最好在 GridLayout 构造函数中将其中一个维度设置为 0(零)。参考How to Use GridLayout.
  3. 大多数“侦听器”接口都有相应的“适配器”class 来实现该接口。对于 MouseListener 有 class MouseAdapter。这使您不必为侦听器接口中的每个方法编写实现。参考How to Write a Mouse Listener.
  4. 通常您会将 ActionListener 添加到 JButton,而不是 MouseListener。参考How to Use Buttons, Check Boxes, and Radio Buttons。但我假设你的教授有设定作业要求的理由。

这是单击网格第一行第一列中的 JButton 后 运行 应用程序的屏幕截图。