ToolTip Größenänderung, passt sich erst beim zweiten Mal an

Underfaker

Bekanntes Mitglied
Hallo zusammen,

ich bemühe mich gerade ein eigenes ToolTip einzubauen um es optisch etwas ansehnlicher zu gestalten.
Leider passiert es, dass das fenster des Tooltip beim ersten überfahren des Labels nicht die richtige Größe hat, sondern erst beim zweiten Mal.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToolTip;

public class CustomTooltipSample extends JFrame {
    private CustomLabel m_label;
    
    public CustomTooltipSample() {
        setTitle("Custom tooltip sample");
        setSize(300, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        m_label = new CustomLabel("My Label");
        m_label.setToolTipText("<html>Yo, I am a tooltip with components!<br>This is a row<br>" +
        		"hey another row<br> wow a new row again</html>"); // activate tooltips for this component
        add(m_label);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override public void run() {
                JFrame frame = new CustomTooltipSample();
                frame.setVisible(true);
            }
        });
    }
    
    private static class CustomLabel extends JLabel {
        private CustomTooltip m_tooltip;
        
        public CustomLabel(String text) {
            super(text);
        }
        
        @Override public JToolTip createToolTip() {
            if (m_tooltip == null) {
                m_tooltip = new CustomTooltip();
                m_tooltip.setComponent(this);
            }
            return m_tooltip;
        }
    }
    
    private static class CustomTooltip extends JToolTip {
        private JLabel label;
        private JPanel panel;
        
        public CustomTooltip() {
            super();
            label = new JLabel();
            panel = new JPanel(new BorderLayout());
            panel.setBackground(Color.WHITE);
            panel.add(BorderLayout.CENTER, label);
            setLayout(new BorderLayout());
            add(panel);
        }

        @Override public Dimension getPreferredSize() {
        	System.out.println(panel.getPreferredSize());
            return panel.getPreferredSize();
        }

        @Override public void setTipText(String tipText) {
            if (tipText != null && !tipText.isEmpty()) {
                label.setText(tipText);
            } else {
                super.setTipText(tipText);
            }
        }
    }
}
Weiß vielleicht jemand woran das liegen könnte?

Besten Dank im Voraus

Underfaker
 

turtle

Top Contributor
Klar...

Du setzt keine preferred size für das Label.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

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

public class CustomTooltipSample extends JFrame {
	private CustomLabel m_label;

	public CustomTooltipSample() {
		setTitle("Custom tooltip sample");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		m_label = new CustomLabel("My Label");
		m_label.setToolTipText("<html>Yo, I am a tooltip with components!<br>This is a row<br>"
				+ "hey another row<br> wow a new row again</html>"); // activate
																		// tooltips
																		// for
																		// this
																		// component
		add(m_label);
	}

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				JFrame frame = new CustomTooltipSample();
				frame.setVisible(true);
			}
		});
	}

	private static class CustomLabel extends JLabel {
		private CustomTooltip m_tooltip;

		public CustomLabel(String text) {
			super(text);
		}

		@Override
		public JToolTip createToolTip() {
			if (m_tooltip == null) {
				m_tooltip = new CustomTooltip();
				m_tooltip.setComponent(this);
			}
			return m_tooltip;
		}
	}

	private static class CustomTooltip extends JToolTip {
		private JLabel label;
		private JPanel panel;

		public CustomTooltip() {
			super();
			label = new JLabel();
			label.setPreferredSize(new Dimension(300, 300));
			panel = new JPanel(new BorderLayout());
			panel.setBackground(Color.WHITE);
			panel.add(BorderLayout.CENTER, label);
			setLayout(new BorderLayout());
			add(panel);
		}

		@Override
		public Dimension getPreferredSize() {
			System.out.println(panel.getPreferredSize());
			return panel.getPreferredSize();
		}

		@Override
		public void setTipText(String tipText) {
			if (tipText != null && !tipText.isEmpty()) {
				label.setText(tipText);
			} else {
				super.setTipText(tipText);
			}
		}
	}
}
 

Underfaker

Bekanntes Mitglied
Dann probier mal die folgende Textanpassung:
Java:
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
     
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JToolTip;
     
    public class CustomTooltipSample3 extends JFrame {
        private CustomLabel m_label;
     
        public CustomTooltipSample3() {
            setTitle("Custom tooltip sample");
            setSize(300, 200);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            m_label = new CustomLabel("My Label");
            m_label.setToolTipText("<html>Yo, I am a tooltip with components!<br>This is a row<br>"
                    + "hey another row<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again" +
                    "<br> wow a new row again</html>"); // activate
                                                                            // tooltips
                                                                            // for
                                                                            // this
                                                                            // component
            add(m_label);
        }
     
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    JFrame frame = new CustomTooltipSample3();
                    frame.setVisible(true);
                }
            });
        }
     
        private static class CustomLabel extends JLabel {
            private CustomTooltip m_tooltip;
     
            public CustomLabel(String text) {
                super(text);
            }
     
            @Override
            public JToolTip createToolTip() {
                if (m_tooltip == null) {
                    m_tooltip = new CustomTooltip();
                    m_tooltip.setComponent(this);
                }
                return m_tooltip;
            }
        }
     
        private static class CustomTooltip extends JToolTip {
            private JLabel label;
            private JPanel panel;
     
            public CustomTooltip() {
                super();
                label = new JLabel();
                label.setPreferredSize(new Dimension(300, 300));
                panel = new JPanel(new BorderLayout());
                panel.setBackground(Color.WHITE);
                panel.add(BorderLayout.CENTER, label);
                setLayout(new BorderLayout());
                add(panel);
            }
     
            @Override
            public Dimension getPreferredSize() {
                System.out.println(panel.getPreferredSize());
                return panel.getPreferredSize();
            }
     
            @Override
            public void setTipText(String tipText) {
                if (tipText != null && !tipText.isEmpty()) {
                    label.setText(tipText);
                } else {
                    super.setTipText(tipText);
                }
            }
        }
    }

Dann geht es wieder nicht, da das Label zu klein ist, es war so gedacht, dass es sich automatisch anpasst (was ohne lbel.setPreferedsize auch funktioniert) das klappt aber erst wenn man ein zweites Mal über das Feld fährt, ich weiß aber nicht wieso.

Sonst kann ich unten in der preferredSize Methode einfach eine Größe setzen, das geht zwar aber ich müsste für alles ein individuelles Label bauen mit definierten Größen, das erscheint mir dann doch etwas übertrieben.
 
Zuletzt bearbeitet:

Underfaker

Bekanntes Mitglied
Scheinbar habe ich das Problem gelöst, die PreferredSize ist am Anfang zu schmal (Breite), dadurch rutscht jedesmal ein Wort in eine neue Zeile und deshalb sind mehr Zeilen vorhanden als angezeigt werden können, warum das so ist weiß ich nicht und warum es beim zeiten Mal behoben wird auch nicht.

Meine Lösung ist statt der PreferredSize eine Dimension zurückzugeben die die 5 Einheiten breiter als die PreferreSize ist und schon geht es.
 

turtle

Top Contributor
Ja, klar geht das nicht...

Der Code geht ja auch davon aus, das der Text in 300x300 Pixel dargestellt werden kann, tut er aber nicht.

Wenn es 300 Pixel weit sein soll, ist die Höhe mindestens 384 um den gesamten Text anzuzeigen.

Ich habe das Beispiel geändert, welches die Dimensions-Höhe berechnet, wenn die Breite vorgegeben ist.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToolTip;
import javax.swing.text.View;

public class CustomTooltipSample extends JFrame {
	private CustomLabel m_label;

	public CustomTooltipSample() {
		setTitle("Custom tooltip sample");
		setSize(300, 200);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		m_label = new CustomLabel("My Label");
		m_label.setToolTipText("<html>Yo, I am a tooltip with components!<br>This is a row<br>"
				+ "hey another row<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again"
				+ "<br> wow a new row again</html>");
		String toolTipText = m_label.getToolTipText();
		add(m_label);
		validate();
		Dimension prefSize = getPreferredSize(m_label.getText(), toolTipText,
				true, 300);
		m_label.setTooltipPreferredSize(prefSize);
	}

	public java.awt.Dimension getPreferredSize(String txt, String toolTipText,
			boolean width, int prefSize) {

		m_label.setText(toolTipText);
		View view = (View) m_label
				.getClientProperty(javax.swing.plaf.basic.BasicHTML.propertyKey);
		view.setSize(width ? prefSize : 0, width ? 0 : prefSize);
		float w = view.getPreferredSpan(View.X_AXIS);
		float h = view.getPreferredSpan(View.Y_AXIS);
		Dimension dimension = new java.awt.Dimension((int) Math.ceil(w),
				(int) Math.ceil(h));
		System.out.println(dimension);
		m_label.setText(txt);
		return dimension;
	}

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				JFrame frame = new CustomTooltipSample();
				frame.setVisible(true);
			}
		});
	}

	private static class CustomLabel extends JLabel {
		private CustomTooltip m_tooltip;
		private Dimension prefSize;

		public CustomLabel(String text) {
			super(text);
		}

		public void setTooltipPreferredSize(Dimension prefSize) {
			this.prefSize = prefSize;
		}

		@Override
		public JToolTip createToolTip() {
			if (m_tooltip == null) {
				m_tooltip = new CustomTooltip(prefSize);
				m_tooltip.setComponent(this);
			}
			return m_tooltip;
		}
	}

	private static class CustomTooltip extends JToolTip {
		private JLabel label;
		private JPanel panel;

		public CustomTooltip(Dimension prefSize) {
			super();
			label = new JLabel();
			label.setPreferredSize(prefSize);
			panel = new JPanel(new BorderLayout());
			panel.setBackground(Color.WHITE);
			panel.add(BorderLayout.CENTER, label);
			setLayout(new BorderLayout());
			add(panel);
		}

		@Override
		public Dimension getPreferredSize() {
			return panel.getPreferredSize();
		}

		@Override
		public void setTipText(String tipText) {
			if (tipText != null && !tipText.isEmpty()) {
				label.setText(tipText);
			} else {
				super.setTipText(tipText);
			}
		}
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Tooltip-Delay funktioniert nicht immer. AWT, Swing, JavaFX & SWT 1
M JavaFX JAVAFX TreeItem mit Tooltip versehen AWT, Swing, JavaFX & SWT 4
M JavaFX Tooltip bei setOnMouseMoved Verständnisproblem AWT, Swing, JavaFX & SWT 6
V JFreeChart: Tooltip auf Knopfdruck anzeigen AWT, Swing, JavaFX & SWT 2
J JavaFX Tooltip Verzögerung beim ersten Anzeigen AWT, Swing, JavaFX & SWT 4
M Datenbanksätze in ToolTip laden AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Tooltip verbuggt? AWT, Swing, JavaFX & SWT 1
J JTabbedPane: table in new tab: tooltip benutzt die column-widths von table in erstem geöffneten tab AWT, Swing, JavaFX & SWT 17
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
P Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt) AWT, Swing, JavaFX & SWT 3
U drawLine mit Tooltip AWT, Swing, JavaFX & SWT 1
D Swing JCombobox - Tooltip Location ändern AWT, Swing, JavaFX & SWT 4
B JavaFX Tooltip auf ImageView AWT, Swing, JavaFX & SWT 6
U Tooltip Dauer setzen AWT, Swing, JavaFX & SWT 0
F ToolTip mit Link zum anklicken AWT, Swing, JavaFX & SWT 2
S SWT: Drop-Down Menü-Einträge mit Tooltip hervorheben AWT, Swing, JavaFX & SWT 3
C ToolTip aktualisieren AWT, Swing, JavaFX & SWT 2
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
C Tooltip dynamisch setzen AWT, Swing, JavaFX & SWT 7
GianaSisters Swing jComboBox Tooltip funktioniert nicht AWT, Swing, JavaFX & SWT 17
6 ToolTip erzwingen AWT, Swing, JavaFX & SWT 6
R SWT Tooltip AWT, Swing, JavaFX & SWT 5
J jList, recht Maustast => Tooltip zu Element AWT, Swing, JavaFX & SWT 8
T Tooltip bei falscher Eingabe anzeigen AWT, Swing, JavaFX & SWT 2
hdi Problem mit ToolTip: Aussehen/Verzögerung AWT, Swing, JavaFX & SWT 7
P Tooltip "erzwingen" ? AWT, Swing, JavaFX & SWT 7
S Swing JTree in ScrollPane einen ToolTip geben AWT, Swing, JavaFX & SWT 2
Antoras Swing Tooltip permanet anzeigen AWT, Swing, JavaFX & SWT 5
W Verzögerung à la Tooltip bei mouseEntered AWT, Swing, JavaFX & SWT 19
G Tooltip anzeigen AWT, Swing, JavaFX & SWT 4
GilbertGrape scrollable Tooltip AWT, Swing, JavaFX & SWT 9
G Tooltip Text für ein Shape Objekt AWT, Swing, JavaFX & SWT 2
GilbertGrape JTable+Tooltip+Zeilenumbrüche AWT, Swing, JavaFX & SWT 7
M Tooltip anzeigen? AWT, Swing, JavaFX & SWT 3
J Anzeigedauer eines Tooltip? AWT, Swing, JavaFX & SWT 5
S Tooltip Frage AWT, Swing, JavaFX & SWT 3
G 'Spezieller' Tooltip, wenn JTable-Column zu schmal AWT, Swing, JavaFX & SWT 6
P JRE 6 -> ToolTip & mnemonic Anzeige AWT, Swing, JavaFX & SWT 4
G Tooltip Zeilenumbruch AWT, Swing, JavaFX & SWT 13
B ToolTip verändern / selbst gestalten AWT, Swing, JavaFX & SWT 3
F ToolTip auf Canvas AWT, Swing, JavaFX & SWT 2
S Tooltip auf Toolbar-Icon AWT, Swing, JavaFX & SWT 6
C Tooltip nur anzeigen, wenn JInternalFrame minimiert AWT, Swing, JavaFX & SWT 3
D Eigenes Tooltip AWT, Swing, JavaFX & SWT 5
M JTree: Tooltip wenn Text nicht vollständig angezeigt wird AWT, Swing, JavaFX & SWT 3
M Seltsames Verhalten Tooltip und JDialog AWT, Swing, JavaFX & SWT 8
I JTable, Tooltip, HTML AWT, Swing, JavaFX & SWT 2
S ToolTip an Mausposition anzeigen AWT, Swing, JavaFX & SWT 5
O Hintergrundfarbe beim ToolTip AWT, Swing, JavaFX & SWT 5
L JLabel als Tooltip AWT, Swing, JavaFX & SWT 3
G Tooltip aufpoppen lassen AWT, Swing, JavaFX & SWT 3
M Border in ToolTip AWT, Swing, JavaFX & SWT 5
F ToolTip über Line2D bzw. Rectangle2D AWT, Swing, JavaFX & SWT 5
R JTable: Jede Zelle mit eigenem ToolTip belegen AWT, Swing, JavaFX & SWT 5
G Tooltip sperrt MouseListener? AWT, Swing, JavaFX & SWT 6
V Tooltip Text auf Spaltenkopf (JTable) AWT, Swing, JavaFX & SWT 4
S Tooltip auf Kopf eine JTable? AWT, Swing, JavaFX & SWT 2
G ToolTip AWT, Swing, JavaFX & SWT 4
W Bei hinzufügen der Action verliert Button Text,Tooltip, etc AWT, Swing, JavaFX & SWT 5
S Tooltip mit Grafik AWT, Swing, JavaFX & SWT 2
N lightweight bei ToolTip AWT, Swing, JavaFX & SWT 2
kaory Variabler ToolTip-Text in JTable AWT, Swing, JavaFX & SWT 5
T ToolTip AWT, Swing, JavaFX & SWT 3
R ToolTip länger aufrecht erhalten AWT, Swing, JavaFX & SWT 3
S ToolTip erweitern bei Swing (Mehrzeilig) AWT, Swing, JavaFX & SWT 2
M Tooltip / neues Fenster AWT, Swing, JavaFX & SWT 6
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
B Vertikale Größenänderung zwischen zwei Widgets AWT, Swing, JavaFX & SWT 2
J ungewollt-automatische Größenänderung von JLabel AWT, Swing, JavaFX & SWT 5
A JFrame Größenänderung AWT, Swing, JavaFX & SWT 3
A JFrame Größenänderung mit Maus und GridLayout AWT, Swing, JavaFX & SWT 10
A Swing JFileChooser - Größenänderung nach Aufruf von showOpenDialog() AWT, Swing, JavaFX & SWT 15
X Swing JTextPane bei Größenänderung Formatierung behalten AWT, Swing, JavaFX & SWT 11
B JFrame: Benachrichtung über Größenänderung AWT, Swing, JavaFX & SWT 4
Psypsy Swing JFrame Größenänderung Peformancefrage AWT, Swing, JavaFX & SWT 5
G Swing JScrollPane/Layoutmanger Problem bei dynamischer Größenänderung AWT, Swing, JavaFX & SWT 7
S Swing Inhalt eines Fenster bei Größenänderung anpassen (GroupLayout) AWT, Swing, JavaFX & SWT 2
T Swing Dialoginhalt automatisch anpassen während Größenänderung AWT, Swing, JavaFX & SWT 2
P TextArea Größenänderung AWT, Swing, JavaFX & SWT 4
S Panel austauschen, ohne Größenänderung des Frames AWT, Swing, JavaFX & SWT 5
C Auf Größenänderung eines Fensters (JFrame) reagieren AWT, Swing, JavaFX & SWT 2
C Event nach Größenänderung des Fensters AWT, Swing, JavaFX & SWT 3
E Größenänderung von nur EINER Seite einer SplitPane AWT, Swing, JavaFX & SWT 2
A Layoutprobleme bei Größenänderung AWT, Swing, JavaFX & SWT 2
G awt panel for größenänderung schützen AWT, Swing, JavaFX & SWT 3
T SWT - Inhalt einer Shell erst nach Größenänderung vorhanden AWT, Swing, JavaFX & SWT 5
F Welche Layout-Methode wird bei Größenänderung aufgerufen? AWT, Swing, JavaFX & SWT 4
F Größenänderung mittels Maus - selbst implementieren? AWT, Swing, JavaFX & SWT 3
N JPanel zeichnet Inhalt erst nach Größenänderung des JFrames AWT, Swing, JavaFX & SWT 3
S JFrame und Größenänderung AWT, Swing, JavaFX & SWT 3
U JFrame bei Größenänderung immer neu zeichnen AWT, Swing, JavaFX & SWT 4
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
D SWT Window passt Größe nicht an AWT, Swing, JavaFX & SWT 4
S Rahmen um Panel passt sich nicht ans Layout an AWT, Swing, JavaFX & SWT 3
velocity Swing JList Scrollbar passt sich an AWT, Swing, JavaFX & SWT 4
hdi Swing JLabel - Grösse passt sich immer Text an AWT, Swing, JavaFX & SWT 17
N ScrollPane passt sich nicht an AWT, Swing, JavaFX & SWT 4
X Wie passt JIternalFrame sich den anderen Fenstern an? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben