【问题标题】:Using methods within Swing application在 Swing 应用程序中使用方法
【发布时间】:2016-05-25 12:29:34
【问题描述】:

我正在创建我的第一个 Swing 应用程序 -> Tic Tac Toe。看了很多教程,还是看不懂三点:

第一个是:如何创建方法并在我的代码中使用它们(例如下面我的代码中的isWinner方法)?我将它添加到actionPerformed,但它仍然不会做任何事情。我应该如何调用它才能使其实时工作?

第二个是:我不喜欢static 方法。我应该创建一个我的类的对象然后调用方法吗?

第三个是:我的isWinner方法可以吗?或者我应该改变检查获胜者是否出现的方式?

我在互联网上看到了很多内容以及创建此类游戏的示例。

编辑 更改了 isWinner 方法。现在我从actionPerformed 方法调用它。还是什么都不做……

package one.more.time;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class GameWindow extends JFrame implements ActionListener{

    String player = "X";
    JButton but[] = new JButton[9];
    JLabel status = new JLabel("Start!");


    public GameWindow() {
        setLayout(new BorderLayout());

        for (int i = 0; i < but.length; i++){
            but[i] = new JButton(Integer.toString(i+1));
            but[i].addActionListener(this);
        }

        JPanel gamePanel = new JPanel();
        gamePanel.setLayout(new GridLayout(3, 3));

        for (int i = 0; i < but.length; i++){
            gamePanel.add(but[i]);
        }

        add(gamePanel, BorderLayout.CENTER);
        add(status, BorderLayout.SOUTH);
        setSize(new Dimension(300, 300));
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }



    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GameWindow();
            }
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton src = (JButton) e.getSource();
        src.setActionCommand("player");
        src.setText(player);
        src.setEnabled(false);
        if (isWinner(but, player)) {
            System.exit(0);
        };
    }

    boolean isWinner(JButton butt[], String player){
        JButton but[] = butt;
         for (int i = 0; i<3; i++){
         if (but[i].getActionCommand().equals(but[i+3].getActionCommand()) && 
                    but[i+3].getActionCommand().equals(but[i+6].getActionCommand()) &&
                    but[i].getActionCommand().equals(but[i+6].getActionCommand()) && 
                    but[i].getActionCommand().equals(player))
             {
                 return true;
             }
         }
         for (int i = 0; i<9; i+=3)
         if (but[i].getActionCommand().equals(but[i+1].getActionCommand()) && 
                     but[i+1].getActionCommand().equals(but[i+2].getActionCommand()) &&
                     but[i].getActionCommand().equals(but[i+2].getActionCommand()) &&
                    but[i].getActionCommand().equals(player))
            {
                return true;
            }

         if (but[0].getActionCommand().equals(but[4].getActionCommand()) && 
                 but[4].getActionCommand().equals(but[8].getActionCommand())&&
                 but[0].getActionCommand().equals(but[8].getActionCommand()) &&
                but[0].getActionCommand().equals(player))
        {
            return true;
        }
         if (but[2].getActionCommand().equals(but[4].getActionCommand()) && 
                 but[4].getActionCommand().equals(but[6].getActionCommand()) &&
                 but[2].getActionCommand().equals(but[6].getActionCommand()) &&
                but[2].getActionCommand().equals(player))
        {
            return true;
        }

         return false;
     }
}

【问题讨论】:

  • 也许您应该比较按钮的内容而不是它们的引用是否相等。这就是该方法不起作用的原因
  • 另外,我不明白为什么您的方法是静态的,您可以像任何其他 Java 应用程序一样在 Swing 应用程序中调用您的方法
  • 静态方法有特定用途,必要时应使用。你可能不是粉丝,但它是语言的重要组成部分,你应该将其作为一个特性来接受,而不是仅仅因为“你不喜欢它”而四处走动......

标签: java swing jbutton actionlistener tic-tac-toe


【解决方案1】:

1-2。不要将 isWinner 设为静态。这将允许您从类内部调用它的其他非静态方法:例如 actionPerformed 方法。

  1. but [I]==but [I+3] - 您只需比较不同 JButton 的引用,这总是错误的。你需要比较他们身后被标记的玩家:

    but [I].getActionCommand ().equals ( but [I+3].getActionCommand ());

编辑: 在actionPerformed方法里面不要写src.setActionCommand("player");当然要换成玩家的实际值:src.setActionCommand(player);

更简洁的 isWinner 方法:

boolean isWinner(JButton buttons[], String player)
{
    for (int i = 0; i < 3; i++)
    {
        if (buttons[i].getActionCommand().equals(player) &&
                buttons[i + 3].getActionCommand().equals(player) &&
                buttons[i + 6].getActionCommand().equals(player))
        {
            return true;
        }
    }

    for (int i = 0; i < 9; i += 3)
        if (buttons[i].getActionCommand().equals(player) &&
                buttons[i + 1].getActionCommand().equals(player) &&
                buttons[i + 2].getActionCommand().equals(player))
        {
            return true;
        }

    if (buttons[0].getActionCommand().equals(player) &&
            buttons[4].getActionCommand().equals(player) &&
            buttons[8].getActionCommand().equals(player))
    {
        return true;
    }

    return buttons[2].getActionCommand().equals(player) &&
            buttons[4].getActionCommand().equals(player) &&
            buttons[6].getActionCommand().equals(player);
}

【讨论】:

  • 我刚刚编辑了代码。如果你能再看一次,那就太好了:)
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2010-09-29
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多