swing无法在Tictaoe的java游戏中画线
我只使用一个叫做Game的类。事实上,我对GUI还不熟悉。 它运行良好,但如果有人赢了,它不会在每次点击后检查赢家时画线。我不确定这是不是一个愚蠢的问题:|
package com.Myproject.main;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Game extends JFrame implements Runnable , ActionListener
{
JButton x0y0 , x1y0 , x2y0 ;
JButton x0y1 , x1y1 , x2y1 ;
JButton x0y2 , x1y2 , x2y2 ;
int turn = 0;
Graphics g;
Thread thread = new Thread();
String symbolx0y0;
String symbolx1y0;
String symbolx2y0;
String symbolx0y1;
String symbolx1y1;
String symbolx2y1;
String symbolx0y2;
String symbolx1y2;
String symbolx2y2;
public Game()
{
setSize(300 , 300);
setTitle("Tic Tac Toe");
setLocationRelativeTo(null);
getContentPane().setLayout(null);
x0y0 = new JButton("Click me");
x1y0 = new JButton("Click me");
x2y0 = new JButton("Click me");
x0y1 = new JButton("Click me");
x1y1 = new JButton("Click me");
x2y1 = new JButton("Click me");
x0y2 = new JButton("Click me");
x1y2 = new JButton("Click me");
x2y2 = new JButton("Click me");
x0y0.setBounds( 0 , 0 , 90 , 90);
x1y0.setBounds( 91 , 0 , 90 , 90);
x2y0.setBounds( 182 , 0 , 90 , 90);
x0y1.setBounds( 0 , 91 , 90 , 90);
x1y1.setBounds( 91 , 91 , 90 , 90);
x2y1.setBounds( 182 , 91 , 90 , 90);
x0y2.setBounds( 0 , 182 , 90 , 90);
x1y2.setBounds( 91 , 182 , 90 , 90);
x2y2.setBounds( 182 , 182 , 90 , 90);
getContentPane().add(x0y0);
getContentPane().add(x1y0);
getContentPane().add(x2y0);
getContentPane().add(x0y1);
getContentPane().add(x1y1);
getContentPane().add(x2y1);
getContentPane().add(x0y2);
getContentPane().add(x1y2);
getContentPane().add(x2y2);
x0y0.addActionListener(this);
x1y0.addActionListener(this);
x2y0.addActionListener(this);
x0y1.addActionListener(this);
x1y1.addActionListener(this);
x2y1.addActionListener(this);
x0y2.addActionListener(this);
x1y2.addActionListener(this);
x2y2.addActionListener(this);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public void run()
{
while(true)
{
}
}
public static void main(String[] args)
{
Game game = new Game();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == x0y0)
{
if(turn%2==0){
x0y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx0y0("Circle");
return;
}
if(turn%2!=0){
x0y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx0y0("Cross");
return;
}
}
if(e.getSource() == x1y0)
{
if(turn%2==0){
x1y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx1y0("Circle");
return;
}
if(turn%2!=0){
x1y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx1y0("Cross");
return;
}
}
if(e.getSource() == x2y0)
{
if(turn%2==0){
x2y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx2y0("Circle");
return;
}
if(turn%2!=0){
x2y0.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx2y0("Cross");
return;
}
}
if(e.getSource() == x0y2)
{
if(turn%2==0){
x0y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx0y2("Circle");
return;
}
if(turn%2!=0){
x0y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx0y2("Cross");
return;
}
}
if(e.getSource() == x1y2)
{
if(turn%2==0){
x1y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx1y2("Circle");
return;
}
if(turn%2!=0){
x1y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx1y2("Cross");
return;
}
}
if(e.getSource() == x2y2)
{
if(turn%2==0){
x2y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx2y2("Circle");
return;
}
if(turn%2!=0){
x2y2.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx2y2("Cross");
return;
}
}
if(e.getSource() == x0y1)
{
if(turn%2==0){
x0y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx0y1("Circle");
return;
}
if(turn%2!=0){
x0y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx0y1("Cross");
return;
}
}
if(e.getSource() == x1y1)
{
if(turn%2==0){
x1y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx1y1("Circle");
return;
}
if(turn%2!=0){
x1y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx1y1("Cross");
return;
}
}
if(e.getSource() == x2y1)
{
if(turn%2==0){
x2y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Circle.png"));
turn++ ;
setSymbolx2y1("Circle");
return;
}
if(turn%2!=0){
x2y1.setIcon(new ImageIcon("C:/Users/lenovo/Desktop/self/Cross.png"));
turn++ ;
setSymbolx2y1("Cross");
return;
}
}
checkWinner();
}
public void drawCircle(Graphics g){
g.drawString("Circle Won" , 30 , 30);
}
public void drawCross(Graphics g){
g.drawString("Cross Won" , 30 , 30);
}
public void checkWinner(){
if(symbolx2y0 == symbolx1y1 && symbolx1y1 == symbolx2y2 && symbolx2y2 == "Circle") drawCircle(g);
if(symbolx2y0 == symbolx1y1 && symbolx1y1 == symbolx2y2 && symbolx2y2 == "Cross")drawCross(g);
if(symbolx0y0 == symbolx1y1 && symbolx2y2 == symbolx1y1 && symbolx0y0 == "Circle")drawCircle(g);
if(symbolx0y0 == symbolx1y1 && symbolx2y2 == symbolx1y1 && symbolx0y0 == "Cross")drawCross(g);
if(symbolx0y0 == symbolx1y0 && symbolx1y0 == symbolx2y0 && symbolx0y0 == "Circle")drawCircle(g);
if(symbolx0y0 == symbolx1y0 && symbolx1y0 == symbolx2y0 && symbolx0y0 == "Cross")drawCross(g);
if(symbolx0y1 == symbolx1y1 && symbolx1y1 == symbolx2y1 && symbolx0y1 == "Circle")drawCircle(g);
if(symbolx0y1 == symbolx1y1 && symbolx1y1 == symbolx2y1 && symbolx0y1 == "Cross")drawCross(g);
if(symbolx0y2 == symbolx1y2 && symbolx1y2 == symbolx2y2 && symbolx0y2 == "Circle")drawCircle(g);
if(symbolx0y2 == symbolx1y2 && symbolx1y2 == symbolx2y2 && symbolx0y2 == "Cross")drawCross(g);
if(symbolx0y0 == symbolx0y1 && symbolx0y1 == symbolx0y2 && symbolx0y2 == "Circle")drawCircle(g);
if(symbolx0y0 == symbolx0y1 && symbolx0y1 == symbolx0y2 && symbolx0y2 == "Cross")drawCross(g);
if(symbolx1y0 == symbolx1y1 && symbolx1y1 == symbolx1y2 && symbolx1y2 == "Circle")drawCircle(g);
if(symbolx1y0 == symbolx1y1 && symbolx1y1 == symbolx1y2 && symbolx1y2 == "Cross")drawCross(g);
if(symbolx2y0 == symbolx2y1 && symbolx2y2 == symbolx2y1 && symbolx2y1 == "Circle")drawCircle(g);
if(symbolx2y0 == symbolx2y1 && symbolx2y2 == symbolx2y1 && symbolx2y1 == "Cross")drawCross(g);
}
public String setSymbolx0y0(String symbolx0y0){
return this.symbolx0y0 = symbolx0y0;
}
public String setSymbolx1y0(String symbolx1y0){
this.symbolx1y0 = symbolx1y0;
return symbolx1y0;
}
public String setSymbolx2y0(String symbolx2y0){
this.symbolx2y0 = symbolx2y0;
return symbolx2y0;
}
public String setSymbolx0y1(String symbolx0y1){
this.symbolx0y1 = symbolx0y1;
return symbolx0y1;
}
public String setSymbolx1y1(String symbolx1y1){
this.symbolx1y1 = symbolx1y1;
return symbolx1y1;
}
public String setSymbolx2y1(String symbolx2y1){
this.symbolx2y1 = symbolx2y1;
return symbolx2y1;
}
public String setSymbolx0y2(String symbolx0y2){
this.symbolx0y2 = symbolx0y2 ;
return symbolx0y2;
}
public String setSymbolx1y2(String symbolx1y2){
this.symbolx1y2 = symbolx1y2;
return symbolx1y2;
}
public String setSymbolx2y2(String symbolx2y2){
this.symbolx2y2 = symbolx2y2;
return symbolx2y2;
}
}
# 1 楼答案
symbolx2y2 == "Circle"
不是String
比较在Java中的工作方式,您应该使用类似"Circle".equals(symbolx2y2)
的东西。这也适用于symbolx1y1 == symbolx2y2
李>g
从未被赋值,所以它将是null
,此外,这不是定制绘画在Swing中的工作方式。有关详细信息,请参见Painting in AWT and Swing和Performing Custom Painting。话虽如此,基于您的代码,我不会使用它,相反,我会显示一个对话框,其中包含您想要显示的任何消息。有关详细信息,请参见How to Make Dialogs李>null
布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题。有关详细信息,请参见Laying Out Components Within a ContainerThread thread = new Thread();
什么也没做,基本上是一种浪费JFrame
扩展,您没有向类添加任何新功能,只是将自己锁定在单个用例中。最好从JPanel
开始,并将其添加到JFrame
的实例或您想要的任何容器中