我使用以下代码通过(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
}
我希望这能以更好的方式提出问题
谢谢
答案 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");
}