schwebende infotextzeile einblenden/ausblenden

Status
Nicht offen für weitere Antworten.

Dilandau

Aktives Mitglied
Das Programm ist so weit entwickelt, daß über dem errechnete bild ein infotext an einer stelle, die mit der maus berührt wird, erscheinen kann. Dieser Infotext wird momentan direkt ins bild geschrieben. verlässt der mauszeiger die nähere umgebung +/- 10 pixel, wird mit repaint das ganze bild neu gezeichnet, der infotext ist verschwunden.

folgender fortschritt soll gemacht werden:

- der infotext bekommt einen farbigen hintergund,
ein rechteck genau in der höhe der zeile und der breite der länge der zeile
hinter dem text

- nach dem weiterbewegen der maus wird nur die kleine stelle auf der das inforechteck war, neu gezeichnet

- beispiel: text, der auf webseiten über bildern schweben kann, wenn sie mit der maus berührt werden

Also die fragen: wie erfahre ich fonthöhe und textlänge in pixeln? Wie begrenze ich vorrüberghend den neu zu zeichnenden bereich? Oder, gibt's eine möglichkeit, den hintergund an der infostelel vorher zu merken (käme aufs gleiche heraus)?
 
B

Beni

Gast
Frage: wieso verwendest du nicht Tooltips? Es gibt sogar den JToolTip.

Zu deiner Frage: da musst du über die FontMetrics gehen.
Die FontMetrics kannst du bei einem Graphics getFontMetrics anfordern.

Ich denke mit getStringBounds solltest du an die Informationen herankommen (ansonsten: es gibt noch andere interessante Methoden dort :wink: )

mfg Beni
 

Dilandau

Aktives Mitglied
Ob sich diese tooltips ohne componenten wie buttons nutzen lassen, einfach nur an einem punkt? Aber das mit den fonts wird funktionieren.
 

Dilandau

Aktives Mitglied
Die Fontmessung funktioniert jetzt, aber g.setClip(x,y,w,h) scheint wirkungslos zu sein. Immernoch sind neuaufbau Arbeiten am ganzen schirm sichtbar (flackern). Ein doppelbuffer (versteckter aufbau) wäre zu viel des guten. Dann schon lieber von vorneherein ein 'smartrefresh' wie am amiga, wo das system sich teile merken kann, auf kommando oder bei eigenen aktionen (fensterüberlappung). Einfacher und am ressourcen-sparsamsten ginge es aber mit dem simplen userseitigen g.setClip, das aber nichts bewirkt. Warum bewirkt es nichts? Ist es nicht in g. sondern woanders? muss das clipping erst extra eingeschaltet werden?

Hier der Programmcode:

btw: die Variablen, die außer der methode definiert werden, sollen zwischen den aufrufen bestehen bleiben. Kann ein spezieller variablentyp innerhalb der methode definiert werden, also nur dort einen gülltigen namen haben und trotzdem zwischen aufrufen bestehen bleiben?

Code:
  // Capture the mouseMoves event for info text popup at the marks
  boolean info = false;
  int[] mp = new int[2], cp = new int[4];
  public void mouseMoved(MouseEvent e)
  {
      if (null != thisbook) {

          // Get the current state of the graphics
          Graphics g = this.getGraphics();
          Point mouse = new Point(e.getX(), e.getY());

          if (info) {
              if (mp[0]-12 >= mouse.x || mp[0]+12 <= mouse.x
               || mp[1]-12 >= mouse.y || mp[1]+12 <= mouse.y) {
                  info = false;

          // clipping erfolgt hier (nicht)

                  g.setClip(cp[0],cp[1],cp[2],cp[3]);
                  repaint();
                  g.setClip(null);

          //  aha, ich ahne, daß der clip IN repaint() gesetzt werden muß ... morgen (trotzdem lasse ich den artikel als beispiel so im forum stehen)

              }
          } else {

          //find a close point
          int v=0; //later get these from outer param
          int word;
          for (int ring=1; ring<=rings; ring++) {
              for (int spoke=1; spoke<=spokes && v<thisbook.length; spoke++) {
                  if (v>=0) {
                      if (-1 != (word = thisbook[v].matchpos(mouse))) {
                          if (!info) {
                              //draw or send word info
                              //g.setColor(Color.yellow);
                              //g.fillOval(mousepos.x, mousepos.y, 40, 40);
                              g.setColor(Color.white);
                              String s = "Spoke "+spoke+" Verse "+(v+1)+" "
                                       +thisbook[v].id+thisbook[v].chap+":"+thisbook[v].rel,
                                     s2 = "Word "+(word+1)+" "+thisbook[v].w[word].s;
                              FontMetrics fm = g.getFontMetrics();
                              Rectangle2D rect = fm.getStringBounds(s, g);
                              int w = (int)rect.getWidth(), h = (int)rect.getHeight();
                              //store clip pos and size
                              cp[0]=mouse.x;cp[1]=mouse.y;cp[2]=w+4;cp[3]=2*h+4;
                              //draw note

           // denn schließlich gillt das translate() auch nur bis zum verlassen der methode, so daß wohl vor
           // dem aufruf von paint() durch repaint() alle clips genauso zurückgesetzt werden
           // nunja, die mausmethode könnte paint() selber aufrufen anstelle über repaint(), was haltet ihr davon?

                              g.translate(cp[0],cp[1]);
                              g.setColor(Color.gray);
                              //g.drawRect(0,0,cp[2],cp[3]);
                              g.fillRoundRect(0,0,cp[2],cp[3],7,7);
                              //g.setColor(Color.gray);
                              //g.fillRect(1,1,cp[2]-1,cp[3]-1);
                              g.setColor(Color.white);
                              g.drawString(s, 3, h-1);
                              g.drawString(s2,3, 2*h);
                              info = true;
                              //store mouse pos
                              mp[0]=mouse.x; mp[1]=mouse.y;
                          }
                      }
                  }
                  v++;
              }
          }
          }//end else if
      }
  }
  // Define the other events for MouseMotionListener
  public void mouseDragged(MouseEvent e) {}

Ok, wenn ich mich irre, dann stellt es richtig udn schreibt wie's ganz anders geht (mein lösungsansatz im code notiert).
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben