Tooltip sperrt MouseListener?

  • Themenstarter Themenstarter grayson
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

grayson

Gast
Hi!

Ich hab mal wieder ein kleines Problemchen.....

Ich zeichne in einem Scrollpane eine Sternenkarte, und wenn man mit der Maus auf einen dieser Planetn (kleine JPanels) klickt, bekommt man einen Dialog mit Infos etc. angezeigt.

Nun Hatte ich die goldige Idee, die Namen der Planeten per Tooltip anzuzeigen --> das funktioniert auch, leider überlagert der Tooltip irgendwie meinen MouseListener, der für das Klicken zuständig ist ?!?

Kann mir da jemand auf die Sprünge helfen, wie ich das umgehen kann?

Danke

Gray
 
Moin,

liegen die Tooltips direkt unter dem Mauszeiger ? Zeige die Tooltips etwas versetzt an (unter, über oder neben dem JPanel). Poste mal etwas Code zum nachvollziehen.

Gruß
Mag1c
 
also ich hab ne klasse Planet, die von JPanel erbt.

Die planeten werden auf einem JPanel (InnerSphereMap) gezeichnet

die InnerSphereMap liegt auf einem jScrollPane und nutzt diese Methode zum Zeichnen der Planeten:

Code:
public void paintPlanetsFromList() {



    this.setSize(1000, 1000);

    this.removeAll();

    setMiddle();

    middle = getMiddle();

    for (int i = 0; i < planets.size(); i++) {

      Planet p = new Planet((PlanetContainer) planets.get(i));



      double pX = p.getXCoord();

      double pY = p.getYCoord();



      if (pX < 0) {

        pX = (middle.getX() + pX);

      } else {

        pX = (middle.getX() + pX);

      }

      if (pY < 0) {

        pY = (middle.getY() - pY);

      } else {

        pY = (middle.getY() - pY);

      }

      p.setOwnercolor();   

      p.setToolTipText(p.getName());

      this.add(p, new XYConstraints((int) pX, (int) pY, 10, 10));

    }

  }

Und in der Init Methode des LobbyClient ( also da wo die karte dargestellt wird, registriere ich meinen mouselistener:



Code:
  mIsMap.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {

                Planet x = null;

                try {



                    x = (Planet) mIsMap.getComponentAt(e.getPoint());



                } catch (Exception ex) {

                    log.error("no planet here");

                    return;

                }

                boolean inRange = false;

                Point p = e.getPoint();

                int xCoord = (int) p.getX();

                int yCoord = (int) p.getY();

                paintRange(xCoord, yCoord, 46 + mZoomLevel * 12, 46 + mZoomLevel * 12);



                inRange = mIsMap.checkRange(x, mUser);

                if (inRange == true) {

                    showPlanet(x);



                } else {

                    JOptionPane.showMessageDialog(null, "Planet more than 30 Light Years away! \n No Info available.", "Out of Range", JOptionPane.INFORMATION_MESSAGE, new ImageIcon(ImageLoader.loadGuiImage("outofrange")));

                }

                mIsMap.repaint();

            }

      

        });


Dummer weise, wenn ich in der paintPlanetsFromList methode die zeile
Code:
p.setToolTipText(p.getName());
drin hab, funktioniert der mouselistener nicht mehr d.h. die tooltips werden angezeigt, aber das mouseClicked event bleibt stecken.

Hab ich die zeile nicht drin, funktioniert es --> nur eben ohne tooltips was nicht so informativ ist...
 
Hi,

hmm, das scheint mir eine knifflige Geschichte zu sein. Hab gerade mal in den Sun-Klassen gestöbert. Wenn ich das richtig verstanden habe, werden MOUSE_CLICKED-Events nur an die Komponente geschickt, die auch das MOUSE_PRESSED erhalten hat. Wenn du nun bei den JPanels einen Tooltip setzt, registriert sich dort der ToolTipManager als MouseListener und wertet das MOUSE_PRESSED aus. Damit bekommt der natürlich auch das MOUSE_CLICKED. Mir fallen jetzt erstmal zwei Möglichkeiten dazu ein:

1. mach das ganze über einen MouseMotionListener an der InnerSphereMap. Sollte nicht all zu schwierig sein, die Tooltips selbst anzuzeigen (PopupFactory).

2. registriere an den ganzen Planeten-JPanels MouseListener (klingt ziemlich blöd 🙁 würd ich nicht machen)

Gruß
Mag1c
 
jap, das hab ich in der zwischenzeit auch rausgefunden und das problem auch gelöst 😉

aber der junge in dem artikel hat recht.... das sollte besser dokumentiert sein.... aber jetzt weis ich's ja,

danke leute, habt mir sehr geholfen !


Gray
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben