2015-05-21 11 views
6

Özel davranışa sahip Swing'de bir ToolTip uygulamak istiyorum: kullanıcı bileşen üzerinde ne kadar uzun süre kalırsa, araç ipucunda daha fazla ayrıntı görünmelidir (yani, birkaç saniye sonra birkaç yeni satır eklenir) kullanıcı bileşeni üzerinde gezinme). Sadece bunun, Swing'le, gerçekten çok dağınık hale gelmeden yapılıp yapılamayacağını kontrol etmem gerek.Vurgulu davranışı değiştirmek için Swing'in ToolTipManager'ı genişletme?

  • ToolTipManager uzatın
  • geçersiz kılma (belki javax.swing.Timer kullanılır?) Bir zamanlayıcı başlatmak için mouseEntered: Şu anda Benim fikrim muhtemelen olacaktır. ipucunu yenilemek ve düzenli aralıklarla yeni bilgiler eklemek için setToolTipText ve createToolTip Çağrı
  • geçersiz kılma
  • Muhtemelen çok daha uzun bir şeye görevden gecikmeyi ayarlamak için setDismissDelay kullanmak zamanlayıcı (ya Integer.MAX_VALUE)
sıfırlamak için mouseExited

Böyle bir şey yapılabilir mi, yoksa Swing ile çalışmak için iyi bir yol değil mi (üzgünüm, benim için oldukça yeni)? Bunu yapmanın daha iyi bir yolu var mı?

[değiştir] Hmm, ToolTipManager'ın yalnızca paket görünürlüğüne sahip bir kurucuya sahip bir tekil olduğunu hatırladım, bu nedenle genişletilemez.

[değiştir 2] Şu anda birkaç çözüm deniyorum. Eklemeyi unuttuğum bir şey, hangi bileşenin üzerinde durduğunu bilmem gerektiğidir. Bu, bir mouseEntered() yöntemiyle bir çeşit dinleyici ile çalışmam gerekeceği anlamına gelir (ya da buna erişebilir) bilgi). Ve popup/tooltip ile başka hiçbir etkileşime ihtiyaç yoktur - sadece bilgileri görüntülemek gerekir.

+1

"* Böyle bir şey yapılabilir mi? *" Evet. Yolunuz iyi bir seçenek gibi gözüküyor, ancak somut bir uygulama olmadan söylemek zor… – user1803551

+0

Doğru! Eğer iyi bir seçenek gibi geliyorsa, ona bir şeyler vereceğim - muhtemelen en iyi yol bulma yöntemi. –

+0

Daha fazla bilgi ile size biraz daha yol gösterebilirim. "Her ek X saniye boyunca gezinme, araç ipucu metnine başka bir satır ekleme" gibi bir şey istersiniz, başarmak istediğiniz şeyin iyi bir örneği olabilir mi? – user1803551

cevap

1

(Bu biraz kafa karıştırıcı gibi gözükebilir, lütfen bana bildirin lütfen açıklamama izin verin ve kodun nasıl görüntülendiğini göstermeye çalışacağım) Eğer fikrinizi uzatırsanız, sanırım fikriniz işe yarayabilir. ve ayrıca Thread uzanan özel bir sınıf oluşturun ve sonra run() yönteminde Eğer

while(true) 
{ 
    sleep(1); 
    timeElapsed++; 
} 

gibi ve Thread uzanan o sınıf için bir alan oluşturmak, ToolTipManager uzanır sınıfınızda ve bir şeyler mouseEntered(MouseEvent e) şeyi örneğini gibi:

extendsThreadClass = new ExtendsThreadClass(); 
extendsThreadClass.start(); 

ve sonra mouseExited(MouseEvent e) yönteminde yapmak

o mouseEntered(MouseEvent e) yöntemde Sonra extendsThreadClass = null;

Thread başladıktan sonra o zaman

if(timeElapsed > 3000) 
{ 
    //what you want to do here 
} 

Maalesef gibi zaman olayından sonra ne yapmak istediğinizi yapabilirsiniz kafa karıştırıcı olabilir, eğer sizin için temizleyebiliyorsam, bana haber vereyim

0

e lzzZY'nin cevabını görmeden önce yaptığım yaklaşımla (ki bunun daha iyi bir şey olduğunu düşünüyorum - başka bir şeye geçmeden önce kodumda hatalar vardı, ama bu hala birine yardımcı olabilir).Bu benim yaptığım budur:

  • (benim durumumda bir düğüm üzerinde süpürdü zaman göstermek için pop-up istedik) JTree bir MouseMotion dinleyicisi ekleyin JToolTip
  • Kullanım zamanlaması
  • için Salıncak Zamanlayıcı uzatın

    public void mouseMoved(MouseEvent e) { 
    int x = (int) e.getX(); 
    int y = (int) e.getY(); 
    TreePath path = getPathForLocation(x, y); 
    if (path == null) { 
        tooltip.hide(); 
    } else { 
        TreeNode node = (TreeNode) path.getLastPathComponent(); 
        tooltip.setHoveredNode(node); 
        if (!tooltip.isVisible) { 
         int absX = e.getXOnScreen(); 
         int absY = e.getYOnScreen(); 
         final Popup tooltipContainer = PopupFactory.getSharedInstance().getPopup(PDTreeView.this, 
           tooltip, absX, absY); 
         tooltip.setToolTipContainer(tooltipContainer); 
         tooltip.show(); 
        } 
    } 
    

    }

  • 012: fare böyle bir ağaç düğümü üzerine getirildiğinde
  • Biraz inelegantly tespit

  • tooltip.show(), programlı olarak göstermek veya gizlemek için araç ipucunun bir Popup içinde nasıl bulunduğunu ifade eder. show(), Popup'u (ve dolayısıyla araç ipucunu) gösterir ve ayrıca Swing zamanlayıcısını başlatır.

  • Zamanlayıcının, ayarladığınız aralıkta çağrılan actionPerformed() adlı bir yöntemi vardır. Ben sadece bu yönteme araç ipucuna yeni bilgiler ekleyen kodu çağırdım. hide()'da, araç ipucunu ve zamanlayıcıyı sıfırladım.

İçeriğe sığması için yeniden boyutlandırılmayan açılır pencere veya araç ipucuna sahip sorunlarım vardı, ancak aksi halde bu durum tamam görünüyordu.