【问题标题】:Java Swing ActionListener Display JButton ArrayJava Swing ActionListener 显示 JButton 数组
【发布时间】:2014-01-30 05:05:06
【问题描述】:

我正在尝试使用 Java Swing 编写 Battleship 程序,目前我有一个制作两个网格的类。我正在尝试找出单击了哪个按钮的位置,以便以后可以使用它来放置镜头等...不幸的是,我遇到了很多麻烦。

我已经让对象通过使用 actionPerformed 方法打印出其中的所有内容,但我只想要 grid[x][y]。我该怎么办?

提前感谢您的帮助。

package testapp;

/**
 *
 * @author Craig
 */
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.Border;

public class menu extends JPanel implements ActionListener{
        JButton[][] grid;
        TextField text = new TextField(20);

    public menu(int width, int length) {


        Border playerBorder = BorderFactory.createTitledBorder("Player");
        Border comBorder = BorderFactory.createTitledBorder("Com");


        JPanel player = new JPanel();
        player.setBorder(playerBorder);// set border round player grid 
        player.setLayout(new GridLayout(4,4));

        grid=new JButton[width][length]; //allocate the size of grid
        for(int y=0; y<length; y++){
            for(int x=0; x<width; x++){
                grid[x][y]=new JButton(); //creates new button    
                player.add(grid[x][y]); //adds button to grid
                grid[x][y].setBackground(Color.BLUE);//sets grid background colour
                grid[x][y].setPreferredSize(new Dimension(40, 40));//sets each grid buttons dimensions
                add(text);
                grid[x][y].addActionListener(this);
            }
        }

        JPanel com = new JPanel();
        com.setBorder(comBorder);// set border round com grid        
        com.setLayout(new GridLayout(4,4));
        grid=new JButton[width][length]; //allocate the size of grid
        for(int y=0; y<length; y++){
            for(int x=0; x<width; x++){
                grid[x][y]=new JButton(); //creates new button
                com.add(grid[x][y]); //adds button to grid
                grid[x][y].setBackground(Color.BLUE);//sets grid background colour
                grid[x][y].setPreferredSize(new Dimension(40, 40));//sets each grid buttons dimensions
            }
        }        

        //this.setLayout(new FlowLayout());
        this.add(player);
        this.add(com);

}
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source instanceof JButton) {
            JButton btn = (JButton)source;
            text.setText("IN THE BOX ");
        }

    }

}

【问题讨论】:

  • 只需像添加它们一样遍历网格并检查 grid[x][y] button == source
  • This question 几天前突然出现,我认为这与您的情况非常相似(如果不准确的话)。关于该OP的解决方案是否合适存在一些争论,但Trashgod的答案有很多很好的信息。最终,OP 在他们的问题中的解决方案可能是解决问题的一种方法。
  • 谢谢看看
  • 也可以考虑MVC

标签: java swing


【解决方案1】:

有不同的选择。恕我直言,扩展 JButton 应该是最后的手段,而且几乎没有必要。遍历 grid[][] 数组并检查它们是否是相应事件的source 可能没问题。但另一个(恕我直言,简单而优雅)的解决方案是使用匿名侦听器:

// Where the grid buttons are created:
....
grid[x][y].addActionListener(createActionListener(x, y));


private ActionListener createActionListener(final int x, final int y)
{
    return new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            clickedButton(x, y);
        }
    };
}

private void clickedButton(int x, int y)
{
    System.out.println("Clicked "+x+" "+y);
}

编辑:同样,以http://sscce.org/ 的形式(您可以创建一个,然后我可以在您的示例中整合我的答案...)

/**
 *
 * @author Craig and me :D
 */
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.Border;

public class menu extends JPanel {

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new menu(4,4));
        f.setLocationRelativeTo(null);
        f.pack();
        f.setVisible(true);
    }

    JButton[][] grid;
    TextField text = new TextField(20);

    public menu(int width, int length) {


        Border playerBorder = BorderFactory.createTitledBorder("Player");
        Border comBorder = BorderFactory.createTitledBorder("Com");


        JPanel player = new JPanel();
        player.setBorder(playerBorder);// set border round player grid 
        player.setLayout(new GridLayout(4,4));

        grid=new JButton[width][length]; //allocate the size of grid
        for(int y=0; y<length; y++){
            for(int x=0; x<width; x++){
                grid[x][y]=new JButton(); //creates new button    
                player.add(grid[x][y]); //adds button to grid
                grid[x][y].setBackground(Color.BLUE);//sets grid background colour
                grid[x][y].setPreferredSize(new Dimension(40, 40));//sets each grid buttons dimensions
                add(text);
                grid[x][y].addActionListener(
                    createActionListener(x, y, "Player"));
            }
        }

        JPanel com = new JPanel();
        com.setBorder(comBorder);// set border round com grid        
        com.setLayout(new GridLayout(4,4));
        grid=new JButton[width][length]; //allocate the size of grid
        for(int y=0; y<length; y++){
            for(int x=0; x<width; x++){
                grid[x][y]=new JButton(); //creates new button
                com.add(grid[x][y]); //adds button to grid
                grid[x][y].setBackground(Color.BLUE);//sets grid background colour
                grid[x][y].setPreferredSize(new Dimension(40, 40));//sets each grid buttons dimensions
                grid[x][y].addActionListener(
                    createActionListener(x, y, "Computer"));
            }
        }        

        //this.setLayout(new FlowLayout());
        this.add(player);
        this.add(com);

    }
    private ActionListener createActionListener(
        final int x, final int y, final String name)
    {
        return new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                clickedButton(x, y, name);
            }
        };
    }

    private void clickedButton(int x, int y, String name)
    {
        System.out.println("Clicked "+x+" "+y+" for "+name);
    }
}

【讨论】:

  • 嗨,当我遇到错误时,我将如何实现这一点,例如:在类名中,我得到 [菜单不是抽象的并且不覆盖抽象方法] 以及我在哪里创建方法私有 ActionListener 我得到 [Illegal start of expression]。抱歉,如果这些问题真的很简单,就卡住了
  • 非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多