【问题标题】:Java changing the name of a button and incrementing countJava更改按钮的名称并增加计数
【发布时间】:2023-04-04 23:17:01
【问题描述】:

所以到目前为止,我已经创建了一个二维引用数组,并为每个引用添加了一个按钮(或者至少尝试过)。然后我为每个按钮添加了一个动作监听器。当一个按钮被按下时,它应该查看数组中的哪个按钮被按下。如果它是“命中”增量命中并从“?”更改按钮到“X”。如果是“未命中”增量未命中并从“?”更改按钮到 ” ”。它仍然没有改变按钮,也没有增加计数。我做错了什么?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
@SuppressWarnings("serial")
public class Battleship extends JFrame{
    public int k;
    public int l;
    public int z;
     // Initialize counters.
    public int shipstartx = (int) (Math.random() * 10);
    public int shipstarty = (int) (Math.random() * 10);
    public int possitioning = (int) (Math.random() * 10);
    // Make hit and miss buttons.  Also make the normal button
    public Battleship(){
         ButtonListener listener1 = new ButtonListener();
         JButton Original[][] = new JButton[10][10];
        // Make the 10 by 10 grid.
        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(10, 10));
        for (int i = 0; i <10; i++){
        for (int j = 0; j <10; j++){
            Original[i][j] = new JButton(" ?");
            p1.add(Original[i][j]);
            Original[i][j].addActionListener(listener1);
        }
        }
        // Add everything to a field so that the player can see it.
        add(new JTextField("Try to sink the battleship!"), BorderLayout.NORTH);
        add(p1, BorderLayout.CENTER);
        JPanel p2 = new JPanel();
        p2.setLayout(new GridLayout(3,1));
        p2.add(new JTextField("Hits " + (k)));
        p2.add(new JTextField("Misses " + l));
        p2.add(new JTextField("Sinks " + z));
        add(p2, BorderLayout.WEST);
        // Now to make it so that the buttons actually do something.
    }
 public static void main (String[] args){
     Battleship frame = new Battleship();
     frame.setTitle("Battleship");
     frame.setSize(400, 300);
     frame.setLocationRelativeTo(null);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setVisible(true);
 }
class ButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        boolean hit = false;
        for (int a = 0; a < 10; a++){
        for (int b = 0; b < 10; b++){
          if (possitioning % 2 == 0){
           if (shipstartx+5 <= 10){
            if ((a == shipstartx || a == shipstartx+1 || a == shipstartx+2
                || a == shipstartx + 3 || a == shipstartx+4 || a == shipstartx+5)
                && b == shipstarty)
                hit = true;
            }
           else if ((a == shipstartx ||  a == shipstartx-1 || a == shipstartx-2
                   || a == shipstartx-3 || a == shipstartx-4 || a == shipstartx-5)
                   && b == shipstarty)
               hit = true;
          }
          else if (shipstarty+5 <= 10){
              if ((b == shipstarty || b == shipstarty+1 || b == shipstarty+2
                 || b == shipstarty+3 || b == shipstarty+4 || b == shipstarty+5)
                 && a == shipstartx)
               hit = true;
          }
          else if ((b == shipstarty || b == shipstarty-1 || b == shipstarty-2
                     || b == shipstarty-3 || b == shipstarty-4 || b == shipstarty-5)
                     && a == shipstartx)
              hit = true;
          else
              hit = false;
        }
        }
   if (hit == true){
       k=k+1;
    }
   else {
       l=l+1;
   }
   JPanel p2 = new JPanel();
   p2.setLayout(new GridLayout(3,1));
   p2.add(new JTextField("Hits " + (k)));
   p2.add(new JTextField("Misses " + l));
   p2.add(new JTextField("Sinks " + z));
   add(p2, BorderLayout.WEST);
if (k == 3){
  z++;
  k = 0;
  l = 0;
 }
}
}
}

【问题讨论】:

  • 而不是每次单击按钮时创建一个新的JPanel 和文本字段,为什么不维护对文本字段的引用,作为实例字段,并简单地更新那里的内容(通过setText )?
  • 我也看不到您更新按钮状态的任何地方。确定按钮在数组中的位置(行/列)并简单地执行单个计算而不是循环这么多也会更容易,但这只是我......
  • 我不知道你是如何进行计算以获得按钮的位置来比较命中和未命中的......
  • 我可能会创建一个二维数组,其中包含 'ints. 0' 为空,非 0 值代表您可能喜欢的每种船舶类型...然后您可以使用循环查找按钮的索引并循环“ship”数组中的位置,或者您可以通过Map 或直接通过get/setClientPropertyPoint 对象与按钮相关联>

标签: java swing user-interface jbutton increment


【解决方案1】:

而不是...

JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(3,1));
p2.add(new JTextField("Hits " + (k)));
p2.add(new JTextField("Misses " + l));
p2.add(new JTextField("Sinks " + z));

每次单击按钮时,创建三个 JTextField 类型的实例字段并使用它们来代替,

private JTextField hitsField;
private JTextField missiesField;
private JTextField sinksField;

然后在你的构造函数中...

JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(3, 1));

hitsField = new JTextField("Hits: 0", 10);
missiesField = new JTextField("Misses: 0", 10);
sinksField = new JTextField("Sinks: 0", 10);

p2.add(hitsField);
p2.add(missiesField);
p2.add(sinksField);

在你的ActionListener 中使用类似...

hitsField.setText("Hits " + (k));
missiesField.setText("Misses " + (l));
sinksField.setText("Sinks " + (z));

您还可以从ActionEvent...中找到单击的按钮...

JButton btn = (JButton)e.getSource();

【讨论】:

  • 非常感谢!但是,现在我知道从哪里单击了按钮,如何将其与整数 a 和 b 匹配以查看它是命中还是未命中?我尝试过 if(a == btn) 和 (a == btn[a]) 甚至 (btn[a] == a) 但您知道您无法将按钮与整数进行比较。
  • 你有“另一个”问题吗? - 有无数种方法。您可以在按钮数组中找到按钮的位置并使用 x/y 位置进行比较,您可以通过 Map 或直接通过按钮的get/putClientProperty
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2011-05-03
相关资源
最近更新 更多