带有Java Swing的Tictoe

带有Java Swing的Tictoe,java,swing,jlabel,string-comparison,Java,Swing,Jlabel,String Comparison,目前,我在用JavaSwing编程TictaToe游戏时遇到了一些问题。 -框架应由9个空白标签组成 -单击X或O会出现 -第一次点击空白标签时应显示X或O,但多次点击同一标签不会产生更多影响 -当最后一次单击是X时,下一次应该是O -不管你是从X还是O开始 我写了两门课: import java.awt.EventQueue; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; p

目前,我在用JavaSwing编程TictaToe游戏时遇到了一些问题。 -框架应由9个空白标签组成 -单击X或O会出现 -第一次点击空白标签时应显示X或O,但多次点击同一标签不会产生更多影响 -当最后一次单击是X时,下一次应该是O -不管你是从X还是O开始

我写了两门课:

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TicTacToe extends JFrame{
    JPanel p = new JPanel();
    SignLabel labels[]= new SignLabel[9];
    public TicTacToe() {
        super("TicTacToe");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300,300);
        p.setLayout(new GridLayout(3, 3));
        for(int i=0;i<9;i++) {
            labels[i] = new SignLabel();
            p.add(labels[i]);
        }
        add(p);
        setVisible(true);
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override public void run() {
                TicTacToe t = new TicTacToe();
            }
        });
    }
}
如果我想编译代码并启动java文件,会出现想要的窗口,但要么没有标签,要么鼠标事件不起作用。 我猜getText()等的全部内容都是错误的,上面的方法也没有达到我所想的效果。 我很高兴能得到一些帮助!
谢谢大家!

这是您的代码更正

SignLabel.java

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;

public class SignLabel extends JLabel implements MouseListener {
    static boolean value = false;

    public SignLabel() {
        this.addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
        value = !value;
        if(getText().length() == 0){
          if(value){
            setText("X");
          }else{
            setText("O");
          }
        }
    }
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;

public class TicTacToe extends JFrame{
    JPanel p = new JPanel();
    SignLabel labels[]= new SignLabel[9];
    public TicTacToe() {
        super("TicTacToe");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300,300);
        p.setLayout(new GridLayout(3, 3));
        for(int i=0;i<9;i++) {
            labels[i] = new SignLabel();
            labels[i].setBorder(BorderFactory.createLineBorder(Color.black));
            p.add(labels[i]);
        }
        add(p);
        setVisible(true);
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override public void run() {
                TicTacToe t = new TicTacToe();
            }
        });
    }
}
TicTacToe.java

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;

public class SignLabel extends JLabel implements MouseListener {
    static boolean value = false;

    public SignLabel() {
        this.addMouseListener(this);
    }

    public void mouseClicked(MouseEvent e) {
        value = !value;
        if(getText().length() == 0){
          if(value){
            setText("X");
          }else{
            setText("O");
          }
        }
    }
    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;

public class TicTacToe extends JFrame{
    JPanel p = new JPanel();
    SignLabel labels[]= new SignLabel[9];
    public TicTacToe() {
        super("TicTacToe");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(300,300);
        p.setLayout(new GridLayout(3, 3));
        for(int i=0;i<9;i++) {
            labels[i] = new SignLabel();
            labels[i].setBorder(BorderFactory.createLineBorder(Color.black));
            p.add(labels[i]);
        }
        add(p);
        setVisible(true);
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override public void run() {
                TicTacToe t = new TicTacToe();
            }
        });
    }
}
导入java.awt.EventQueue;
导入java.awt.GridLayout;
导入javax.swing.JFrame;
导入javax.swing.*;
导入java.awt.*;
公共类TicTacToe扩展JFrame{
JPanel p=新的JPanel();
SignLabel标签[]=新的SignLabel[9];
公共交通{
超级(“Tictatoe”);
setDefaultCloseOperation(关闭时退出);
设置大小(300300);
p、 setLayout(新的GridLayout(3,3));

对于(int i=0;这不是比较
String
s的方式。应该使用
getText().equals(“O”)
而不是
=
。此外,
getText()
返回空字符串(
),而不是
null
,当标签中没有任何内容时。还请注意,标签没有宽度,因为它们是空的。可能很难单击它们。将
公共类SignLabel Extendes JLabel implements MouseListener
更改为
公共类SignLabel Extendes JButton implements ActionListener。事实上,现在我想,它们应该只是标准按钮,游戏细节存储在
TicTacToeModel
中。另外,据你所知,对于很多**监听器,Swing提供了一个等价的**适配器,你可以扩展它,通常使用匿名类。这样,你就可以实现你需要的,另一个我thods将被实现为空白方法。我非常感谢你的帮助!我在编程时仍然有一种非常复杂的思维方式,所以我总是让问题变得更加复杂。我不知道我可以使用边界作为边缘。这在玩游戏时确实更舒适。我也只是读了一些描述关于适配器的说明,更改了代码,现在确实少了一些行!谢谢!没问题!;)如果解决了问题,请接受答案,谢谢。