Swing JLabel - Grösse passt sich immer Text an

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey,

ich bekomme es nicht hin meinem JLabel eine fixe Grösse zu geben. Auch wenn ich setSize() verwende, statt setPreferredSize(), wird das Label immer nur genau so breit wie der Text darin. Das setSize() setze ich nachdem ich den Text setze. Wie krieg ich es hin dass ich zB 5 Labels habe die alle 100px breit sind, egal wieviel Text darin steht?

Danke
 
Wenn man Preferred (und ggf. Min/Max) Size explizit setzt, sollte er sich nicht nach dem Text-Inhalt richten - sofern der Übergeordnete LayoutManager diese Vorgaben berücksichtigen kann... Hast du ein Beispiel?
 
Auch wenn ich setSize() verwende
bringt nichts, der layout manager macht's eh so wie es dem gefällt...
statt setPreferredSize()
interessiert die Layout manager meistens auch nicht^^ 😉

Wie krieg ich es hin dass ich zB 5 Labels habe die alle 100px breit sind, egal wieviel Text darin steht?
eben einen layout so konfigurieren, dass er die labels so anordnet. Kannst zB. separates JPanel nehmen und BoxLayout oder GridLayout drauf loslassen, wenn du mit anderen LayoutManagern auf kriegsfuß bist 😉
 
Beim GridBagLayout kannst du sagen, dass die Spalte 1 max 100 Pixel groß sein soll. Packst du da nen JLabel rein, was theoretisch mehr Platz braucht, so wird die Spalte automatisch vergrößert um den Platz der benötigt wird, also zum Beispiel auf 150 Pixel. Sagst du aber dem JLabel nun mit preferedSize max 100 Pixel, so wird automatisch "ABC..." geschrieben (wenn der Platz net reicht), so dass wirklich nur max 100 Pixel benutzt werden.
 
Ich weiss nicht ob ihr mich richtig versteht. Ich ornde die Labels im Moment auf einem Panel mit BoxLayout / Y_AXIS an. Und gebe jedem Label

setSize(x)

Der Text für alle Labels ist definitiv kleiner. Das Problem ist, dass das Label einfach nur so gross ist, wie der Text. Was bitte soll ich da bei LayoutManagern einstellen?

statt setPreferredSize()
interessiert die Layout manager meistens auch nicht^^
Ach? Ich dachte genau das machen LayoutManager.

Also, ich hab n Rechteck mit Labels untereinander, und wenn ich über eine Zeile darin gehe soll der MouseLsitener vom Label anspringen. Und das tut er eben nicht, weil das Label immer genau auf den Text gekürzt wird, owbhl ich dem Label eine Breite gegeben habe, die genauso breit ist wie das Panel, also die Zeile. Das Label reagiert nur wenn ich auf dem Text bin.
Ich krieg's einfach nicht grösser als der Text ist...
 
Hier ein Bsp. Ich möchte dass die Labels aufblinken wenn ich nur über die Zeile gehe. Aber sie tun es nur, wenn ich wirklich über den Text gehe. Eig. sollten die Labels ja so breit sein wie die ganze Zeile, aber sie reduzieren sich immer nur auf ihre Textlänge.

Java:
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

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

public class JLabelSetSize extends JFrame {

	static final int LABEL_WIDTH = 200;
	static final int LABEL_HEIGHT = 20;
	static final Random random = new Random();

	public static void main(String[] args) {
		new JLabelSetSize().setVisible(true);
	}

	JLabelSetSize() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		JPanel container = new JPanel();
		container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

		/* add 10 labels with a given size and listener */
		for (int i = 0; i < 10; i++) {
			JLabel l = new JLabel(randomText());
			l.setSize(LABEL_WIDTH, LABEL_HEIGHT);
			l.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseEntered(MouseEvent e) {
					super.mouseEntered(e);
					((JLabel) e.getSource()).setForeground(Color.orange);
				}

				@Override
				public void mouseExited(MouseEvent e) {
					super.mouseExited(e);
					((JLabel) e.getSource()).setForeground(Color.black);
				}
			});
			container.add(l);
		}

		container.setSize(LABEL_WIDTH,LABEL_HEIGHT*10);
		this.add(container);
		pack();
	}

	private String randomText() {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < random.nextInt(25); i++) {
			sb.append((char)(random.nextInt(32) + 97));
		}
		return sb.toString();
	}

}
 
Hab deinen Code mal geändert:
Java:
import java.awt.GridLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

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

public class JLabelSetSize extends JFrame {

    //static final int LABEL_WIDTH = 200;
    //static final int LABEL_HEIGHT = 20;
    static final Random random = new Random();

    public static void main(String[] args) {
        new JLabelSetSize().setVisible(true);
    }

    JLabelSetSize() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel container = new JPanel(new GridLayout(0, 1));
        //container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

        /* add 10 labels with a given size and listener */
        for (int i = 0; i < 10; i++) {
            JLabel l = new JLabel(randomText());
            //l.setSize(LABEL_WIDTH, LABEL_HEIGHT);
            l.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseEntered(MouseEvent e) {
                    super.mouseEntered(e);
                    ((JLabel) e.getSource()).setForeground(Color.orange);
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    super.mouseExited(e);
                    ((JLabel) e.getSource()).setForeground(Color.black);
                }
            });
            container.add(l);
        }

        //container.setSize(LABEL_WIDTH,LABEL_HEIGHT*10);
        this.add(container);
        pack();
    }

    private String randomText() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < random.nextInt(25); i++) {
            sb.append((char)(random.nextInt(32) + 97));
        }
        return sb.toString();
    }

}
 
Ah Danke! Ich frag mich aber woher jetzt die Breite kommt? Scheint ja nicht von den Labels abzuhängen. In der API zum Konstruktor steht nur alle Elemente bekommen die gleiche Grösse. Welcher Wert ist das denn, bzw. wie kann ich das jetzt ändern?
 
Das GridLayout richtet sich nach der PreferredSize der hinzugefügten Komponenten.
Das heißt, du kannst die Größe mit
Java:
l.setPreferredSize(new Dimension(width, height));
beeinflussen.

Alle Komponenten erhalten aber die gleiche Größe. Und zwar genau die, die die größte Komponente einnimmt.
 
Das GridLayout richtet sich nach der PreferredSize der hinzugefügten Komponenten.
Genau das wundert mich ja grad: Egal wie oft ich das Programm starte (Die Labels bekommen ja zufällig lange Strings), das Fenster ist immer gleich breit. Ich hatte grad nur Labels mit 2 Buchstaben, trotzdem war es so gross wie wenn es Labels mit 15 Buchstaben gibt.

Wenn es stimmt was du sagst, dann heisst das ja dass JLabels default-mässig eine preferredSize haben, die sich aber auch nicht nach der Grösse des Strings vom Label orientiert. Aber das stimmt ja wohl nicht ?!
 
setPreferredNotSize()?

Nein also.. wie ich ja selber schon glaubte, sind die preferredSizes der Labels natürlich dem Inhalt entsprechend gesetzt. Aber da du sagtest, GridLayout orientiert sich an der preferredSize der Komponenten, also hier die Labels, kann es ja nicht sein dass mein Fenster IMMER 124 px Breit ist. Total egal wie gross die Labels sind. Das meinte ich, ich wunder mich woher diese 124 kommt. Von den Labels hängt es ja eindeutig nicht ab.
 
Setze mal eine neue Größe, dann ändert sich auch die Fenstergröße, ggf. auch der Abstand der Texte zueinander aufgrund der veränderten Höhe.

Mit Gegenstück meinte ich getPreferredSize(), mit der du die PreferredSize der Komponenten erfragen kannst.
 
Mit Gegenstück meinte ich getPreferredSize()
Schon klar 😉 Genau das hab ich ja grad getestet.

Ich glaube wir reden etwas aneinander vorbei. Meine Frage war: Woher kommen die 124px? Von den JLabels zumindest nicht. Obwohl du ja genau das gesagt hast. Als default-Wert wäre das aber auch etwas seltsam. Ich meine, 124? Wieso?
 
Okay die varriert auch. Nur die vom JFrame nicht. Allerdings mach ich ein pack() aufs Frame, nachdem ich das Panel adde. Müsste sich das also nicht gemäss der preferredSize des Panels anpassen?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben