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

检查单击了(多个J按钮中的)哪个J按钮

姜森
2023-03-14

我正在制作一个棋盘游戏,8X8矩阵,在一个框架中有64个JButton。到目前为止,我的代码是这样的:

public class Main {
static JFrame f  = new JFrame();;
static JButton btn;
static JButton btnTemp;


    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout((new GridLayout(8,8)));//size of the board
    f.setTitle("ex");
    f.setSize(800,800);

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

            btn=new JButton();
            btn = new JButton(new SoliderW());  
            btn.setName("btn"+i+""+j);
            btn.setBackground(Color.BLACK); 
            btn.addActionListener(actionListener); // make a listener to the button
            f.add(btn);
            }

    }


    f.setVisible(true);

我试图告诉哪个JButoon是使用此代码单击的:

Component[] components = f.getContentPane().getComponents();


    ActionListener actionListener = new ActionListener()
    {
      @Override
        public void actionPerformed(ActionEvent e)
         {
              System.out.println("Hello");
          }
     };

       for (Component component : components)
          {
               if (component instanceof JButton)
                  {
                  ((JButton) component).addActionListener(actionListener);
                  }
          }

然而,我不知道如何辨别点击了哪个Jbutton。

共有3个答案

麹耘豪
2023-03-14

按照MadProgrammer的建议实现MVC模式可以如下完成:
拥有一个包含视图(gui)需要的所有信息的模型
有一个使用模型显示gui的视图类
有一个控制模型和视图的控制器类

下面的mre演示了使用MVC模式来实现所需的功能。
为了方便和简单,可以将以下代码复制粘贴到一个名为Main.java的文件中并运行:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

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

//used listen to changes in view
interface SelectionListener{

    void selected(int row, int column);
}

/*Model contains the information for the view and information from the view
 * as well as the logic.
 * The model is independent of the user interface.
 */
class Model {

    private final String[][] soliderNames;

    Model(int size){

        soliderNames = new String[size][size];

        for (int i=0 ; i<size  ; i++)  {
            for (int j=0; j<size ; j++) {
                soliderNames[i][j] = i+"-"+j;
            }
        }
    }

    int getNunberOfRows(){
        return soliderNames.length;
    }

    int getNunberOfColumns(){
        return soliderNames[0].length;
    }

    String getName(int row, int column) {
        return soliderNames[row][column];
    }
}

/*View only contains the user interface part*/
class View{

    private final JFrame f;
    private static final int W = 50, H = 50;

    View(Model model, SelectionListener selectionListener){

        int rows = model.getNunberOfRows();
        int cols = model.getNunberOfColumns();

        JPanel view = new JPanel(new GridLayout(rows, cols));
        for (int i=0 ; i < rows ; i++)  {
            for (int j = 0 ; j < cols ; j++)    {
                int finalI =i, finalJ = j;
                JButton btn = new JButton();
                btn = new JButton("-");
                btn.setPreferredSize(new Dimension(W,H));
                btn.setBackground(Color.BLACK);
                btn.addActionListener( a -> selectionListener.selected(finalI, finalJ));
                view.add(btn);
            }
        }

        f  = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setTitle("ex");
        f.add(view);
        f.pack();
    }

    void show(){
        f.setVisible(true);
    }
}

/* The controller controls the view and model.
 * Based on the user action, the Controller calls methods in the View and Model
 * to accomplish the requested action.
 */
class Controller implements SelectionListener {

    private static final int SIZE = 8;
    private final Model model;

    Controller(){
        model = new Model(SIZE);
        View view = new View(model, this);
        view.show();
    }

    @Override
    public void selected(int row, int column) {

        System.out.print("row: "+ row + "  column: "+ column + " clicked. ");
        System.out.println("Name is "+ model.getName(row, column));
    }
}
井高峯
2023-03-14

您也可以在侦听器中执行此操作:

Object src = e.getSource();
if ( src instanceof JButton ) {
   System.out.println( "Button is: " + ((JButton)src).getName() );
}

但最好将所有按钮放在一个ArrayList中,然后只使用int index=list。indexOf(src)

富念
2023-03-14

让我们从静态开始,静态不是您的朋友,您应该避免使用它,尤其是当您试图跨对象边界引用实例时。

例如,使用匿名类...

btn = new JButton();
btn = new JButton(new SoliderW());
btn.setName("btn" + i + "" + j);
btn.setBackground(Color.BLACK);
btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        // Do some work
    }
}); // make a listener to the button

但是,老实说,由于btn静态,这对您没有帮助

使用actionCommand属性

ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        String command = evt.getActionCommand();
        // Do more work
    }
};

//...

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

        btn = new JButton();
        btn = new JButton(new SoliderW());
        btn.setName("btn" + i + "" + j);
        btn.setBackground(Color.BLACK);
        // Replace the text with something that will
        // uniquely identify this button
        btn.setActionCommand("some cell identifier");
        btn.addActionListener(actionListener); // make a listener to the button
        f.add(btn);
    }

}

创建一个自定义的ActionListener,它获取所需的信息,以便更好地决定要做什么(并将其与按钮本身分离)

public class CardActionListener implements ActionListener {
    private int row, col;

    public CardActionListener(int row, int col) {
        this.row = row;
        this.col = col;
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // Do some work...
    }
}

//...

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

        btn = new JButton();
        btn = new JButton(new SoliderW());
        btn.setName("btn" + i + "" + j);
        btn.setBackground(Color.BLACK);
        btn.addActionListener(new CardActionListener(i, j)); // make a listener to the button
        f.add(btn);
    }

}

我个人喜欢使用API。

这类似于最后一个建议,但创建了一个更加独立的工作单元,它与调用者分离。

public class CardAction extends AbstractAction {
    private int row, col;

    public CardAction(int row, int col) {
        this.row = row;
        this.col = col;
        putValue(Action.LARGE_ICON_KEY, new SoliderW());
    }

    @Override
    public void actionPerformed(ActionEvent evt) {
        // Do some work...
    }
    
}

//...

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

        btn = new JButton(new CardAction(i, j));
        f.add(btn);
    }

}

我试图实现的一个目标是将动作功能与按钮本身分离,因此动作不依赖于按钮,而是依赖于提供的执行其操作所需的信息。

这是“模型-视图-控制器”的核心概念,将使您的代码更易于维护

 类似资料:
  • 我想知道在多个按钮的列表中按下了哪个按钮。例如,如果按下了第二个按钮,则代码会检测到按下第二个向下的按钮,并返回类似于 。但是,我不知道该怎么做。当我搜索时,jQuery参与其中,但我没有使用jQuery。代码如下: 我尝试使用EventListner,通过将EventListner添加到创建的每个按钮,但这并不能区分单个按钮。请注意,每个按钮都有一个id为和一个类。 如果有人能帮忙,谢谢!

  • 我知道以前可能有人问过这个问题,但我似乎找不到适合我情况的合理答案。 我有一个表单,表单中有多个提交按钮,我需要知道按下了哪个按钮。 表单内部的一个小代码段可能如下所示: fmt:消息部分只是考虑了客户端的语言并将单词放在按钮上。 到目前为止,我在submit按钮上添加了一个动作处理程序,并在表单上添加了一个隐藏的input元素,告诉我哪个按钮被按下了,但是我需要在不依赖javascript的情况

  • 我试图构建一个GUI,它有许多按钮(JButton)/下拉项(JMenuItem),当按下每个包含字母的按钮时,相关的字母将添加到标签中。 我无法识别按下了哪个按钮。你能给我一个关于如何做到这一点的提示吗?

  • 因此,我想在单击相应的按钮后更改图像的位置,我将其实现为JComponent,但是,当被单击时,它不会做任何事情。 我认为问题可能在于我的油漆组件方法,因为我希望图像在开始时绘制在面板的中心。 面板本身有一个GridBagLayout,尽管我认为将其锚定在中心也没有帮助,因为我想在单击按钮时移动图像,并且只希望它在打开框架时显示在面板的中心... 特别是对于这个按钮,我希望我的JComponent

  • 我正在测试JFXtras(v8.0-r5)的Monology FX,但我被它卡住了! 有人能告诉我如何检查用户按下的对话框中的按钮是什么吗?我试了很多方法,但一点运气都没有。