【问题标题】:give JButton multiple options for mouse clicks (Blackjack Game)为 JButton 提供多个鼠标点击选项(二十一点游戏)
【发布时间】:2014-11-06 02:31:58
【问题描述】:

我正在使用 JFrame 编写一个 Blackjack 程序,并尝试使其尽可能简单。我的 JButton,jbHit 只需单击即可工作,但每次单击都会覆盖 playerHand 和 playerSide 插槽。我希望它可以通过多次点击(3 次点击——因为这是你在前两张被处理后可以获得的最大卡片数)选项它应该计算它们,以便数组索引可以记录卡片图像。这是我到目前为止的 ActionListener 代码。恐怕我被困住了。我应该使用某种带有 int i++ 的 for 循环吗?

//Hit Button ActionListener
  jbHit.addActionListener( new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
           if ( playerValue < 21 ) {
              //Draw a card
              Card c = deck.drawCard();
              playersHand.add(c);
              playerSide[2].setIcon( new ImageIcon( c.getFilename() ) );
           }
           //If playerValue > 21, bust
           else if ( playerValue > 21 ) {
              //Toggle Buttons
              jbDeal.setEnabled(true);
              jbHit.setEnabled(false);
              jbStand.setEnabled(false);
              jbDoubleDown.setEnabled(false);
              message = "You bust.";
           }
        }
  });

【问题讨论】:

  • 您可能真正需要的是某种(或两个)模型,它可以维护有关当前状态、卡片数量及其数量、回合的所有信息。您的按钮将与这些模型进行交互,并根据那里的反馈,通过听众,改变那里的状态......
  • @MadProgrammer 是不是你想得到那个花哨的东西,你只需要实现一个状态机,每个上下文都知道下一个操作。您可以使用状态模式来实现这一点。我最近设计了一个使用状态模式的向导来完成这个。但是,OP 想要让它尽可能简单。
  • @hfontanez 只是另一种模型;)
  • @MadProgrammer 我同意,但 OP 不想那么花哨。这就是为什么我通过创建一个字符串数组作为操作命令来为状态机提供一个糟糕的借口,然后我每次单击按钮都会更改它们。它应该足够简单,让 OP 理解。

标签: java swing jbutton actionlistener blackjack


【解决方案1】:

您可以创建一个“动作命令”数组,每次单击按钮时,动作命令都会更改为下一个。如果到达末尾,请将索引设置回零。也许是这样的:

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JButton button = new JButton("Action");
    String[] commands = {"command1", "command2", "command3"};

    button.setActionCommand(commands[0]);
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            JButton btn = (JButton)e.getSource();

            String cmd = btn.getActionCommand();
            System.out.println("Command: " + cmd);

            if(cmd.equals("command1"))
            {
                btn.setActionCommand(commands[1]);
                System.out.println("Command 1 was pressed");
            }
            else if(cmd.equals("command2"))
            {
                btn.setActionCommand(commands[2]);
                System.out.println("Command 2 was pressed");
            }
            else if(cmd.equals("command3"))
            {
                btn.setActionCommand(commands[0]);
                System.out.println("Command 3 was pressed");
            }
            else
                System.out.println("Something went wrong!");
        }
    });
    panel.add(button);

    frame.add(panel);
    frame.setSize(200, 200);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

如果您使用的是 Java 7 或更高版本,则可以将 if/else 替换为 Switch 语句。

【讨论】:

    【解决方案2】:

    我相信您正在寻找基于整数的逻辑标志,例如:

    if(cardsDealt < 3) { 
        // DoThings();
    } else {
        return;
    }
    

    这需要你做什么

    cardsDealt++;
    

    在按钮的底部单击句柄。

    如果这不是您要问的,请重新解释问题。

    【讨论】:

    • 好吧,伙计们,我今天在电子课后重新开始使用它,我将尝试所有这些,看看哪种效果最好。感谢大家的时间和帮助。
    【解决方案3】:

    听起来您可能对如何调用 jbHit 感到有些困惑。意识到每次单击鼠标都会调用一次完整的时间。它本身并不知道它是在第二次或第三次点击。添加一个类成员,如 int clickCount;您在 jbHit 内部的适当点处递增。然后,您可以根据 clickCount 的值更改方法的响应。

    【讨论】:

    • 我展示了一个状态机的“穷人”实现,通过创建一个字符串数组(动作命令),每次点击按钮,动作命令都会更改为下一个。所以,是可以做到的。
    • 我并不是要暗示它不能完成,只是为了帮助 OP 解决我认为可能会妨碍您的误解。另外,我喜欢你的状态机!
    猜你喜欢
    • 2023-03-21
    • 2020-05-18
    • 1970-01-01
    • 2012-07-27
    • 2021-07-19
    • 1970-01-01
    • 2014-10-22
    • 2022-11-12
    • 2022-01-19
    相关资源
    最近更新 更多