JLabel an einer Stelle setzen und an anderer Stelle neu einfügen



  • Ich schreibe die GUI für ein Spiel. Es ist ein Brettspiel. Ich habe also ein Panel im GridLayout. Dort habe ich mit Hilfe eines 2-dimensionalen Arrays vom Typ JPanel alle Felder eingefügt. Also für jede Zelle ein eigenes Panel. Je nachdem, ob gewollt wird dann auf ein Panel (also eine Zelle meines Spielbretts) ein JLabel geaddet. Auf dem JLabel ist dann ein ImageIcon der jeweiligen Spielfigur gezeichnet.

    So...
    nun habe ich eine Methode geschrieben, die Figuren auf dem Spielbrett setzen kann. Also wird auf dem jeweiligen JPanel einfach ein JLabel geaddet und das JLabel mit einem ImageIcon versehen.

    Eine andere Methode kann alle Components (JLabels) einer Zelle (JPanel) entfernen, indem sie removeAll() für das jeweilige JPanel aufruft.

    Eine dritte Methode soll die beiden oberen Methoden aufrufen und quasi eine Bewegung der Spielfigur realisieren. Also entferne die Figur von einer Zelle und setze sie in die andere Zelle ein.

    Nun zum Problem: Wenn ich die Methode aufrufe - das passiert testweise mit einem provisorischen JButton - sehe ich keine Veränderung auf dem Spielbrett. Erst, wenn ich das Fenster minimiere und dann wiederherstelle oder die Größe des Fensters mit der Maus verändere, befindet sich die Figur in der anderen Zelle. Rufe ich repaint() oder ähnliche Methoden auf sehe ich dann zwar sofort wie das JLabel entfernt wird, aber damit es in der anderen Zelle wieder auftaucht muss ich es wieder minimieren oder die Größe des Fensters verändern.

    Hier mal meine Methoden zum setzn und entfernen der Figuren:

    /**
    	 * Setzt eine Spielfigur an der angegebenen Position.
    	 * 
    	 * @param x Die x-Koordinate des Spielbretts
    	 * @param y Die y-Koordinate des Spielbretts
    	 * @param kind Die Art der Figur. Muss entweder ATT, DEF oder KING sein.
    	 */
    	public void setFigure(int x, int y, ImageIcon kind) {
    		if(kind == ATT || kind == DEF || kind == KING) {
    			JLabel temp = new JLabel(kind);
    			cellPanels[y][x].add(temp);
                            repaint(); // Das geht nicht. Beim Entfernen unten geht es aber doch
    		} else {
    			throw new IllegalArgumentException("Gebe für den ImageIcon-Parameter entweder ATT oder DEF oder KING an!");
    		}
    	}
    
    	/**
    	 * Löscht die Spielfigur an der angegebenen Position.
    	 */
    	public void removeFigure(int x, int y) {
    		cellPanels[y][x].removeAll();
    		repaint(); // Das funktioniert. Bei Klick auf den Button ist das JLabel sofort weg.
    	}
    
    	/**
    	 * Bewegt eine Figur von einer Zelle in eine andere.
    	 * Dabei wird die Figur in der alten Zelle gelöscht und dann in der neuen Zelle gesetzt.
    	 */
    	public void moveFigureFromTo(int fromX, int fromY, int toX, int toY, ImageIcon kind) {
    		removeFigure(fromX, fromY);
    		setFigure(toX, toY, kind);
    	}
    

    Ich hoffe ich habe es anschaulich erklären können und dass mir jemand helfen kann.




Log in to reply