Vorteile von Tooltip nutzen (wird über allen anderen Objekten angezeigt)

prototype0815

Aktives Mitglied
Hallo liebe Leuts,
ich habe geschäftlich ein etwas schwierigeres Projekt zu managen, und zwar habe ich eine vorhandene OnscreenKeyboard (OSK) die sehr sehr abgespeckt war, aufgemotzt. Ich habe daraus, für eine komfortablere Bedienung an Touchscreens, eine "Swipe"-ähnlich Tastatur gebaut.
539708dde0927.png

wenn man mit dem Finger (Maus) auf eine Taste klickt wird sie etwas größer und über der eigentlichen Taste dargestellt. Nun kann ich mit dem Finger über die Tastatur fahren, und wenn ich zur nächsten Taste komme wird diese dann groß und die andere davor verschwindet. Ich hoffe ihr versteht was ich meine 😀
Zur Erläuterung, jede Taste die man dort sieht ist ein Key Objekt. Die Tastatur die man sieht ist eine Application und die Anwendung drum herum (von der man nur noch einen kleinen Teil sieht) ist ein Applet das sich mit der Tastatur verbindet.
Wie man auf dem Bild unschwer erkennen kann ist die Taste die gerade groß angezeigt wird oben abgeschnitten. Weil die OSK App nur so viel anzeigefläche bekommt wie sie auch Tatsächlich groß ist.
Würde ich eine Zahl anklicken dann wäre nichts sichtbar weil diese komplett oben raus gezeichnet werden würde.

Nun hatte ich die Idee, da Tooltipps auch über die Anzeigefläche der App hinaus gezeichnet werden, könnte ich für meine Keys die selbe Funktion nutzen. Aber ich finde leider zu dem Thema überhaupt nix.
Ich habe schon versucht mit JRootPane - JLayeredPane zu arbeiten aber das wirft mehr Probleme auf als das es löst.

Vielleicht kennt sich ja jemand gut genug mit Tooltips aus um mir zu helfen, oder gleich zu sagen das dies net möglich ist. 😀

LG proto
 
Zuletzt bearbeitet:
Hi,

also muss erstmal zugeben, hab selbst noch nicht mit tooltips gearbeitet, aber wenn die Taste vollständig angezeigt werden soll, warum denn nicht als neues Window schreiben? 🙂

Dem kannste ja auch zuweisen, dass es im Vordergrund ist, erscheint sobald ein Feld erreicht wird und verschwindet sobald das Feld überschritten ist 🙂

Ist vielleicht nicht ganz so elegant, aber würde doch bestimmt auch funktionieren ^^
 
Also mir geht es eigentlich eher drum wie denn wohl die Tooltips arbeiten, wie werden sie über allen anderen Objekten gezeichnet? Damit zu arbeiten ist kinderleicht.... btn01.setToolTipText("ich bin der Tooltiptext");.....fertig.

Und zu Window Objekten, ich habe schon mit JRootPane und JLayeredPane gearbeitet um mein Problem zu lösen, hat aber nicht funktioniert. Da JWindow auch vom Objekt Component abstammt genau wie JPanel und all so viele kann ich damit leider nur genau die selben Methoden nutzen.

Mit Hilfe von JLayeredPane habe ich mein Objekt auf die oberste, die PopupLayer gelegt. Die Taste war zwar dann über allen anderen gezeichnet, aber ebenfalls nicht über den Rand der Application hinaus.
 
Morgen, ich hab meine Problem schon vor einiger Zeit gelöst, aber nun dachte ich, ich sollte euch daran Teil haben lassen falls in Zukunft nochmal jemand ein derartiges Problem hat.
So sieht nun die Lösung aus. Ein Buffered Image (bim) wird nicht nur innerhalb der Application gezeichnet sonder wie ein Tooltip auch über den Rand hinaus.
53b638fb2af07.png


Ich habe mir angeschaut wie die Tooltips funktionieren und mir eine eigene "show" Methode für ein JWindow geschrieben. Es wird nun direkt gezeichnet sobald dieses JWindow erstellt wird und nicht wie man es sonst kennt wenn das System update() aufruft, oder der Programmierer einen Flag setzt mit repaint().
Java:
    win = new JWindow() {

      public void show() {
        synchronized (getTreeLock()) {
          ComponentPeer peer = this.getPeer();
          if (peer != null) {
            if (peer instanceof LightweightPeer)
              super.show();
          }
          else {
            addNotify();
            validate();
            toFront();
            synchronized (getTreeLock()) {
              visible = true;
              peer = getPeer();
              Graphics2D g = (Graphics2D) peer.getGraphics();
              peer.show();
//              System.out.println(peer);
              g.drawImage(bim, 0, 0, bim.getWidth(), bim.getHeight(), null);
            }
//            super.show();
          }
        }
      }
    };
Java:
if (bim == null)
      bim = new BufferedImage(key.getWidth(), key.getHeight(),
          BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = (Graphics2D) bim.getGraphics();
    g2.setFont(this.getParent().getFont());
    key.paint(g2);

    g2.setColor(new Color(255, 255, 0, 150));
    g2.setStroke(new BasicStroke(3));
    g2.drawRoundRect(0, 0, bim.getWidth() - 1, bim.getHeight() - 1, 10, 10);

    win.setBounds(keyboardLocation.x + (int) (p.getX() - (d.width / 4)),
        keyboardLocation.y + (int) (p.getY() - (d.height * 1.5)) - 3,
        bim.getWidth(), bim.getHeight());
    win.setAlwaysOnTop(true);
    win.setVisible(true);
 

Zurück
Oben