将变量传递给actionlistener?

时间:2013-09-23 21:05:15

标签: java arrays swing

private JButton buttons[][] = new JButton[4][4];
int i, j, n, index = 0, calc = 0;
public int open = 0;
private JButton  opens[] = new JButton[1];
public ImageIcon  images[] = new ImageIcon[20];

public Concentration()
{
    super ("Concentration");

    JFrame frame = new JFrame();
    setSize(1000, 1000);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = new JPanel(new GridLayout(4, 4));
    panel.setSize(400, 400);
    // Getting images
    for (i = 0; i < 8; i++) {
        images[i] = new ImageIcon(getClass().getResource("/images/1 ("+i+").jpg"));
    }

    // Copying images for game
    for (i = 8; i < 16; i++) {
        images[i] = images[i - 8];
    }

    // Shuffling
    Random random = new Random();
    int k;
    ImageIcon imageTemp;

    for (i = 0; i < 16; i++) {
        k = random.nextInt(16);
        imageTemp = images[i];
        images[i] = images[(i + k) % 16];
        images[(i + k) % 16] = imageTemp;
    }

    for (i = 0; i < buttons.length; i++) {
        for (j = 0; j < buttons[i].length; j++) {
            n = i * buttons.length + buttons[i].length;
            buttons[i][j] = new JButton();
            buttons[i][j].setIcon(null);
            /*
             * I made null instad of putting images because if i put images,
             * at start it shows all. but how will i take parameters to
             * actionlistener? for comparing if same?
             */
            //images[i*buttons.length+j]
            panel.add(buttons[i][j]);
            buttons[i][j].addActionListener(this);
        }
    }
    add(panel);
    pack();
    setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    if (e.getSource() instanceof JButton) {
        JButton pressedButton = (JButton) e.getSource();
        if (pressedButton.getIcon() == null) {
            pressedButton.setIcon();
            // How will it take from array? another class?
        } else {
            pressedButton.setIcon(null);
        }
    }
}

我想做一个记忆游戏。当点击2个图像时,它们将显示给用户(首先它们全部为空)。但是在ActionListener中我怎么能取按钮[i] [j] i j变量,因为我需要那个索引来比较它们是否相同。我需要图像的位置来保存和比较2图像。我需要访问images []数组来比较我猜我怎么能在ActionListener中使用?

1 个答案:

答案 0 :(得分:1)

您的动作侦听器当前确定单击了哪个按钮。按钮本身绝对无法确定其索引。因此,您需要为按钮提供一种在按钮数组中标识其位置的方法。为此,我建议您通过向其添加以下行来扩展按钮类:

MemButton extends JButton {
    private int[] position = new int(2);

    getPosition(int index) {
        if (index >= position.length || index < 0) {
            return null;
        } else {
            return position[index];
        }
    }

    setPosition(int index, int value) {
        if (index >= position.length || index < 0) {
        } else {
            position[index] = value;
        }
    }

}

通过这样做,您可以告诉按钮它在哪里。单击按钮时,actionPerformed将调用pressedButton.setIcon并执行计算以转换新pressedButton.getPosition(0)pressedButton.getPosition(1)以获取图像数组中的相应图像。请记住,您将使用MemButton作为一种类型(或其他任何你的名字)。

我确信您可以根据需要修改我的代码。另外,因为你正在扩展JButton,MemButton就像一个JButton,除了有一个有用的存储位置的方法。我宁愿不破解这样的解决方案,特别是因为确保每个按钮都有正确的位置是很痛苦的(特别是如果你移动按钮或添加更多)。尽管如此,对于较小的程序,这个解决方案很好。对于更大的一个,我会尽我所能让游戏本身独立于输入(图像)和输出(按钮),这样你就可以重新使用代码并只编写一些代码来调整任何要比较的GUI或数据。

我希望有所帮助;)

P.S。 您可能必须移动new int(2)的构造函数内的JButton。为此,您将进行以下更改:

MemButton extends JButton {
    private int[] position;    

    MemButton() {
        super();
        position = new int(2);
    }
\\The rest of the example

你可能需要愚弄一下,以便按照自己喜欢的方式进行设置。请记住,在设置数组时,您需要告诉每个按钮MemButton.setPosition(0, i); MemButton.setPosition(1, k);

的位置

如果您希望更简单地设置位置,请修改代码。