problem mit anzeigen eines geänderten Container

Status
Nicht offen für weitere Antworten.

GhostShotIV

Neues Mitglied
ich weiß, es ist nicht die feine art, direkt nach der registrierung um hilfe bei code zu bitten, aber ich muss diese aufgabe bis 23:30 lösen, da ich dieses projekt um 24:00 abgeben muss.

nun zu meinem problem. ich habe einen Container, der eine beschreibung und andere dinge anzeigen soll, wenn auf einen JButton mit einer figur geklickt wird. das problem ist nun, dass nicht der neue Container angezeigt werden kann, wenn ich nicht die hauptklasse ausblende und neu einblende oder mit pack() neu anzeigen lasse. allerdings, ist das ein und ausblenden, bzw. das pack(), deutlich zu sehen. ich würde mich freuen, wenn mir jemand eine lösung für mein problem geben könnte oder einen hinweis, womit ich das problem lösen könnte.

hier mal code-teile der wichtigsten klassen:
Code:
public class GUI extends JFrame{
	Game g = null;
	String[] player = new String[2];
	Beschreibung desOben, desUnten;
	public GUI(String spieler1, String spieler2) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		if(spieler1.trim().equals("") && spieler2.trim().equals(""))
			new AskForNames(this);
		else{
			this.player[0]=spieler1;
			this.player[1]=spieler2;
		}
		try {
			this.g = new Game();
		} catch (PieceNotPlacebaleException e) {
			this.handlePNPException();
		}
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(100, 100, 600, 600);
		this.setTitle("Aderlass - Das Spiel");
		this.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		this.desOben = new Beschreibung(this.player,0);
		this.desUnten = new Beschreibung(this.player,1);
		this.setExtendedState(Frame.MAXIMIZED_BOTH);
		this.setResizable(false);
		this.setVisible(false);

		c.fill = GridBagConstraints.BOTH;
		c.gridheight = 1;
		c.gridwidth = 2;
		c.gridx = 0;
		c.gridy = 0;
		c.weightx = 1;
		c.weighty = 0;
		c.ipady = 100;

		// "Banner"
		Icon i = new ImageIcon("oberflaeche/Banner.png");

		JButton m = new JButton(i);
		this.add(m, c);

		c.gridy = 1;
		c.gridwidth = 1;
		c.gridheight = 2;
		c.weightx = 0.7;
		c.weighty = 1;
		c.ipady = 0;
		// Spielfeld
		Spielfeld s = new Spielfeld(g, this.desOben, this.desUnten);
		this.add(s, c);

		c.weightx = 1;
		c.weighty = 1;
		c.gridx = 1;
		c.gridy = 1;
		c.gridheight = 1;
		// Beschreibung Oben
		this.add(this.desOben, c);

		c.gridy = 2;
		// Beschreibung Unten
		this.add(this.desUnten, c);
		
		Thread t = new Thread(new CheckWin(this.g, this.player, this));
		t.start();
		this.setVisible(true);
	}
}
der code des actionlisteners des JButtons der figur:
Code:
public void actionPerformed(ActionEvent arg0) {
	FigurenButton ev = (FigurenButton)arg0.getSource();
	if(Spielfeld.this.from==null){
		Spielfeld.this.from = ev;
		ev.switchBackground();
		int player = Spielfeld.this.g.getCurrentPlayer();
		Beschreibung desc=null;
		switch(player){
		case 0: desc=Spielfeld.this.desOben;
				break;
		case 1: desc=Spielfeld.this.desUnten;
				break;
		}
		desc.setDesc(ev.getFigur());
	}
	else{
		if(Spielfeld.this.g.moveFigur(Spielfeld.this.from.getPosition(), ev.getPosition())){
			Spielfeld.this.from = null;
			Spielfeld.this.spielfeldAnzeigen();
		}
		else{
			((FigurenButton)Spielfeld.this.getComponentAt(Spielfeld.this.from.getX(), Spielfeld.this.from.getY())).switchBackground();
			Spielfeld.this.from = null;
		}
	}
}
und hier noch die methode im Component, die die neuen inhalte einfügt und die neuen inhalte auch anzeigen soll.
Code:
public void setDesc(Figur f){
	if(this.pic!=null)
		this.remove(this.pic);
	if(this.text!=null)
		this.remove(this.text);
	File fi=null;
	if(f!=null)
		fi = new File(f.getPicPath());
	if(fi!=null && fi.exists())
		this.pic=new JButton(new ImageIcon(f.getPicPath()));
	else if(f!=null)
		this.pic=new JButton(f.getName());
	else
		this.pic=new JButton("");
	if(f!=null)
		this.text=new JEditorPane("text/plain",f.getDescription());
	else
		this.text=new JEditorPane("text/plain","");
	this.add(this.pic);
	this.add(this.text);
	GUI.this.pack();
	GUI.this.setExtendedState(Frame.MAXIMIZED_BOTH);
}

falls noch code teile fehlen, die jemand zur lösung bräuchte, bitte melden

und schonmal danke an alle, die sich durchringen können, mir so kurzfristig noch zu helfen
 
Da gibt's Methoden wie validate, revalidate und/oder repaint, die in ähnlichen Fällen schon nützliche Dienste geleistet haben.
 
danke für die prompte antwort. validate hat prima funktioniert. vielen vielen dank. du hast mir wirklich den tag gerettet 😀

wieder eine neue, nützliche methode kennen gelernt :roll:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben