JLabel höhe bei mehrzeiligem Text vergrößern

chrootdev

Grünschnabel
Hallo,

ich habe hier ein JLabel, in welchem ein Text steht zwischen html-Tags, damit der Text automatisch umgebrochen wird.

Der IST-Zustand ist folgender:

Ein JPanel, welches ein GridBagLayout hat, auf diesem sind mehrere JLabels + JTextFields.

Das Problem:

Der Text auf den JLabels wird in mehreren Sprachen dargestellt, jetzt kann es sein, das der Text auf Deutsch sich in einer Zeile ausgeht, aber auf Englisch oder Spanisch nicht. Wenn er sich nicht ausgeht, dann wird umgebrochen. Die Höhe des JLabels wird dabei aber nicht verändert, sondern die untere Hälfte des Textes einfach abgeschnitten.

Kann ich dem Label oder dem Layout irgendwie klar machen, das das Label in so einem Fall vergrößert werden soll?

Danke!
 
Ich denke mal das hat was mit der JTable zu tun das du in dieser eine feste Zellen-Größe definiert hast. Dann nützt dir auch kein HTML was. Erstmal musst du für sorgen das sich die Zellen auch frei in ihrer Größe ändern können bevor du ihnen sagst das sie es tun sollen.

Außerdem finde ich hier eines SEHR merkwürdig :
Mehrere JTable in einem GridBagLayout ?
Entschuldige meine verdrusste Antwort , aber das ist völliger schwachsinn. Entweder baust du eine große JTable die du z.B. über ein BorderLayout zentrierst *oder entsprechend ausrichtest* oder du nimmst das GridBagLayout mit dem mit einegem Mehraufwand das selbe erreichen kannst. Beides in einander zu verschachteln könnte unter anderen ebenfalls das Problem hervorrufen.
 
Ich vermute mal, dass er aus JLabel JTable gelesen hat :D
Naja, wenn du die Höhe ändern willst musst du mit den GridBagConstrainst arbeiten.
In Java-Doku zum GridBagLayout findet sich dazu auch ein Beispiel. Hier ist der Link zu der entsprechenden Seite der Doku. Das Beispel findest gegen Ende des längeren Texts zu Anfang der Seite. Also noch vor den Konstruktoren etc.
 
Mittlerweile bin ich darauf gekommen, das das Problem eher die JScrollPane ist, bzw. die Kombination von JLabel mit HTML-Text und JScrollPane.

Das Beispiel zeigt mein Problem. Ich habe 20 mal die Kombination von JLabel (mit HTML-Text) und JTextField. Jetzt werden die Labels im GridBagLayout in der JScrollPane nicht komplett ausgebreitet.

Code:
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;


public class LayoutTest extends JFrame
{
	
	/**
	 * 
	 */
	private static final long	serialVersionUID	= 6971964679396619736L;

	public LayoutTest()
	{
		setSize(new Dimension(500, 500));
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		
		JPanel panel = new JPanel();
		panel.setLayout(new GridBagLayout());
		
		for(int i=0;i<20;i++)
		{
			GridBagConstraints labelConstraints = new GridBagConstraints();
			labelConstraints.gridx = 0;
			labelConstraints.gridy = i;
			labelConstraints.weightx = 1.0d;
			labelConstraints.weighty = 1.0d;
			labelConstraints.fill = GridBagConstraints.BOTH;
			
			JLabel lbl = new JLabel("<html>Specify the row and column at the upper left of the component. The leftmost column has address gridx=0 and the top row has address gridy=0. Use GridBagConstraints.RELATIVE (the default value) to specify that the component be placed just to the right of (for gridx) or just below (for gridy) the component that was added to the container just before this component was added. We recommend specifying the gridx and gridy values for each component rather than just using GridBagConstraints.RELATIVE; this tends to result in more predictable layouts.</html>");
			lbl.setMinimumSize(new Dimension(250,25));
			lbl.setPreferredSize(new Dimension(250, 25));
			panel.add(lbl, labelConstraints);
			
			GridBagConstraints txtConstraints = new GridBagConstraints();
			txtConstraints.gridx = 1;
			txtConstraints.gridy = i;
			txtConstraints.weightx = 0.4d;
			txtConstraints.weighty = 0.0d;
			txtConstraints.fill = GridBagConstraints.NONE;
			
			JTextField txtField = new JTextField();
			txtField.setMinimumSize(new Dimension(100, 25));
			txtField.setPreferredSize(new Dimension(100, 25));
			txtField.setMaximumSize(new Dimension(100, 25));
			
			panel.add(txtField, txtConstraints);
		}
	
		scrollPane.setViewportView(panel);
		
		setContentPane(scrollPane);
		
		setVisible(true);
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		new LayoutTest();
	}
}

Gibt es eine Möglichkeit, das sich die JLabel in ihrer ganzen höhe entfalten?
 
Ouh ... SORRY
mein Fehler ... wie bin ich da von JLabel auf JTable gekommen ? ... ouh .. ganz großes Damentennis

Ok .. zurück zum Thema ... *das oben könnten wir streichen*

Das Problem mit JScrollPane ist das es versucht alle Components die innerhalb seines Viewports liegen möglichst klein zu kriegen. Dagegen kann man soweit ich weis nur eines machen das man die aktuelle Größe ermittelt .. diese als preferredSize setzt und DANN erst den Viewport setzt. Zumnidest hat das bei meinen Apps immer funktioniert. Wenn das nicht hilft müsste ich mich noch mal intensiv mit GUI beschäftigen *ist schon etwas länger her*
 

Neue Beiträge

Zurück