Ist ein enum hier richtig? Enum toString() Methode.

abc66

Top Contributor
Also ich habe folgende Klassen:
Java:
enum FigClazz {
	leer       ("0 leer             ", '0', 0f     ), 
	turm_b     ("r Turm schwarz     ", 'r', -1 / 6f),
	turm_w     ("R Turm weiß        ", 'R', +1 / 6f), 
	springer_b ("n Springer schwarz ", 'n', -2 / 6f),
	springer_w ("N Springer weiß    ", 'N', +2 / 6f), 
	laeufer_b  ("b Läufer schwarz   ", 'b', -3 / 6f),
	laeufer_w  ("B Läufer weiß      ", 'B', +3 / 6f), 
	dame_b     ("q Dame schwarz     ", 'q', -4 / 6f),
	dame_w     ("Q Dame weiß        ", 'Q', +4 / 6f), 
	koenig_b   ("k König schwarz    ", 'k', -5 / 6f),
	koenig_w   ("K König weiß       ", 'K', +5 / 6f), 
	bauer_b    ("p Bauer schwarz    ", 'p', -1f    ),
	bauer_w    ("P Bauer weiß       ", 'P', +1f    );

	String s;
	char c;
	float f;

	FigClazz(String s, char c, float f) {
		this.s = s;
		this.c = c;
		this.f = f;
	}

	static FigClazz getFicClazz(char c) {
		for (FigClazz f : FigClazz.values()) {
			if (f.c == c) {
				return f;
			}
		}
		return null;
	}
}

class Fig {
	ArrayList<BufferedImage> bis = new ArrayList<BufferedImage>();
	FigClazz fc;

	boolean search(BufferedImage b) {
		al: for (BufferedImage a : bis) {
			for (int k = 0; k < a.getHeight(); k++) {
				for (int l = 0; l < a.getWidth(); l++) {
					if (a.getRGB(l, k) != b.getRGB(l, k)) {
						continue al;
					}
				}
			}
			return true;
		}
		return false;
	}

	@Override
	public int hashCode() {
		return Objects.hash(fc.c);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Fig other = (Fig) obj;
		return fc.c == other.fc.c;
	}

	@Override
	public String toString() {
		return String.format("Fig [bis=%s, type=%s, value=%s]", bis.size(), fc.c, fc.f);
	}
}

class Imgs {
	BufferedImage[][] bis = new BufferedImage[8][8];
}

und folgende Logik Methoden:
Java:
	static BufferedImage resize(BufferedImage img, int newW, int newH) {
		Image tmp = img.getScaledInstance(newW, newH, Image.SCALE_SMOOTH);
		BufferedImage dimg = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB);

		Graphics2D g2d = dimg.createGraphics();
		g2d.drawImage(tmp, 0, 0, null);
		g2d.dispose();

		return dimg;
	}

	static Imgs getImgs(BufferedImage b, Loc l) {
		Imgs ret = new Imgs();
		BufferedImage a = b.getSubimage(l.r.x, l.r.y, l.r.width * 8, l.r.height * 8);
		a = resize(a, a.getWidth() / 2, a.getHeight() / 2);
		int n = a.getWidth() / 8;
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				ret.bis[i][j] = a.getSubimage(j * n + 2, i * n + 2, n - 4, n - 4);
			}
		}
		return ret;
	}

	static HashMap<Character, Fig> getFigs(Imgs imgs) {
		HashMap<Character, Fig> ret = new HashMap<Character, Fig>();
		for (int i = 0; i < 8; i++) {
			for (int j = 0; j < 8; j++) {
				BufferedImage b = imgs.bis[i][j];
				Character chr = null;
				for (Fig fig : ret.values()) {
					if (fig.search(b)) {
						chr = fig.fc.c;
						break;
					}
				}
				if (chr == null) {
//					displayImg(imgs, i, j, 0, 0);
//					String[] sa = { 
//							"0 leer             ", "r Turm schwarz     ", "R Turm weiß        ",
//							"n Springer schwarz ", "N Springer weiß    ", "b Läufer schwarz   ", "B Läufer weiß      ",
//							"q Dame schwarz     ", "Q Dame weiß        ", "k König schwarz    ", "K König weiß       ",
//							"p Bauer schwarz    ", "P Bauer weiß       " };
					FigClazz[] values = FigClazz.values();
					chr = ((FigClazz) JOptionPane.showInputDialog(null, "Figur?", "Figur?",
							JOptionPane.QUESTION_MESSAGE, new ImageIcon(imgs.bis[i][j]), values, values[0])).c;
				}
				if (ret.containsKey(chr)) {
					ret.get(chr).bis.add(b);
				} else {
					Fig f = new Fig();
					f.bis.add(b);
					f.fc = FigClazz.getFicClazz(chr);
					ret.put(chr, f);
				}
			}
		}
		return ret;
	}

und folgende Main:
Java:
	public static void main(String[] args) throws AWTException, InterruptedException {
		BufferedImage b = /*...*/;

		Imgs imgs = getImgs(b, l);

		HashMap<Character, Fig> figs = getFigs(imgs);

		System.out.println(figs);
	}

Jetzt stellt sich mir natürlich die Frage, wie im Dropdown-Menue nicht "dame_b" usw. angezeigt wird, sonder der jeweilige String "q Dame schwarz" usw.
 
Es wird die toString()-Methode auf dem enum aufgerufen. Die gibt standardmäßig den Namen vom enum-Element zurück. Überschreibe einfach toString(), so das s zurückgegeben wird -- und bitte andere Bezeichner wählen 😉
 

Zurück
Oben