LayoutManager Eigener LayoutManager funktioniert nicht.

Volvagia

Top Contributor
Ich habe gerade versucht, meinen ersten eigenen LayoutManager zu schreiben. Leider funktioniert er nicht richtig. Wenn ich etwas hinzufüge, sieht man am Ende nichts. :noe: Kann mir jemand bitte sagen, was da schief läuft?
Er soll wie das FlowLayout, nur Senkrecht funktionieren. Und die Größe nach der Pref. Size setzen.

Java:
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
import java.util.LinkedList;
import java.util.List;

public class VerticalFlowLayout implements LayoutManager
{
	private int DEFAULT_H_GAPS = 5;
	private int DEFAULT_V_GAPS = 2;
	
	private int hgaps;
	private int vgaps;
	
	private List<Component> componentList;
	
	public VerticalFlowLayout()
	{
		super();
		hgaps = DEFAULT_H_GAPS;
		vgaps = DEFAULT_V_GAPS;
		componentList = new LinkedList<Component>();
	}
	public void addLayoutComponent(String level, Component comp)
	{
		componentList.add(comp);
	}
	public Dimension preferredLayoutSize(Container parent)
	{
		return minimumLayoutSize(parent);
	}
	public Dimension minimumLayoutSize(Container parent)
	{
		return(new Dimension(0, 0));
	}
	public void layoutContainer(Container parent)
	{
		int currentX = hgaps;
		int currentY = vgaps;
		Dimension parentSize = parent.getSize();
		
		for(int i = 0, size = componentList.size(); i < size; i++)
		{
			Component c = parent.getComponent(i);
			Dimension prefSize = c.getPreferredSize();
			
			c.setSize(prefSize);
			
			currentY+= prefSize.height;
			
			if(currentY > parentSize.height)
				currentY = vgaps;
			currentX+= prefSize.width + hgaps;
			
			c.setLocation(currentX, currentY);
		}
	}
	public void removeLayoutComponent(Component comp)
	{
		componentList.remove(comp);
	}
}
 
Zuletzt bearbeitet:
...wobei die Komponenten natürlich auch den Parent Container hinzugefügt werden müssen.
Eventuell liegts auch daran, dass die PreferredSize = MinimalSize = 0x0 ist.
 
Danke. Mir ist aufgefallen, dass #addLayoutComponent(String, Component) garnicht automatisch aufgerufen wird. Wenn ich das explizit beim Hinzufügen zum Parent aufrufe, funktioniert es. Zwar nicht richtig, aber es funktioniert. Aber sollte das nicht automatisch passieren?
 
Nutze mal LayoutManager2 und verwende die
Code:
public void addLayoutComponent(Component comp, Object constraints)
 
Vielen Dank, ich glaube jetzt läuft es einwandfrei.🙂 Zumindest ist mir noch nichts negatives aufgefallen.
Hier einmal mein Endsource, falls jemand etwas damit anfangen kann:

Java:
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;
import java.util.LinkedList;
import java.util.List;

public class VerticalFlowLayout implements LayoutManager2
{
	private static final int DEFAULT_H_GAPS = 5;
	private static final int DEFAULT_V_GAPS = 2;
	
	private int hgaps;
	private int vgaps;

	private List<Component> componentList;
	private Dimension componentSize;
	
	private Dimension preferredLayoutSize;
	
	public VerticalFlowLayout()
	{
		this(DEFAULT_H_GAPS, DEFAULT_V_GAPS);
	}
	public VerticalFlowLayout(int hgaps, int vgaps)
	{
		super();
		
		this.hgaps = hgaps;
		this.vgaps = vgaps;
		componentSize = new Dimension();
		preferredLayoutSize = new Dimension();
		componentList = new LinkedList<Component>();
	}
	public void addLayoutComponent(String level, Component comp)
	{
		addLayoutComponent(comp, null);
	}
	public void addLayoutComponent(Component comp, Object constraints)
	{
		Dimension prefSize = comp.getPreferredSize();
		componentSize.width = Math.max(prefSize.width, componentSize.width);
		componentSize.height = Math.max(prefSize.height, componentSize.height);
		
		if(!componentList.contains(comp))
			componentList.add(comp);
	}
	public Dimension preferredLayoutSize(Container parent)
	{
		return minimumLayoutSize(parent);
	}
	public Dimension minimumLayoutSize(Container parent)
	{
		int parentHeight = parent.getHeight();
		int compHeight = componentSize.height;
		int compWidth = componentSize.width;
		int compsOnYAxis = parentHeight / compHeight;
		if(compsOnYAxis == 0)
			return(new Dimension(0, 0));
		
		int compsOnXAxis = componentList.size() / compsOnYAxis;
		
		preferredLayoutSize.width = compsOnXAxis * compWidth + compsOnXAxis * hgaps;
		return(preferredLayoutSize);
	}
	public void layoutContainer(Container parent)
	{
		int currentX = hgaps;
		int currentY = vgaps;
		Dimension parentSize = parent.getSize();
		
		for(int i = 0, size = componentList.size(); i < size; i++)
		{
			Component c = componentList.get(i);
			Dimension prefSize = c.getPreferredSize();
			
			c.setSize(prefSize);
			c.setLocation(currentX, currentY);
			
			currentY+= prefSize.height + vgaps;
			
			if(currentY > parentSize.height - prefSize.height)
			{
				currentY = vgaps;
				currentX+= prefSize.width + hgaps;
			}
		}
	}
	public void removeLayoutComponent(Component comp)
	{
		componentList.remove(comp);
	}

	public Dimension maximumLayoutSize(Container target)
	{
		return(null);
	}
	public float getLayoutAlignmentX(Container target)
	{
		return 0;
	}
	public float getLayoutAlignmentY(Container target)
	{
		return 0;
	}
	public void invalidateLayout(Container target) {}
}

Die Componenten richten sich jetzt nach den mit der größten Pref. size, wobei Höhe und Breite getrennt betrachtet werden.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben