gpt4 book ai didi

Java Swing ActionListener 显示 JButton 数组

转载 作者:行者123 更新时间:2023-12-01 13:33:15 25 4
gpt4 key购买 nike

我正在尝试使用 Java Swing 编写一个战舰程序,目前我有一个可以创建两个网格的类。我正在尝试找出单击了哪个按钮的位置,以便稍后可以使用它来放置镜头等...不幸的是,我在这方面遇到了一些麻烦。

我已经通过使用 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 ");
}

}

}

最佳答案

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

// 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);
}
}

关于Java Swing ActionListener 显示 JButton 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21435502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com