Component von JPanel mit Null Layout auf JPanel mit FlowLayout verschieben

Hi TobyNick,
nein, du hast mich damals ein wenig falsch verstanden. Ich habe dir hier mal einen kleinen Beispiel-Code geschrieben, um dir das mal ein bischen besser veranschaulichen zu können.

Die Klasse Pott fügst du zu deinem JFrame hinzu. Das Pott-Objekt übernimmt die Anzeige der einzelnen Würfel. D.h. der aktuelle Spieler wird über die Methode setActualPlayer(Player) gesetzt und danach wird die Methode update() aufgerufen. Die Methode update() wird immer dann aufgerufen, wenn der Spieler z.B. neu gewürfelt hat oder bei sonstigen Änderungen.
Java:
	public class Pott extends JPanel
	{
		private Player player;
		private final List<JPanel> pottPanels;
		
		/**
		 * 
		 */
		public Pott() {
			this.pottPanels = new LinkedList<JPanel>();
			
			// Je nachdem, wieviele JPanels du zum Würfelzeichnen brauchst
			// ...
			JPanel panel1 = new JPanel();
			pottPanels.add(panel1);
			add(panel1);
			JPanel panel2 = new JPanel();
			pottPanels.add(panel2);
			add(panel2);
			JPanel panel3 = new JPanel();
			pottPanels.add(panel3);
			add(panel3);
			JPanel panel4 = new JPanel();
			pottPanels.add(panel4);
			add(panel4);
			JPanel panel5 = new JPanel();
			pottPanels.add(panel5);
			add(panel5);
			// Den Panels müsstest du auch noch einen MouseListener für ein Click-Event mit übergeben.
			// Oder du nimmst statt JPanel's einfach JButton's.
		}
		
		public void setActualPlayer(Player player) {
			this.player = player;
		}
		
		public void update() {
			List<Cube> notSelectedCubes = player.getNotSelectedCubes();
			
			for (int i = 0; i < pottPanels.size(); i++) {
				JPanel panel = pottPanels.get(i);
				
				if(i < notSelectedCubes.size()) {
					Cube cube = notSelectedCubes.get(i);
					cube.draw((Graphics2D) panel.getGraphics());
				} else {
					panel.validate();
					panel.update(panel.getGraphics());
				}
			}
		}
	}

Die Klasse Player enthält jetzt unsere Würfelobjekte. Da nur der Spieler (nach OOP) weiß welche Würfel er "selektiert" hat und welche nicht, werden diese beiden Methoden - getNotSelectedCubes() und getSelectedCubes() - dem Player-Objekt hinzugefügt. Zudem bekommt das Player-Objekt noch die Methode dice() zum würfeln. Wird diese Methode aufgerufen, werden alle Würfel (welche nicht selektiert sind) gewürfelt.
Java:
	public class Player
	{
		private final List<Cube> cubes;
		
		public Player() {
			this.cubes = new ArrayList<Cube>();
			cubes.add(new Cube());
			cubes.add(new Cube());
			cubes.add(new Cube());
			cubes.add(new Cube());
			cubes.add(new Cube());
			// Je nachdem, wieviele Würfel du haben willst
			// ...
		}
		
		public void dice() {
			for (int i = 0; i < cubes.size(); i++) {
				Cube cube = cubes.get(i);
				if(!cube.isSelected()) {
					cube.dice();
				}
			}
		}
		
		public List<Cube> getNotSelectedCubes() {
			List<Cube> selectedCubes = new ArrayList<Cube>();
			for (int i = 0; i < cubes.size(); i++) {
				Cube cube = cubes.get(i);
				if(!cube.isSelected()) {
					selectedCubes.add(cube);
				}
			}
			return selectedCubes;
		}
		
		public List<Cube> getSelectedCubes() {
			List<Cube> selectedCubes = new ArrayList<Cube>();
			for (int i = 0; i < cubes.size(); i++) {
				Cube cube = cubes.get(i);
				if(cube.isSelected()) {
					selectedCubes.add(cube);
				}
			}
			return selectedCubes;
		}
	}

Die Klasse Cube ist nun also unser Würfel-Objekt. Von diesem Objekt können wir nun erfragen, ob es selektiert wurde und welche Nummer es gerade zeigt. Zudem (fürs zeichnen) können wir noch die x-/y-Koordinaten einsehen und ändern.
Java:
	public class Cube
	{
		private int shownValue;
		private boolean selected;
		private int x = 0;
		private int y = 0;
		
		public void dice() {
			this.shownValue = (int) (Math.random()*6+1);
		}
		
		public int getShownValue() {
			return shownValue;
		}
		
		public void setSelected(boolean isSelected) {
			this.selected = isSelected;
		}
		
		public boolean isSelected() {
			return selected;
		}

		public void setX(int x) {
			this.x = x;
		}

		public int getX() {
			return x;
		}

		public void setY(int y) {
			this.y = y;
		}

		public int getY() {
			return y;
		}
		
		public void draw(Graphics2D g) {
			g.drawRect(x, y, 40, 40);
			g.drawString(String.valueOf(shownValue), x+19, y+18); // Oder durch selber gezeichnete Punkte ersezten
		}
	}

Ich hoffe ich konnte dir meinen Gedankengang ein wenig veranschaulichen mit diesen Codeausschnitten. Bitte bedenke, dass ich diesen Code vorher nicht ausprobiert habe und ich daher nicht garantieren kann, dass er zu 100% einsatzbereit/lauffähig (sprich: Fehler können vorhanden sein) ist.
Du wirst wahrscheinlich nichts desto drotz die ein oder anderen Änderungen vornehmen müssen. Diese Arbeit wird dir wohl nicht erspart bleiben. ;)

Falls du noch Fragen haben solltest, nur zu. :)

Gruß

Fabio
 
@Spikee: Danke erstmal. Ich wusste nicht, dass repaint() nicht ausreicht. aber wofür gibt es dann repaint()? auf jeden fall, wenn ich validate benutzte oder auch revalidate, dann werden die würfel gar nicht mehr angezeigt. nicht mal mehr an den falschen koordinaten. einfach weg.
ich verstehe es einfach nicht. hmm...ich kann verstehen wenn ihr das thema schon satt habt ;-)
 
@Fabio: Danke für die Mühe, aber ich verstehe noch nicht, wie mir das bei meinem Problem helfen soll. Es geht hier ums NullLayout und FlowLayout und darum, wie die Komponenten angezeigt werden, wenn sie von einem Panel mit dem einen Layout in ein anderes Panel mit dem anderen Layout verschoben werden.
Du hast dir sehr viel Mühe gemacht um zu zeigen, wie man die Würfel verwaltet, aber das ist kein Problem. Das habe ich alles und das funktioniert.
 
Ich wollte dir damit nur zeigen, dass du die Würfel auch von den JPanel's trennen kannst. Dadurch würdest du dir das verschieben von Komponenten durch die verschiedenen Layouts sparen. ;)
 
Zurück