# JToolTip -> createToolTip() überlagern



## satina (18. Mai 2005)

Hallo zusammen, 

habe jetzt mehrere Stunden in Foren und Tutorien nach einer Lösung für mein Problem gesucht, aber nichts gefunden. 

Ich möchte statt normaler ToolTips (mit einem String) eine eigene Komponente anzeigen lassen, z.B. ein JWindow oder so... habe dazu versucht, die createToolTip()-Methode zu überlagern. Aber irgendwie klappt das nicht... es wird gar kein ToolTip angezeigt. Konnte auch nach mehrmaligem Debuggen das Problem nicht finden

Suche zu diesem Thema einen Beispielcode oder ein Tutorial, kann mir bitte jemand helfen? 

Vielen Dank im voraus und Gruss


----------



## satina (18. Mai 2005)

Bin immer noch nicht weiter mit meinem Problem... vielleicht kann mir jemand helfen, wenn ich hier mal direkt meinen Code publiziere... 

- Methode makeButton() erstellt mehrere Buttons, die den ToolTip erhalten sollen. 
- dann die überlagerte Methode createToolTip() von JToolTip
- die innere Klasse MyHelp soll ein JWindow erstellen, dass anstelle des normalen ToolTips angezeigt werden soll

Ich habe das unbestimmte Gefühl, dass in meinem Programm gar nicht bekannt ist, dass überhaupt ein ToolTip angezeigt werden soll. Habe ausser setToolTipText() (die ich hier ja nicht brauchen kann) aber nix gefunden, dass meinen Buttons einen ToolTip zuweisen könnte..... 

Kann mir bitte jemand helfen? 

Danke und Gruss


```
public JButton makeButton(String name, Color col) {
		String buttonName = name; 
		JButton tmpButton = new JButton(buttonName); 
		tmpButton.setBackground(col); 
		//tmpButton.setToolTipText(buttonName); 
		return tmpButton; 
	}
	
	public JToolTip createToolTip() { 
		return( new MyHelp() ); 
	} 

	//inner classe
	class MyHelp extends JToolTip {
		private String helpText; 
		public JTextArea ta; 
		
		public MyHelp() {
			JWindow win = new JWindow(); 
			helpText = "mein HelpText bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla "; 

			JPanel contentPane = new JPanel(); 
			contentPane.setLayout(new BorderLayout());
			Border bd1 = BorderFactory.createLineBorder(Color.lightGray); 
			((JPanel)contentPane).setBorder(bd1);
	
			ta = new JTextArea("hahaha");  
			ta.setBackground(new Color(255,255,220));
			ta.setFont(new Font("Arial", Font.PLAIN, 11)); 
			ta.setLineWrap(true); 
			ta.setWrapStyleWord(true); 
			
			contentPane.add("Center", ta);
			win.setContentPane(contentPane);
			win.setSize(100, 100); 
			win.setAlwaysOnTop(true); 
			win.setVisible(true); 
		}
	}
}
```


----------



## Roar (18. Mai 2005)

hm ich hab mir letztens auch nen eignen tooltip geschrieben, also einfach nen JWindow machen und das dann einblenden/ausblenden bei bedarf (guckst du MouseListener/MouseMotionListener):


```
toolTipLabel = new JLabel();
		toolTipLabel.setOpaque(true);
		toolTipLabel.setBackground(UIManager.getColor("ToolTip.background"));
		toolTipLabel.setFont(UIManager.getFont("ToolTip.font"));
		toolTipWindow = new JWindow(SwingUtilities.windowForComponent(owner));
		toolTipWindow.add(toolTipLabel);
		toolTipWindow.getRootPane().setBorder(UIManager.getBorder("ToolTip.border"));
```


----------



## satina (18. Mai 2005)

Danke! 

Löst aber mein Problem immer noch nicht. 

Zuerst habe ich meinen eigenen ToolTip auch mit den MouseListeners gemacht, hatte aber viele Probleme mit dem Thread, den ich dafür eingebaut habe. 

Habe mir gedacht, dass ich mir die Probleme spare wenn ich den ToolTip von Java einfach überschreibe... der weiss wenigstens zuverlässig, über welcher Komonente er sich befindet  :? 

Kannst du mir verraten wie du das mit dem MouseListener gemacht hast? Wie weiss der genau, dass der User seine Maus nicht mehr bewegt? Habe mit den MouseEntered /-Exited-Methoden gearbeitet. Hat aber nicht sauber funktioniert... 

Gruss


----------



## Roar (18. Mai 2005)

hm mein tooltip ist auch nicht besonders schön, d.h. er taucht sofort auf wenn man über der komponente ist. ich hab die mouseMoved überschrieben, da ich wollte dass der tooltip nru erscheint, wenn man über einem bestimmten bereich auf der komponente ist.

sieht dann ungefähr so aus:


```
public void mouseMoved(MouseEvent e) {
				boolean sollDarstellen = bumdibum;
				if(sollDarstellen) {
					if(!toolTipWindow.isVisible()) {
			toolTipLabel.setText("dumdidum");
						toolTipWindow.pack();
						Point p = e.getPoint();
						SwingUtilities.convertPointToScreen(p, Klasse.this);
						toolTipWindow.setLocation(p.x + 10, p.y + 10);
						toolTipWindow.setVisible(true);
					}
				} else {
					toolTipWindow.setVisible(false);
				}
			}
```

meine mouseexit:


```
public void mouseExited(MouseEvent e) {
				Point p = MouseInfo.getPointerInfo().getLocation();
				SwingUtilities.convertPointFromScreen(p, toolTipWindow);
				if(!toolTipWindow.contains(p))
					toolTipWindow.setVisible(false);
			}
```

wenn du nix besseres zu tun hast kansnt du noch timer einbauen, dass der tooltip nocht sofort erscheint wenn man mit der maus über der area ist, und nach einer bestimmten zeit automatisch ausgeblendet wird. dazu war ich aber zu faul )


----------



## satina (18. Mai 2005)

Dein Code verwirrt mich gerade völlig. Ist aber noch nicht genau das was ich hinkriegen möchte. Ich will den ToolTip nicht für jede Komponente anzeigen lassen, sondern nur wenn ich mit der Maus eine Weile auf der Komponente bin oder sogar nur, wenn ich sie dort einer Weile ruhen lasse... 
Wie ist das bei deinem Programm: wenn du ganz schnell mit der Maus im GUI herumfährst, wird da jeder ToolTip angezeigt? 

Danke schon mal für deine Hilfe!


----------



## satina (18. Mai 2005)

noch ne Frage: was ist dein "owner" aus dem ersten Codeauszug für ein Objekt?


----------



## Roar (18. Mai 2005)

zum ersten: wie gesagt, mit 2 timern wär das nich schwirig zu bauen. wenn ich morgen nix besseres zu tun hab mach ich das mal.

owner ist eine JComponent


----------



## satina (19. Mai 2005)

Habe heute tatsächlich noch ein gutes Beispiel gefunden, wie man diese createToolTip()-Methode richtig implementiert. 

http://www.java2s.com/ExampleCode/Swing-JFC/MultiLineToolTipExample.htm

Habe das dann auch so eingebaut, aber irgendwie läufts noch nicht richtig. Wird noch nicht der richtige Text angezeigt, den ich dynamisch herauslese, da der ToolTip-Text beim Erstellen des Buttons gesetzt wird, nicht erst wenn der ToolTip angezeigt wird. 
Muss es daher wahrscheinlich auch so lösen wie du. Bist du schon weiter gekommen mit den Timern?


----------

