我创建了一个10x10网格的Jframe /按钮。每个jbutton都是网格的一部分。我正在尝试如何影响通过JFrame /按钮按下的每个按钮,因为我想最终将它变成战舰游戏。
frame.setLayout(new GridLayout(width,length));
grid=new JButton[width][length];
for(int y=0; y<length; y++){
for(int x=0; x<width; x++){
grid[x][y]=new JButton("("+x+","+y+")");
frame.add(grid[x][y]);
}
}
例如,我正在尝试一段基本代码,看看我是否可以通过点击将Jframe的颜色更改为红色,但它似乎无法正常工作。
public void actionPerformed(ActionEvent e){
if( e.getSource() instanceof JButton) {
((JButton)e.getSource()).setBackground(Color.red);
}
}
有人有任何想法吗?
答案 0 :(得分:1)
我通过单独创建JButtons而不是作为网格的一部分来完成这项工作,但总体思路是一样的。 你无法调用actionPerformed,你必须有一个实现ActionListener的类,然后覆盖方法actionPerformed。
您需要为每个JButton添加一个actionlistener。在这种情况下,由于您希望将同一个侦听器应用于多个按钮,因此您需要在main下面创建一个单独的类。
class buttonListener implements ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
((JButton)e.getSource()).setBackground(Color.red);
}
}
按钮没有改变颜色的原因是因为你需要添加以下内容才能改变JButton的颜色
JButton j = new JButton("test");
j.setSize(100, 100);
j.setContentAreaFilled(true);
j.setOpaque(true);
j.addActionListener(new buttonListener());
我知道这不是你问题最直接的答案,但我希望我至少能帮助你解决问题。
答案 1 :(得分:1)
我们说我们有一个按钮:JButton button
。要在按下按钮时调用操作,必须向其添加动作侦听器。有两种方法可以做到这一点(我知道):
<强> ActionListener 强>
我认为这比第二种方法更经常使用。编写IMO也更容易,更快捷:
JButton button = new JButton("Click me");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button was clicked!");
}
}
<强> Action 强>
另一种动作监听器。功能和用途有所不同。但是要实现一个与ActionListener
一致的按钮,请执行以下操作:
Action buttonAction = new AbstractAction("Click me") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button was clicked!");
}
}
JButton button = new JButton(action);
请注意,在两个示例中,我都使用匿名内部类。在大多数情况下,更优选使用命名内部类甚至外部类。
在ActionListener
和Action
之间进行选择取决于具体情况(一如既往......叹息),我担心我无法对此事进行太多了解。谷歌是你的朋友。快速搜索提供了来自SO的帖子: link
答案 2 :(得分:0)
您可以创建自己的动作侦听器:
class MyActionListener implements ActionListener {
private int x;
private int y;
public MyActionListener(int x, int y) {
this.x = x;
this.y = y;
}
public void actionPerformed(ActionEvent e) {
DoSomething(x, y);
}
}
...
grid = new JButton[wid][len];
for(int y = 0; y < len; y++){
for(int x = 0; x < wid; x++){
grid[x][y]=new JButton("("+x+","+y+")");
grid[x][y].addActionListener(new MyActionListener(x, y));
frame.add(grid[x][y]);
}
}