close Problem bei meinem eigenen ToolTip

darksmilie

Erfahrenes Mitglied
Hi,

ich habe mir ein eigenes ToolTip programmiert, aber leider habe ich ein Problem mit dem schliessen des ToolTips. Wenn ich mit der Mouse langsam über das ToolTip gehe und das TollTip dann mit der Mouse verlasse schließt es correct, aber wenn ich schnell mit der Mouse über das ToolTip gehe und es dann verlasse schliesst es nicht.

Weiß einer von euch wie ich dieses Problem beheben könnte?
 
Kommt drauf an, wie du den ToolTip implementiert hast.
Du blendest wahrscheinlich auf MouseEntered ein und auf MouseExited aus?
Das Problem liegt wahrscheinlich darin, dass er beim schnellen "überfliegen" das Exited Event nicht mitbekommt.

Wie hast du denn deinen ToolTip implementiert?
 
Die TableComponet ist eigens geschreibene swing Table!
Viewer ist ein TreeViewer(SWT)

Code:
viewer.getTree().addMouseTrackListener(new MouseTrackListener() {
      private Shell tip = null;
      private MouseTrackListener tipShellMouseListener = new MouseTrackListener() {

        public void mouseEnter(MouseEvent e) {}
        public void mouseHover(MouseEvent e) {}

        public void mouseExit(MouseEvent e) {
          if(e.x < 0 || e.x > 397 || e.y < 0 || e.y > 147) {
            tip.removeMouseTrackListener(tipShellMouseListener);
            tip.dispose();
            tip = null;
            tableComponet = null;
          }
        }           
      };
      private TableComponent  tableComponet = null;
      private String[] colnames = {"type","attribute"};
      private String[] unmodify = {"type","attribute"};

      public void mouseEnter(MouseEvent e) {}
      public void mouseExit(MouseEvent e) {
        TreeItem item = viewer.getTree().getItem (new Point (e.x, e.y));
        if(item == null) {
          if(tip == null) {
            return;
          }
          tip.removeMouseTrackListener(tipShellMouseListener);
          tip.dispose();
          tip = null;
          tableComponet = null;
        }
      }

      public void mouseHover(final MouseEvent e)  {   
        TreeItem item = viewer.getTree().getItem (new Point (e.x, e.y));
        String[] strarray = {};
        Point pt = viewer.getTree().toDisplay (e.x, e.y);
        if (item != null) {               
          tooltipList = setToolTipList(item.getData());
          if(tooltipList == null) {
            if(tip != null) {
              tip.removeMouseTrackListener(tipShellMouseListener);
              tip.dispose();
              tip = null;
              tableComponet = null;
            }
            return;
          }
          if (tip != null  && !tip.isDisposed ()) {
            tip.dispose ();
          }
          tip = new Shell(parent.getShell(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
          GridLayout gridLayout = new GridLayout(1,true);
          tip.setLayout(gridLayout);
          tip.addMouseTrackListener(tipShellMouseListener);
          tip.setBackground (parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
          tableComponet = new TableComponent(tip,strarray);
          tableComponet.setModel(new AbstractCatalogTableModel(colnames,unmodify));
          tableComponet.setBackground(tip.getBackground());
          tableComponet.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
          tableComponet.setData(tooltipList); 
          tableComponet.setCellRenderer(1, new ToolTipCellRenderer());
          tableComponet.getColumn(0).setWidth(50);
          tip.setBounds (pt.x, pt.y, 400, 150);
          tip.setVisible (true);
          tip.setFocus();
          tip.setActive();         
        }
        else {
          if(tip == null) {
            return;
          }
          tip.dispose();
          tip = null;
          tableComponet = null;
        }
      }       
    });
 
Weiß keiner ein ansatz, wie ich dieses Problem lösen könnte?

Ich bin ja schon auf die Idee gekommen da ein Timer einzubauen, der schaut ob die maus auf der Tooltipshell ist aber das gab nur lauter Thread exceptions ;).
 
Die Idee mit dem Timer ist mir auch gekommen ;) Das Problem ist ja denke ich, dass dein Programm irgend ein Event nicht mit bekommt. Von daher ist das mit dem Timer vllt. doch nicht so abwegig. Welchen hast du denn verwendet?
Den aus java.util oder den javax.swing?

Man könnte den halt auf enter starten, und wenn darauf kein hover oder exit folgt, blendet der Timer den ToolTip wieder aus und stopt sich. Nicht elegant, sollte aber gehen?!

MfG
Daniel
 
Schade das mit dem Swing Timer funktioniert nicht, da er nur eine abgespäckte version von dem java.util Timer ist und immer nur einmalich aufgerufen wird, also ist dieser nur für Verzögerungen gut.

Ich werd es mal versuchen den TooltipManager an meine tooltipshell zu koppeln ;)
 
Juppi, ich habs endlich gelösst bekommen.

Den ToolTipManager konnte ich auch nicht verwenden da ich eine Shell mit Tooltipstyle habe und ich dem ToolTipManager eine JComponet übergeben muss, damit er überhaupt weiß wer diese Delayzeit gekommt.

Ich habe das ganze jetzt so gelösst, indem ich diese Zeile verändert habe(Fett ist hinzugekommen)
Code:
tip.setBounds (pt.x, pt.y + 10, 400, 150);

dadurch öffnet sich das tooltipfenster unter treeitem und wenn ich nun mit der maus sofort schnell nach rechts scrolle gelange ich erst garnicht auf diese Shell und sie schlisst sich, da ich das treeitem mit der maus verlasse.
 
Zurück