Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Guten Tag
mit ...setToolTipText("text") setze ich ein ToolTip auf ein Objekt.
leider wird der ToolTip von der Maus teilweise überdeckt.
Gibt es eine Möglichkeit den ToolTip oberhalb der Mausposition [getY()] anzuzeigen?
Man kann ja mit:
Java:
UIManager.put("ToolTip.background", new Color(254, 255, 208));
z.B. den Hintergrund ändern. Gibt es sowas auch für die Position?
Für Hilfe wie ich das bewerkstelligen könnte, wäre ich sehr dankbar.
Habe es schon mit einem PopupMenu versucht.
Das funktioniert auch! Nur das Problem ist, wenn mann zu schnell mit der Maus über die Objekte fährt, bleibt ein graues Feld zurück, obwohl das Popup setVisible(false) gesetzt wurde.
Das ist meines Wissens nicht direkt beeinflussbar. Die ToolTips kommen über das UI Design von Swing.
Was Du also ggf. machen kannst: Schau einmal die vorhandenen Designs an, ob Dir da eine Tooltip Platzierung gefällt (Ich habe das bisher nicht verglichen - keine Ahnung, ob es da Unterschiede gibt...) Und dann könntest Du ggf. die ToolTipUI von dem Design nutzen?
Hintergrund: Für die Darstellung ist eine ToolTipUI Klasse verantwortlich. Diese könntest Du über den UIManager setzen: UIManager.put("ToolTipUI", "javax.swing.plaf.metal.MetalToolTipUI");
Das wäre ein Beispiel, das für die ToolTips die Metal Implementierung verwenden würde ...
Wenn da nichts passendes dabei sein sollte, dann kannst Du natürlich auch Deine eigene Klasse schreiben und in der dann genau das machen, was Du willst. Dazu kannst Du natürlich auch auf die Sourcen zurück greifen, die es bereits so gibt:
javax.swing.plaf.metal.MetalToolTipUI
javax.swing.plaf.nimbus.NimbusToolTipUI
com.sun.java.swing.plaf.motif.MotifToolTipUI
com.sun.java.swing.plaf.windows.WindowsToolTipUI
com.sun.java.swing.plaf.gtk.GTKToolTipUI
Ansonsten einfach mal ein Beispiel generiert von ChatGPT (ungetestet):
Java:
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalToolTipUI;
import java.awt.*;
public class CustomToolTipUI extends MetalToolTipUI {
private static CustomToolTipUI sharedInstance = new CustomToolTipUI();
public static ComponentUI createUI(JComponent c) {
return sharedInstance;
}
@Override
public void paint(Graphics g, JComponent c) {
Font font = c.getFont();
FontMetrics metrics = c.getFontMetrics(font);
Dimension size = c.getSize();
g.setColor(c.getBackground());
g.fillRect(0, 0, size.width, size.height);
g.setColor(c.getForeground());
g.setFont(font);
g.drawString(((JToolTip) c).getTipText(), 5, metrics.getHeight());
}
@Override
public Dimension getPreferredSize(JComponent c) {
Font font = c.getFont();
FontMetrics metrics = c.getFontMetrics(font);
String text = ((JToolTip) c).getTipText();
int width = SwingUtilities.computeStringWidth(metrics, text) + 10;
int height = metrics.getHeight() + 4;
return new Dimension(width, height);
}
@Override
public void update(Graphics g, JComponent c) {
g.translate(20, 10); // Tooltip Position ändern (20px rechts, 10px unten von der ursprünglichen Position)
super.update(g, c);
}
}
Die technischen Hintergründe konnte ich hoffentlich etwas erläutern, so dass Du da eine eigene Lösung finden kannst. Ob so eine eigene Klasse notwendig ist oder nicht, musst Du dann sehen. Evtl. ist ja eine Implementierung schon ausreichend?
Aber da auch etwas aufpassen: Es macht evtl. Sinn, das dann auf mehreren Systemen zu testen. Zum einen verschiedene Plattformen aber auch mit verschiedenen Display Settings (Also z.B. unter Windows mal das Scaling einstellen auf verschiedene Werte). So mit dem Design herum zu spielen kann unter Umständen Nebenwirkungen haben, die nur unter bestimmten Bedingungen dann unschön sind.
Jetzt werd ich das mal auf verschiedenen BS testen.
Vielen Dank.
Ps:
Intressant: Bei Windows funktioniert der ToolTip auch ohne die Class: CustomToolTipUI!
Bei UNIX-Systemen (Mac, Linux, etc.) sieht es nur mit CustomToolTipUI überall gleich aus.
Ich vermute mal, dass der standard ToolTip mit Informationen des BS arbeitet?
Wenn Du kein Look and Feel setzt, dann nutzt Java in der Regel das spezifische des Systems.
Wenn der Windows ToolTip ok ist, dann kann es eine interessante Idee sein, einfach die ToolTipUI Klasse vom Windows Look and Feel zu nutzen: UIManager.put("ToolTipUI", "com.sun.java.swing.plaf.windows.WindowsToolTipUI");
Vielleicht macht das schon alles, was Du willst? Ist natürlich zu prüfen, ob das evtl. zu sehr vom üblichen Look and Feel abweicht, aber ein Tooltip hat ja eigentlich kaum Plattformspezifisches Aussehen, so dass es ok sein könnte.
Aber mit Deiner Klasse: CustomToolTipUI kann ich schon einiges für mich intressantes anpassen.
Gefällt mir und ich verwende es, weil (auch) im Windows keine Exceptions geworfen werden.
Ich weisz es nur vom GtkLookAndFeel dass dieses Systemabhaengig ist. Also da werden haufenweise Informationen vom System abgefragt (muss es ja, weil sont nix GTK Theme), und ich kann mir gut vorstellen dass das beim Windows Look&Feel gleich ist.
Ich weisz es nur vom GtkLookAndFeel dass dieses Systemabhaengig ist. Also da werden haufenweise Informationen vom System abgefragt (muss es ja, weil sont nix GTK Theme), und ich kann mir gut vorstellen dass das beim Windows Look&Feel gleich ist.
Aber mit Deiner Klasse: CustomToolTipUI kann ich schon einiges für mich intressantes anpassen.
Gefällt mir und ich verwende es, weil (auch) im Windows keine Exceptions geworfen werden.
Es freut mich, dass da doch auch eine sinnvolle Idee dabei war - wobei der Code halt auf das Konto von ChatGPT geht und von mir nur die Idee gekommen ist, sowas in der Art zu implementieren. (ChatGPT ist für so Implementationen extrem gut. Irgendwie hatte ich in den letzten Monaten keine negativen Erfahrungen mit ChatGPT mehr. Am Anfang war da öfters totaler Müll, aber so mit der 4er Version wurde es massiv besser und das war jetzt 4o)