0

我正在尝试使用枚举来存储一堆字符串,但是当我将它们转换为字符串时它不起作用。我收到错误消息“无法从 String 转换为 ChessSquare.SelectedPiece。我认为这只会有一点改变,但我找不到要改变的地方。

这是我的代码:

package Logic;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;


    //chess square class, 1 instance of which for each square in the grid
    @SuppressWarnings("serial")
    public class ChessSquare extends JButton {

        //instance variables for position and pieces
        public int posX;
        public int posY;
        public String currentPiece;
        public enum selectedPiece{
            NONE, PAWN, ROOK, KNIGHT, BISHOP, QUEEN, KING
        }
        selectedPiece piece;

        //load images and cast into icons
        BufferedImage buttonIcon = ImageIO.read(new File(piece));
            ImageIcon Icon = new ImageIcon(buttonIcon);
                BufferedImage 

        //constructor for chess squares
        public ChessSquare(int x, int y, double p) throws IOException {
            this.setIcon(Icon);
                setVisible(true);
            }

        //accessor method for position
        public void squarePos(int x, int y){
            this.posX = x;
            this.posY = y;
        }

        //accessor method for currentPiece
        public void cPiece(){
            this.currentPiece = piece;
        }

        //specify what each value of enum slectedPiece represents
        public void selectedPiece(){
            switch (piece){
                case NONE:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg";
                case PAWN:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Pawn.jpg";
                case ROOK:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Rook.jpg";
                case KNIGHT:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Knight.jpg";
                case BISHOP:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Bishop.jpg";
                case QUEEN:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Queen.jpg";
                case KING:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\King.jpg";
            }
        }
    }
4

6 回答 6

2

在 Java 中,枚举是一个成熟的类......因此,您应该将枚举操作(转换为字符串/从字符串转换为字符串)放入其中。例如:

    public enum SelectedPiece{
        NONE("E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg"), 
        PAWN("E:\\Eclipse\\ChessF\\src\\Images\\Pawn.jpg"), 
        ROOK("E:\\Eclipse\\ChessF\\src\\Images\\Rook.jpg"), 
        KNIGHT("E:\\Eclipse\\ChessF\\src\\Images\\Knight.jpg"), 
        BISHOP("E:\\Eclipse\\ChessF\\src\\Images\\Bishop.jpg"), 
        QUEEN("E:\\Eclipse\\ChessF\\src\\Images\\Queen.jpg"), 
        KING("E:\\Eclipse\\ChessF\\src\\Images\\King.jpg");

        private String imageFilename;
        private ImageIcon image;

        private SelectedPiece( String imageFilename ) throws IOException {
            this.imageFilename = imageFilename;
            this.image = new ImageIcon(ImageIO.read(new File(piece)));
        }

        public String getImageFilename() {
            return imageFilename;
        }

        public ImageIcon getImage() {
            return image;
        }
    }

等等......然后只需在需要的地方使用枚举值。

于 2013-03-22T15:18:39.867 回答
1

枚举不是字符串。要在它们之间进行转换,您需要使用 valueOf

例如,

selectedPiece.valueOf("ROOK");

将返回枚举 selectedPiece.ROOK

编写枚举时,您可以使用自定义值,例如,

Public enum Piece {
  ROOK("Rook"),
  QUEEN("Queen")
}
于 2013-03-22T15:12:17.260 回答
0

当您this.currentPiece = piece;尝试在 String 对象中分配枚举类型时。不可能。

于 2013-03-22T15:13:07.300 回答
0

piece是类型selectedPiece(你的枚举)

你不能给它分配一个字符串。将路径存储在另一个变量中。

例如。:

String piecePath;
switch (piece){
                    case NONE:
                            piecePath = "E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg";
 ...
于 2013-03-22T15:14:25.253 回答
0

您应该使用枚举作为类中的变量来确定其类型。您可以简单地添加:

    public selectedPiece pieceType;

然后在对象的某处设置类型:

    pieceType = selectedPiece.ROOK;

然后,您可以使用枚举执行 switch 语句以将字符串分配给字符串变量。

你组织它的方式取决于你。

于 2013-03-22T15:14:53.833 回答
0

也许这是使用 CONSTANTS 的情况?毕竟,如果棋子的图形图像总是相同的图像,那不是让它保持不变吗?

static final string IMAGE_NONE = "E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg";
static final string IMAGE_PAWN = "E:\\Eclipse\\ChessF\\src\\Images\\Pawn.jpg";

在你的案例陈述中

case PAWN:
  piece = IMAGE_PAWN 

等等等等

于 2013-03-22T15:17:33.337 回答