- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家好,我正在尝试使用 Java 创建一个简单的国际象棋游戏。我有一个 [8][8] 数组的 JButton 板。我为每个分配一个新的 SquareListener,它是一个扩展 BoardListner 的类,BoardListner 是一个实现 Action Listener 的父类(super class)。我想记录当前按下的按钮是否等于最后按下的按钮。我正在存储在父类(super class)中按下的 JButton 实例,并在 SqaureListener actionPerformed 方法中引用它。这是我为按钮创建的类的示例。
public class SquareListener extends BoardListener {
private int row;
private int column;
public SquareListener(int row, int column){
this.setRow(row);
this.setColumn(column);
}
@Override
public void actionPerformed(ActionEvent ae){
JButton buttonPressed = (JButton) ae.getSource();
if(buttonPressed == super.lastButtonPressed){
System.out.println("This is the button you last pressed");
}else{
System.out.println("This is a new button");
}
super.lastButtonPressed = buttonPressed;
}
这是我存储 isSelecting 数据的父类(super class)
public class BoardListener implements ActionListener {
private boolean isSelectingInsteadOfTargeting = true;
JButton lastButtonPressed = new JButton();
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
public boolean isSelectingInsteadOfTargeting() {
return isSelectingInsteadOfTargeting;
}
public void setSelectingInsteadOfTargeting(boolean isSelectingInsteadOfTargeting) {
this.isSelectingInsteadOfTargeting = isSelectingInsteadOfTargeting;
}
}
我希望每次按下按钮时将该按钮的实例传递给 buttonPressed 并与存储在 BoardListener 中的内容进行比较,然后将其打印出来,然后将 buttonPressed 分配给 super 成员。相反,我得到的行为是,如果我按下一个按钮,它将始终返回“这是你上次按下的按钮”,即使我在两者之间按下了一个新按钮。我这样做的方式有问题吗?有没有更简单的方法?
这是我存储按钮并为它们分配 Action 监听器的附加代码
public Board(boolean _isWhite){
gui = new JPanel(new GridLayout(8,8));
chessBoardSquares = new Square[8][8];
boolean shouldBeWhite = true;
for(int i = 0; i < 8; i++){
for(int j= 0; j < 8; j++){
Square square = new Square(i,j);
square.getButton().addActionListener(new SquareListener(i,j));
if(shouldBeWhite){
square.getButton().setBackground(Color.WHITE);
shouldBeWhite = false;
}else{
square.getButton().setBackground(Color.BLACK);
shouldBeWhite = true;
}
if (j == 7){
shouldBeWhite = !shouldBeWhite;
}
chessBoardSquares[i][j] = square;
gui.add(chessBoardSquares[i][j].getButton());
}
}
BoardFactory boardFactory = new BoardFactory();
if(_isWhite){
updateBoardIconsBasedOnCurrentBoardArray(boardFactory.getBlackStartArray());
}else{
//getblack start array and invoke method to change button icons based on array
}
}
最佳答案
我们不需要 8 x 8 的整个网格,但可能需要一个 2 x 2 的网格,您可以将其缩放为 8 x 8。
此代码比较所点击按钮的最后坐标。
您可以为所有按钮使用单个 ActionListener
...
例如:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TwiceButtonPressed {
private JFrame frame;
private JButton[][] buttons;
private JLabel label;
private JLabel sameButtonLabel;
private JPanel pane;
private boolean sameButtonPressed;
private static final int rows = 2;
private static final int cols = 2;
private int buttonRow = -1;
private int buttonCol = -1;
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new TwiceButtonPressed().createAndShowGui());
}
public void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
sameButtonPressed = false;
label = new JLabel("Button pressed: NONE");
sameButtonLabel = new JLabel("Same button pressed: " + sameButtonPressed);
pane = new JPanel();
pane.setLayout(new GridLayout(rows, cols));
buttons = new JButton[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
buttons[i][j] = new JButton(i + "" + j);
buttons[i][j].addActionListener(listener);
pane.add(buttons[i][j]);
}
}
frame.add(sameButtonLabel, BorderLayout.NORTH);
frame.add(pane, BorderLayout.CENTER);
frame.add(label, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (e.getSource().equals(buttons[i][j])) {
label.setText("Button pressed: " + buttons[i][j].getText());
System.out.println(buttonRow + "==" + i + "***" + buttonCol + "==" + j);
if (buttonRow == i && buttonCol == j) {
sameButtonPressed = true;
} else {
sameButtonPressed = false;
}
sameButtonLabel.setText("Same button pressed: " + sameButtonPressed);
buttonRow = i;
buttonCol = j;
}
}
}
}
};
}
此外,您可以将白/黑算法更改为如下内容:
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
buttons[i][j] = new JButton() {
@Override
public Dimension getPreferredSize() {
return new Dimension(50, 50);
}
};
buttons[i][j].addActionListener(listener);
if (i % 2 == 0) {
if (j % 2 == 0) {
buttons[i][j].setBackground(Color.BLACK);
} else {
buttons[i][j].setBackground(Color.WHITE);
}
} else {
if (j % 2 != 0) {
buttons[i][j].setBackground(Color.BLACK);
} else {
buttons[i][j].setBackground(Color.WHITE);
}
}
pane.add(buttons[i][j]);
}
}
关于java - 记录 JButton 网格中最后按下的 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589917/
这个问题在这里已经有了答案: “return” and “try-catch-finally” block evaluation in scala (2 个回答) 7年前关闭。 为什么method1返
我有一个动态列表,需要选择最后一项之前的项目。 drag your favorites here var lastLiId = $(".album
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
有没有可能 finally 不会被调用但应用程序仍在运行? 我在那里释放信号量 finally { _semParallelUpdates.Re
我收藏了 对齐的元素,以便它们形成两列。使用 nth-last-child 的组合和 nth-child(even) - 或任何其他选择器 - 是否可以将样式应用于以下两者之一:a)最后两个(假设
我正在阅读 Jon Skeet 的 C# in Depth . 在第 156 页,他有一个示例, list 5.13“使用多个委托(delegate)捕获多个变量实例化”。 List list = n
我在 AM4:AM1000 范围内有一个数据列表(从上到下有间隙),它总是被添加到其中,我想在其中查找和总结最后 4 个结果。但我只想找到与单独列相对应的结果,范围 AL4:AL1000 等于单元格
我最近编写了一个运行良好的 PowerShell 脚本 - 然而,我现在想升级该脚本并添加一些错误检查/处理 - 但我似乎被第一个障碍难住了。为什么下面的代码不起作用? try { Remove-
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
使用 Django 中这样的模型,如何检索 30 天的条目并计算当天添加的条目数。 class Entry(models.Model): ... entered = models.Da
我有以下代码。 public static void main(String[] args) { // TODO Auto-generated method stub
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
这个问题已经有答案了: Multiple returns: Which one sets the final return value? (7 个回答) 已关闭 8 年前。 我正在经历几个在工作面试中
$ cat n2.txt apn,date 3704-156,11/04/2019 3704-156,11/22/2019 5515-004,10/23/2019 3732-231,10/07/201
我可以在 C/C++ 中设置/禁用普通数组最后几个元素的读(或写)访问权限吗?由于我无法使用其他进程的内存,我怀疑这是可能的,但如何实现呢?我用谷歌搜索但找不到。 如果可以,怎样做? 因为我想尝试这样
我想使用在这里找到的虚拟键盘组件 http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx就像 Windows 中的屏幕键盘 (O
我正在运行一个 while 循环来获取每个对话的最新消息,但是我收到了错误 [18-Feb-2012 21:14:59] PHP Warning: mysql_fetch_array(): supp
这个问题在这里已经有了答案: How to get the last day of the month? (44 个答案) 关闭 8 年前。 这是我在这里的第一篇文章,所以如果我做错了请告诉我...
我是一名优秀的程序员,十分优秀!