在Java中使用g.drawImage()时出错

时间:2015-12-03 23:33:22

标签: java image

我一直难以理解为什么我收到以下错误:

TicTacToeClient.java:128: error: cannot find symbol                  
g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);  
symbol:   variable icon  
location: class TicTacToeClient

TicTacToeClient.java:131: error: cannot find symbol                        
g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);  
symbol:   variable opponentIcon  
location: class TicTacToeClient

这是完整的参考代码:

package Group9;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.*;

public class TicTacToeClient {

public JFrame frame = new JFrame("Tic Tac Toe");
public Painter painter;
public final int Width = 506;
public final int Height = 527;

public Image field;
public Image redX;
public Image blueX;
public Image redCircle;
public Image blueCircle;

public static JTextField T1; //Player 1 - Points
public static JTextField T2; //Player 2 - Points
public static JTextField T3; //Status of the game - Connected Etc

public static int xMouse;
public static int yMouse;
public static int Clicked;
public char mark;

public String[] Square = new String[9];

public static int ServerPort;
public Socket Sock;
public BufferedReader in;
public PrintWriter out;

public TicTacToeClient(String ServerAddress) throws Exception {

    //Setup networking
    Scanner scanner = new Scanner(System.in);
    System.out.println("Please input the Server's Port number: ");
    int ServerPort = Integer.parseInt(scanner.nextLine());
    Sock = new Socket(ServerAddress, ServerPort);
    in = new BufferedReader(new InputStreamReader(Sock.getInputStream()));
    out = new PrintWriter(Sock.getOutputStream(), true);

    //Text Boxes
        //Text Field 1 -- Display Player 1 score &  JTextField(5) -> Create text thing that is 5 characters long
    T1 = new JTextField(20);
    T1.setBounds(100,40,110,30);
    painter.add(T1);

        //Text Field 2 - Display Player 2 score
    T2 = new JTextField(20);
    T2.setBounds(400,40,110,30);
    painter.add(T2);

        //Text Field 3 - The purpose is to show the user what mode he's connected to and if he's currently playing or not
    T3 = new JTextField(20);
    T3.setBounds(235,10,130,30);
    painter.add(T3);

    //Buttons:
        //Button 1
    JButton B1 = new JButton("QUIT GAME(orsomethingelse)");
    B1.setBounds(30,10,200,30);
    painter.add(B1);
        //Button 2
    JButton B2 = new JButton("RESET GAME");
    B2.setBounds(370,10, 200, 30);
    painter.add(B2);

    //Button Actions:
    B1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            out.println("QUIT");
            T3.setText("Opponent disconnected");
        }
    });

}//End TicTacToeClient(String ServerAddress)

private void loadImages() {
    try {
        ImageIcon temp = new ImageIcon("/board.png");
        field = temp.getImage();
        temp = new ImageIcon("/redX.png");
        redX = temp.getImage();
        temp = new ImageIcon("/redCircle.png");
        redCircle = temp.getImage();
        temp = new ImageIcon("/blueX.png");
        blueX = temp.getImage();
        temp = new ImageIcon("/blueCircle.png");
        blueCircle = temp.getImage();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void play() throws Exception {

    int lengthOfSpace = 160;
    String response;

    Graphics g;
    g.drawImage(field,60,40,null);

    try {
        response = in.readLine();

        if (response.startsWith("Welcome")) {
            char mark = response.charAt(49);
            Image icon = (mark == 'X') ? blueX : redCircle;
            Image opponentIcon  = (mark == 'X') ? redX : blueCircle;
            T3.setText(response);
        }//End if(response.startsWith("Welcome"))

        while (true) {
            response = in.readLine();

            if (response.startsWith("VALID_MOVE")) {
                int i = 1 + Integer.parseInt(response.substring(11));
                if (mark == 'X') {
                    g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                }
                else if (mark == 'O') {
                    g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                    T3.setText(response);
                }
                frame.repaint();
                T3.setText("Opponent's Turn");
            } else if (response.startsWith("OPPONENT_MOVED")) {
                int i = Integer.parseInt(response.substring(15));
                if (mark == 'X') {
                    g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                }
                else if (mark == 'O') {
                    g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                    T3.setText(response);
                }
                frame.repaint();
                T3.setText("Your Turn");
            } else if (response.startsWith("VICTORY")) {
                T3.setText("You win!");
                break;
            } else if (response.startsWith("DEFEAT")) {
                T3.setText("You lose!");
                break;
            } else if (response.startsWith("TIE")) {
                T3.setText("You tied!");
                break;
            } else if (response.startsWith("MESSAGE")) {
                T3.setText(response.substring(8));
            }
            painter.repaint();

        }//End while(true)

        out.println("QUIT");
    }//End try
    finally {
        Sock.close();
    }//End finally

}//End play()

class Painter extends JPanel implements MouseListener{
    private static final long serialVersionUID = 1L;

    public Painter() {
        setFocusable(true);
        requestFocus();
        setBackground(Color.WHITE);
        addMouseListener(this);
    }//End Painter()

    @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
    }//End paintComponent(Graphics g)

    public void mousePressed(MouseEvent e) {
        Clicked++;

        out = new PrintWriter(Sock.getOutputStream(), true);

        String temp = String.valueOf(mark);

        out.write("Total Clicks: " + Clicked);

        int xMouse = e.getX() / 160;
        int yMouse = e.getY() / 160;
        int i = 0;

        if ((xMouse > 49) && (xMouse < 210) && (yMouse > 99) && (yMouse < 250)) {
            i = 1;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 211) && (xMouse < 390) && (yMouse > 99) && (yMouse < 250)) {
            i = 0;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 391) && (xMouse < 551) && (yMouse > 99) && (yMouse < 250)) {
            i = 1;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 49) && (xMouse < 210) && (yMouse > 251) && (yMouse < 450)) {
            i = 2;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 211) && (xMouse < 390) && (yMouse > 251) && (yMouse < 450)) {
            i = 3;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 391) && (xMouse < 551) && (yMouse > 251) && (yMouse < 450)) {
            i = 4;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 49) && (xMouse < 210) && (yMouse > 450) && (yMouse < 601)) {
            i = 5;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 211) && (xMouse < 390) && (yMouse > 450) && (yMouse < 601)) {
            i = 6;
            Square[i] = temp;
            out.write("MOVE" + i);
        }
        else if ((xMouse > 391) && (xMouse < 551) && (yMouse > 450) && (yMouse < 601)) {
            i = 7;
            Square[i] = temp;
            out.write("MOVE" + i);
        }

    }//End mousePressed(MouseEvent e)

    public void mouseClicked(MouseEvent e) {
        //Not needed
    }

    public void mouseReleased(MouseEvent e) {
        //Not needed
    }

    public void mouseEntered(MouseEvent e) {
        //Not needed
    }

    public void mouseExited(MouseEvent e) {
        //Not needed
    }

}//End class Painter

private boolean wantsToPlayAgain() {
    int response = JOptionPane.showConfirmDialog(frame,
                                                 "Want to play again?",
                                                 "Tic Tac Toe is Fun Fun Fun",
                                                 JOptionPane.YES_NO_OPTION);
    frame.dispose();
    return response == JOptionPane.YES_OPTION;
}

public void main(String[] args) throws Exception {
    while (true) {
        System.out.println("Please input the Server's IP Address: ");
        Scanner scanner = new Scanner(System.in);
        String ServerIP = scanner.nextLine();
        System.out.println("Please input the Server's Port number: ");
        int ServerPort = Integer.parseInt(scanner.nextLine());

        TicTacToeClient client = new TicTacToeClient(ServerIP);
        //Layout GUI
        loadImages();
        client.painter = new Painter();
        client.painter.setPreferredSize(new Dimension(Width, Height));
        client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        client.frame.setSize(700, 750);
        client.frame.setVisible(true);
        client.frame.setResizable(false);
        client.play();
        if (!client.wantsToPlayAgain()) {
            break;
        }
    }
}


}//End class TicTacToeClient

它引用的代码部分是:

public void play() throws Exception {

    int lengthOfSpace = 160;
    String response;

    Graphics g;
    g.drawImage(field,60,40,null);

    try {
        response = in.readLine();

        if (response.startsWith("Welcome")) {
            char mark = response.charAt(49);
            Image icon = (mark == 'X') ? blueX : redCircle;
            Image opponentIcon  = (mark == 'X') ? redX : blueCircle;
            T3.setText(response);
        }//End if(response.startsWith("Welcome"))

        while (true) {
            response = in.readLine();

            if (response.startsWith("VALID_MOVE")) {
                int i = 1 + Integer.parseInt(response.substring(11));
                if (mark == 'X') {
                    g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                }
                else if (mark == 'O') {
                    g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                    T3.setText(response);
                }
                frame.repaint();
                T3.setText("Opponent's Turn");
            } else if (response.startsWith("OPPONENT_MOVED")) {
                int i = Integer.parseInt(response.substring(15));
                if (mark == 'X') {
                    g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                }
                else if (mark == 'O') {
                    g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
                    T3.setText(response);
                }
                frame.repaint();
                T3.setText("Your Turn");
            } else if (response.startsWith("VICTORY")) {
                T3.setText("You win!");
                break;
            } else if (response.startsWith("DEFEAT")) {
                T3.setText("You lose!");
                break;
            } else if (response.startsWith("TIE")) {
                T3.setText("You tied!");
                break;
            } else if (response.startsWith("MESSAGE")) {
                T3.setText(response.substring(8));
            }
            painter.repaint();

        }//End while(true)

        out.println("QUIT");
    }//End try
    finally {
        Sock.close();
    }//End finally

}//End play()

1 个答案:

答案 0 :(得分:0)

您在icon语句中创建变量if,因此此变量的范围仅在if内。 您应该在if方法之前的play()方法之前创建它们。 错误消息也非常明显:TicTacToeClient.java:128: error: cannot find symbol ... variable icon。有关更多信息和更好地理解,请阅读有关变量范围&#39;。