Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen

Tassimmo

Mitglied
Hallo Community,

ich hab zwar etwas Erfahrung mit Swing-Guis in Java, hab aber bisher selten mit Layouts gearbeitet.
Nun möchte ich, dass mir mein Programm eine Anzahl Meldungen schickt, die dann auf einer GUI angezeigt werden.
Eine Meldung ist bei mir ein simples JLabel, in dem eine Nachricht steht. So weit so gut.
Ich habs auch schon geschafft, dass die untereinander stehen.
Allerdings nehmen die Label nicht die von mir definierte Größe an, sondern sind immer nur so groß wie der Text des Labels.

Java:
package gui;

import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MessagePanel extends JPanel {

	ArrayList<JLabel> messageList = new ArrayList<JLabel>();

	public MessagePanel(String pTitle) 
	{
		this.setSize(300, 500);
		this.setBorder(BorderFactory.createLineBorder(Color.black));
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		JLabel lblTitle = new JLabel(pTitle);
		lblTitle.setSize(300, 25);
		//lblTitle.setAlignmentX(Component.CENTER_ALIGNMENT);
		this.add(lblTitle);
		this.add(new JLabel(" "));
		
		
	}
	
	public void addMessage(String pMessage)
	{
		JLabel msgLabel = new JLabel(pMessage);
	//	msgLabel.setBorder(BorderFactory.createLineBorder(Color.black));
		msgLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
               [B] msgLabel.setSize(300,50);[/B]
		messageList.add(msgLabel);
		this.add(msgLabel);
	}

}
Ursprünglich wollte ich durch die Size festlegen, dass er auch bei einem FlowLayout alle Komponenten untereinander setzt, jetzt hab ich eine Lösung mit BoxLayout gefunden. Trotzdem möchte ich wenigstens die Höhe noch drin haben, damit zwischen den Texten der einzelnen Messages noch etwas Platz ist und es nicht so "gequetscht" aussieht.

Mit dem Alignment muss ich auch noch rumbasteln, aber das Größending ist erstmal wichtiger.

Ich hoffe, es ist einigermaßen verständlich, was mein Problem ist. 😳
Bereits im Voraus vielen Dank für Antworten.
 
Zumindest hab ich jetzt den verticalStrut() gefunden, der mir eine Trennung zwischen zwei verschiedenen Labels setzt, damit die nicht so aneinander kleben. Dafür schonmal danke.
Nun hab ich ein Fenster der Breite 300. Der Text, den ich in die Labels eingebe, muss aber natürlich nicht zwingend so lang sein. Leider scheint mein Layout jedoch die Größe meines Labels zu ignorieren, da es immer nur so breit ist wie der Text innerhalb.

fd_test1.PNG
Das Label ist rot markiert und sollte eigentlich die komplette Fensterbreite (bis zu der schwarzen Linie rechts) laufen...
Der Labelcode hat sich seit dem obigen Beispiel nicht geändert.

In deinem Link hab ich nur Wege gefunden, um den Abstand zwischen zwei Komponenten zu verändern, nicht aber die Größe eines Elements. Daher muss ich grad leider nochmal fragen^^
 
Zuletzt bearbeitet:
label

Java:
Dimension d =msgLabel.getSize();
double hight =d.getHeight();
d.setSize(300, hight);
msgLabel.setPreferredSize( d);
probier das mal aus. mir fehlt die zeit und die anderen klassen um das zu testen.
 
Falls die Pixelanzahl immer gleich bleibt ist der einfachste Weg auch die Minimum/Maximum/Preferred Größe zu setzten:

Java:
   msgLabel.setSize(300,50);
   msgLabel.setMinimumSize(new Dimension(300,50));
   msgLabel.setMaximumSize(new Dimension(300,50));
   msgLabel.setPreferredSize(new Dimension(300,50));
 
Leider hat weder der Umweg über die Dimension noch das Setzen der Minimum/Maximum/PreferredSize geholfen. Ich verstehs absolut nicht, warum mein Programm die Größenangabe schlichtweg ignoriert. Die anderen Attribute, die ich setze, wie Border oder Background, werden ja auch mitgenommen, wie es sich gehört...
 
Kannst du mal noch mehr code Zeigen!? Also man sieht ja z.B. auch garnicht wo du z.B. die Farbe setzt usw...

und ich habe es gerade mal kurz mit meinem Vorschlag getestet:

Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MessagePanel extends JPanel {

	ArrayList<JLabel> messageList = new ArrayList<JLabel>();

	public MessagePanel(String pTitle) {
		this.setSize(300, 500);
		this.setBorder(BorderFactory.createLineBorder(Color.black));
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		JLabel lblTitle = new JLabel(pTitle);
		lblTitle.setSize(300, 25);
		// lblTitle.setAlignmentX(Component.CENTER_ALIGNMENT);
		this.add(lblTitle);
		this.add(new JLabel(" "));

	}

	public void addMessage(String pMessage) {
		JLabel msgLabel = new JLabel(pMessage);
		// msgLabel.setBorder(BorderFactory.createLineBorder(Color.black));
		msgLabel.setAlignmentX(Component.LEFT_ALIGNMENT);
		msgLabel.setBackground(Color.RED);
		msgLabel.setOpaque(true);
		 msgLabel.setSize(300,25);
		 msgLabel.setMinimumSize(new Dimension(300,25));
		 msgLabel.setMaximumSize(new Dimension(300,25));
		 msgLabel.setPreferredSize(new Dimension(300,25));
		messageList.add(msgLabel);
		this.add(msgLabel);
	}
	
	public static void main(String[] args) {
		JFrame testFrame = new JFrame();
		MessagePanel messagePanel = new MessagePanel("lalelu");
		
		messagePanel.addMessage("hund");
		messagePanel.addMessage("katze");
		messagePanel.addMessage("maus");
		messagePanel.addMessage("kind");
		
		testFrame.add(messagePanel);
		testFrame.setVisible(true);
		testFrame.pack();
	}
	
}


Also bei mir klappt das so....
 
Ich hab grad das typische Programmiererproblem: Ich hab deinen Vorschlag grad nochmal reingesetzt, nachdem ich was gui-irrelevantes am Programm verändert hab, und plötzlich ist meine Größe da 😛feif:

Keine Ahnung, was vorher das Problem war... Das ärgert mich zum ersten und is mir zum anderen a bissel peinlich xDD
 

Zurück
Oben