我想写一个简单的换色游戏 我写了一些代码,但没有更新GUI 只有一个单击按钮,但另一个不是。 问题是什么? 怎么能更容易识别动态按钮?
`
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MainFrame extends JFrame {
public int[] table = {
2, 2, 2,
0, 1, 0,
1, 1, 0,
0, 1, 0,
3, 3, 3,};
public int click;
public int[] clicked = {-1, -1};
Color color[] = {Color.white, Color.lightGray, Color.red, Color.blue, Color.green};
public MainFrame() {
setLayout(new java.awt.GridLayout(5, 3));
setSize(400, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
for (int i = 0; i < 15; ++i) {
final JButton b = new JButton(String.valueOf(i));
add(b);
if (table[i] == 0) {
b.setEnabled(false);
b.setBackground(null);
}
b.setBackground(color[table[i]]);
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent f) {
if (f.paramString().contains("cmd=0,")) {
click = 0;
} else if (f.paramString().contains("cmd=1,")) {
click = 1;
} else if (f.paramString().contains("cmd=2,")) {
click = 2;
} else if (f.paramString().contains("cmd=4,")) {
click = 4;
} else if (f.paramString().contains("cmd=6,")) {
click = 6;
} else if (f.paramString().contains("cmd=7,")) {
click = 7;
} else if (f.paramString().contains("cmd=10,")) {
click = 10;
} else if (f.paramString().contains("cmd=12,")) {
click = 12;
} else if (f.paramString().contains("cmd=13,")) {
click = 13;
} else if (f.paramString().contains("cmd=14,")) {
click = 14;
}
if (clicked[0] == -1) {
clicked[0] = click;
} else if (clicked[1] == -1) {
clicked[1] = click;
}
if (clicked[0] != -1 && clicked[1] != -1) {
int temp = table[clicked[0]];
table[clicked[0]] = table[clicked[1]];
table[clicked[1]] = temp;
b.setBackground(color[table[clicked[0]]]);
b.setBackground(color[table[clicked[1]]]);
clicked[0] = -1;
clicked[1] = -1;
}
}
}
);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
});
}
}
`
答案 0 :(得分:1)
将每个按钮保存在一个数组中。您可以使用数组的索引稍后引用这些按钮。
public final JButton[] buttons = new JButton[15];
您还可以使用setActionCommand
在每个按钮上存储ID(数组索引)。
for (int i = 0; i < 15; ++i)
{
buttons[i] = new JButton(String.valueOf(i));
buttons[i].setActionCommand(String.valueOf(i));
...
}
稍后,您可以使用ActionEvent
从getActionCommand
检索该ID。
buttons[i].addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent f)
{
click = Integer.parseInt(f.getActionCommand());
if (clicked[0] == -1) {
clicked[0] = click;
} else if (clicked[1] == -1) {
clicked[1] = click;
}
...
}
});
现在您可以识别按钮,您可以更正颜色交换逻辑以更改相应按钮上的颜色。
if (clicked[0] != -1 && clicked[1] != -1)
{
int temp = table[clicked[0]];
table[clicked[0]] = table[clicked[1]];
table[clicked[1]] = temp;
// get button references from array using index -> set swapped background color
buttons[clicked[0]].setBackground(color[table[clicked[0]]]);
buttons[clicked[1]].setBackground(color[table[clicked[1]]]);
clicked[0] = -1;
clicked[1] = -1;
}
答案 1 :(得分:0)
if ( table[i] == 0 ) {
b.setEnabled( false );
b.setBackground( null );
}
如果表[I]为零,则禁用该按钮。这意味着如果你点击它就没有任何结果。
为什么要为每个按钮添加一个新的动作侦听器,并在每个侦听器中检查每个其他按钮/?您应该创建一个侦听器并将其添加到所有按钮,然后使用event.getSource()来查找单击的按钮。
答案 2 :(得分:0)
感谢您的回答!他们非常有帮助!
游戏是: 初始状态:下方全部为3个蓝色正方形,所有3个红色正方形开销 最终状态:下方全部为3个红色正方形,并且所有3个蓝色正方形开销 替换蓝色和红色方块。 一步只有蓝色或红色方块与灰色方块交换。 只是邻近的广场交换了。
现在几乎准备好非计算机解决方案 我将尝试进一步开发游戏 正确的解决方案可以在计算机广度优先搜索或深度优先搜索方法中找到。
以下是代码:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class MainFrame extends JFrame {
public int[] table = {
2, 2, 2,
0, 1, 0,
1, 1, 0,
0, 1, 0,
3, 3, 3,};
public int click;
public int[] clicked = {-1, -1};
Color color[] = {Color.white, Color.lightGray, Color.red, Color.blue, Color.green};
public final JButton[] buttons = new JButton[15];
public boolean possibleSwap (int clicked1, int clicked2){
boolean swap = false;
if ((Math.abs(clicked[0]-clicked[1])==1 || Math.abs(clicked[0]-clicked[1])==3 )&&((clicked[0] != -1 && clicked[1] != -1) && ((table[clicked[0]] == 1 && table[clicked[1]] > 1) || (table[clicked[1]] == 1 && table[clicked[0]] > 1)))){
swap = true;}
return swap;
}
public MainFrame() {
setLayout(new java.awt.GridLayout(5, 3));
setSize(400, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
for (int i = 0; i < 15; ++i) {
buttons[i] = new JButton(String.valueOf(i));
buttons[i].setActionCommand(String.valueOf(i));
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent f) {
click = Integer.parseInt(f.getActionCommand());
System.out.println("click:: " + click);
if (clicked[0] == -1) {
clicked[0] = click;
} else if (clicked[1] == -1) {
clicked[1] = click;
}
if (possibleSwap(clicked[0],clicked[1])) {
int temp = table[clicked[0]];
table[clicked[0]] = table[clicked[1]];
table[clicked[1]] = temp;
// get button references from array using index -> set swapped background color
buttons[clicked[0]].setBackground(color[table[clicked[0]]]);
buttons[clicked[1]].setBackground(color[table[clicked[1]]]);
System.out.println("clicked[0]:: " + clicked[0]);
System.out.println("clicked[1]:: " + clicked[1]);
revalidate();
clicked[0] = -1;
clicked[1] = -1;
}
}
});
add(buttons[i]);
if (table[i] == 0) {
buttons[i].setEnabled(false);
buttons[i].setBackground(null);
} else {
buttons[i].setBackground(color[table[i]]);
}
}
for (int j = 0; j < table.length; j++) {
System.out.print(table[j] + ", ");
if ((j + 1) % 3 == 0) {
System.out.print("\n");
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
});
}
}