按钮和actionlistener网格

时间:2016-10-25 23:44:34

标签: java variables actionlistener private

我使用以下代码通过(ySize = 10)JButtons创建(xSize = 10)的网格。只要我在此代码所在的类中执行此操作,我就可以对按钮进行更改。

但是我试图在一个单独的类中更改按钮上的文本。

public class Ocean {

public Ocean(){
}

private final int xSize = 10;
private final int ySize = 10;
private final JButton[][] buttons = new JButton[xSize][ySize];

public gameBoard() {
    for (int row = 0; row < xSize; row++) {
        for (int col = 0; col < ySize; col++) {
            buttons[row][col] = new JButton(/*space1*/);
            buttons[row][col].setText("E");
            buttons[row][col].addActionListener(new myActionListener()); 
            buttons[row][col].setPreferredSize(new Dimension(50, 50));
            playerPanel.add(buttons[row][col]);
        }
    }

}

下一课

public class Battleship {

    int length = 4;

    public Battleship() {
    }

    public changeText(int row, int col) {
        ocean.buttons[row][col].setText("H");     need to make this work
    }

我希望这能以更好的方式提出问题

谢谢

3 个答案:

答案 0 :(得分:2)

你的问题归结为它的基本要素就是这样:我怎样才能让一个对象改变另一个对象的状态?

有很多可能的方法来修饰这只猫,但最简单的是给一个类,这里​​是Ocean(或者gameBoard?你的代码令人困惑)公共方法,外部ActionListener可以调用它来改变它的状态。例如,您可以为按钮网格保持类提供一个公共方法:setText(...),如下所示:

public void setText(int row, int col, String text) {
    buttons[row][col].setText(text);
}

ActionListener可以通过构造函数参数传递对此网格保持类的引用,允许它在需要时调用此方法。

另请注意,您始终可以通过ActionListener actionPerformed方法的ActionEvent参数获取对按下的JButton的引用。它有一个getSource()方法,它返回对发起事件的对象(这里是JButton)的引用。

如果您需要更详细的解决方案,请考虑创建并发布有效的Minimal, Complete, and Verifiable example

例如:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class SimpleButtonGridMain extends JPanel {
    private static void createAndShowGui() {
        SimpleButtonGrid simpleButtonGrid = new SimpleButtonGrid();

        MyButtonListener myButtonListener = new MyButtonListener();
        simpleButtonGrid.addActionListener(myButtonListener);

        JFrame frame = new JFrame("SimpleButtonGridMain");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(simpleButtonGrid);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

class SimpleButtonGrid extends JPanel {
    private static final int ROWS = 10;
    private static final int COLS = ROWS;
    private JButton[][] buttons = new JButton[ROWS][COLS];

    public SimpleButtonGrid() {
        setLayout(new GridLayout(ROWS, COLS, 3, 3));
        for (int row = 0; row < buttons.length; row++) {
            for (int col = 0; col < buttons[row].length; col++) {
                String text = String.format("  [  %d,  %d  ]  ", col, row);
                JButton button = new JButton(text);
                add(button);
                buttons[row][col] = button;
            }
        }
    }

    public void addActionListener(ActionListener listener) {
        for (JButton[] jButtons : buttons) {
            for (JButton jButton : jButtons) {
                jButton.addActionListener(listener);
            }
        }
    }
}

class MyButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        String actionCommand = e.getActionCommand();
        JButton sourceBtn = (JButton) e.getSource();

        String message = "Button pressed: " + actionCommand;
        JOptionPane.showMessageDialog(sourceBtn, message, "Button Pressed", JOptionPane.PLAIN_MESSAGE);
        sourceBtn.setText("Pressed");
        sourceBtn.setEnabled(false);
    }
}

答案 1 :(得分:2)

您的代码中没有明确要做的事情。如果单击按钮,则示例代码会更改每个按钮的文本。

也许您想要更改单击按钮的文本,然后此代码可以提供帮助:

@Override
public void actionPerformed(ActionEvent e) {
    JButton theClickedButton = (JButton) e.getSource();
    theClickedButton.setText("M");
}

答案 2 :(得分:0)

这对我有用。在类中,我使用了一个在其参数中调用类的方法。

public void placeShipAt(int row, int column, Ocean ocean) {

        ocean.buttons[row][column].setText("B");
}