Modifizierte JComponent und LayoutManager

SCIPIO-AEMILIANUS

aka Dubdidadu
Nabend,

ich hab ein Problem mit einer selbstgebauten JComponente, die sich nicht durch ein FlowLayout anordnen lässt.
Folgendes steht im Constructor von nem JFrame:
Code:
FlowLayout experimentLayout = new FlowLayout(FlowLayout.CENTER);
this.setLayout(experimentLayout);
b=new ListItem();
this.add(b);
a=new ListItem();
this.add(a);
ListItem ist hierbei meine JComponente.
Die sieht von innen bisher aus:
Code:
public class ListItem extends JComponent {
	ListItem(){
	
	}
	private static final long serialVersionUID = 1964597614409177719L;
	public void paint(Graphics g){
		Color bg=new Color(0,0,0,128);
		g.setColor(bg);
		g.fillRoundRect(0,0,120,120,40,40);
	}
}
Wie folgt sieht dann das Fenster aus:
screen.PNG
Demnach beachtet der LayoutManager die horizontale Lücke von standartmäßig 5px, kann aber anscheinend, nicht die Breite der Componenten ermitteln und legt sie somit übereinander.
Ich hab bereits probiert, indem ich die Funktionen:
  • getSize()
  • computeVisibleRect(Rectangle visibleRect)
  • getHeight()
  • getWidth()
  • getBounds()
in Listitem ersetzt hab durch eigene Funktionen die entsprechende Maße von 120*120 zurückgeben das Problem zu lösen, aber ohne Erfolg.
Wo liegt der Fehler?
 
Eigentlich funktioniers richtig, bei mir jedenfalls, wenn man die PreferedSize setzt, damit der LayoutManager auch weiß, womit er arbeiten muss. Das kannste z.B. im Konstruktor machen:
Java:
public ListItem() {
	setPreferredSize(new Dimension(120, 120));
}
Sollte jetzt auch bei dir normal laufen.
 
Vielen Dank.
Stimmt, hab jetzts 3te mal die Dokumentation gewälzt und habs auch endlich gelesen, dass pack() und LayoutManager auf preferredSize schauen.
 
Ich muss das Thema nochmal öffnen, weil ich schon wieder auf Verständnisprobleme mit dem Layoutmanager gestoßen bin.
Code:
		this.setMinimumSize(new java.awt.Dimension(640,480));
		c1=new Container();
		c2=new Container();
		c1.setPreferredSize(new Dimension(20,30));
		c1.setPreferredSize(new Dimension(640,480));
		c1.setLayout(new FlowLayout(FlowLayout.LEFT));
		c2.setLayout(new FlowLayout(FlowLayout.CENTER));
		this.setTitle("MainWindow");
		this.setLayout(new BorderLayout());
		this.add(BorderLayout.NORTH,c1);
		this.add(BorderLayout.CENTER,c2);
		b=new ListItem();
		c2.add(b);
Jetzt wird aber b im Container c2 linksbündig angeordnet. Wo liegt hierbei das Problem?
Es sollen alle Objeckte in Kontainer c1 linksbündig sein und dann wie weiter oben die grauen 4 Ecke mittig in c2. Danke im vorraus.
 
Seltsam das Verhalten bei dir, denn bei mir wird alles so dargestellt, wie es soll. Hast du vielleicht irgendwo anders Codezeilen, die das Verhalten ändern? In diesem Codestückchen wird jedenfalls alles richtig dargestellt.
 
Hab den Übeltäter gefunden. Hatte noch in ListItem
Code:
	public Rectangle getBounds() {
		Rectangle rect = new Rectangle();
		rect.height=120;
		rect.width=120;
		rect.x=0;
		rect.y=0;
		return rect;
	}
stehen.
Das hat irgendwie den LayoutManager gekillt.
 

Neue Beiträge

Zurück