【问题标题】:Are while loops not usable in Swing applications?在 Swing 应用程序中不能使用 while 循环吗?
【发布时间】:2016-09-30 00:05:27
【问题描述】:

基本上我有一个棋盘,我想让在不在边缘的方格上迈出第一步是非法的。框架是一个 5x5 的游戏板,在点击时会根据轮到谁来改变颜色。

我的问题:当我启动程序时,它并没有告诉我我在中间按下的按钮是非法动作。谁能解释为什么代码不起作用?

这里是一些示例代码:

package fgame;

import java.awt.Color;
import javax.swing.JOptionPane; 

public class FooFrame extends javax.swing.JFrame {

private Color whoseTurn = Color.BLACK;
private Color playerOneTurn = Color.BLACK;
private Color playerTwoTurn = Color.ORANGE;
private String playerOne = "You";
private String playerTwo;
private int PlayerOneCount = 21;
private int PlayerTwoCount = 21;


public FooFrame() {
    initComponents();
    setSize(800,800);
    setLocationRelativeTo(null);
    humanOrAI();
    movesLeft();
    endGame();


}

private void humanOrAI()
{
    Object[] options = {"Other Human","Computer (EASY)","Computer (HARD)"};

    Object input = (Object) JOptionPane.showInputDialog(null, 
            "Who is your opponent?",
            "CHOOSE YOUR FATE!",JOptionPane.QUESTION_MESSAGE,
            null,options,
            options[0]);  
    if (input == options[0]){
        playerTwo = (String.valueOf(options[0]));
    }
    else if (input == options[1]){
        playerTwo = (String.valueOf(options[1]));   
    }
    else {
        playerTwo = (String.valueOf(options[2]));
    }        
}

private void determineWhoseTurn()
{
    if (whoseTurn.equals(playerOneTurn))
    {
        whoseTurn = Color.orange;
    }
    else
    {
        whoseTurn = Color.BLACK;
    }
}

public void movesLeft()
{

    if (whoseTurn.equals(playerOneTurn))
    {
        jLabel1.setText(" " + playerOne + " have " + PlayerOneCount+ " pieces left    "
                + "         "+ playerTwo+ " has " + PlayerTwoCount+ " pieces left");
        PlayerOneCount--;
    }

    else
    {
        jLabel1.setText(" " + playerOne + " have " + PlayerOneCount+ " pieces left    "
                + "         "+ playerTwo+ " has " + PlayerTwoCount+ " pieces left");
        PlayerTwoCount--;
    }  
}

//How do I count the amount of black and orange squares?
public void endGame()
{
    int black = 0;
    int orange = 0;

    if (whoseTurn.equals(playerOneTurn))
    {
        black++;
    }
    else
    {
        orange++;
    }

    if (PlayerTwoCount <= 0 || PlayerOneCount <= 0)
    {
        JOptionPane.showMessageDialog(rootPane, "Game Over!" + " black: "+ black
        + "orange: "+ orange);
    }
}

public void validStartingPoint()
{
   Object illStartPoint[] = {B2,B3,B4,C2,C3,C4,D2,D3,D4};

   while (PlayerOneCount == 21 || PlayerTwoCount == 21)
       if (whoseTurn.equals(illStartPoint[0-8]))
       {
           JOptionPane.showMessageDialog(rootPane, "Not a valid move! Start "
                   + "from an edge square!");
       } else
       {
           break;
       }
}

我的问题与方法validStartingPoint() 有关。但我也有一个关于 endGame() 的问题,它放在上面的评论中。我所有的 JBUTTONS 中都调用了所有方法

另外,我知道这可能与 while 循环无关。我不是世界上最好的程序员。

【问题讨论】:

  • 投票结束,因为不清楚您的要求。显然,在代码中使用循环很好,我在这里看不到任何其他问题。我什至没有看到对您未预料到的情况的描述。
  • 您的主要问题是微不足道的:while 循环当然适用于 Swing 应用程序,但您的基本问题不是而且实际上是不完整的。您没有告诉我们您的代码遇到的问题,也没有发布我们可以运行的任何内容。请考虑改进此问题并提供minimal reproducible example(不要在链接中提醒您),我们将有更好的能力找到答案。
  • @HovercraftFullOfEels 我添加了更多代码
  • @HovercraftFullOfEels 没有建议“更多代码”,而是 MCVE!请关注并阅读链接。看到的代码需要导入和 main(String[]) 方法才能将其显示在屏幕上,然后才能称为 MCVE。
  • 我无法运行甚至编译你的代码,所以我很茫然。

标签: java arrays swing


【解决方案1】:

由于您所写的问题不完整,因此不可能给您具体的帮助,但要回答您的直接问题:while 循环当然适用于 Swing 应用程序,

但是,您不应该像在线性控制台应用程序中那样使用它们。了解 Swing GUI 与大多数 GUI 一样,不是线性程序,其中一位代码必须跟随另一位代码,而是它们是 事件 驱动的程序,其中代码通常仅在事件之后调用 - 例如按下按钮或按下鼠标。

因此,您不希望使用 while 循环来等待或轮询用户输入,而是希望使用“状态”机器类型设计并侦听事件,状态是底层模型的状态对于你的程序,这里是你的游戏逻辑。

如果您需要更详细的帮助,请充实您的问题,包括创建和发布minimal example program 以供我们使用。


如果这些家伙是 JButtons,那么是的,while 循环是错误的

Object illStartPoint[] = { B2, B3, B4, C2, C3, C4, D2, D3, D4 };

相反,按钮的 ActionListener 应该有一个 if 语句,检查按钮按下是否合法。这将取决于您所在程序的哪个部分,因此它必须是 if 测试中确定它是否合法的布尔语句的一部分。例如,如果您要阻止某人在第一次按下按钮时按下按钮,则可以使用一些布尔值。

但话虽如此,我实际上会做不同的事情。我会停用任何不应该按下的按钮,然后在/如果应该按下它们时激活它们。这可以通过调用 setEnabled(boolean enabled) 并根据程序所处的状态为该按钮传递 true 或 false 来完成。

例如,运行这段代码来看看我的意思:

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class TestButtons1 extends JPanel {
    private static final int BUTTON_COUNT = 10;
    // private boolean onlyEvenButtonsActve = true;
    private List<JButton> allButtons = new ArrayList<>();

    public TestButtons1() {
        JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
        for (int i = 0; i < BUTTON_COUNT; i++) {
            JButton button = new JButton("Button " + i);
            // add ActionListener
            button.addActionListener(e -> {
                System.out.println("Button pressed: " + e.getActionCommand());
            });

            buttonPanel.add(button);  // add to jpanel 
            allButtons.add(button); // add to array list for all buttons
        }

        JToggleButton activateOnlyEvensTglBtn = new JToggleButton("Activate Only Even Buttons");
        activateOnlyEvensTglBtn.addItemListener(e -> {
            for (int i = 0; i < allButtons.size(); i++) {
                boolean b = i % 2 == 0  || e.getStateChange() == ItemEvent.DESELECTED;
                allButtons.get(i).setEnabled(b);
            }
        });
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(activateOnlyEvensTglBtn);

        setLayout(new BorderLayout());
        add(buttonPanel, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        TestButtons1 mainPanel = new TestButtons1();

        JFrame frame = new JFrame("TestButtons1");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多