2009-07-27 7 views
23

Próbuję ustawić podpowiedzi na JEditorPane. Metoda, której używam do określenia, jaki tekst podpowiedzi jest wyświetlany, jest dość intensywna dla procesora - a więc chciałbym ją pokazać po zatrzymaniu myszy na krótki czas - powiedzmy 1 sekundę.Ustawianie czasu opóźnienia narzędzia dla konkretnego komponentu w Java Swing

Wiem, że mogę używać ToolTipManager.sharedInstance().setInitialDelay(), jednak ustawi to opóźnienie dla podpowiedzi na wszystkich elementach swing jednocześnie i nie chcę tego.

+0

Co zrobić obecny w etykiecie, która nie może być wyliczony w wątku tła? – akarnokd

+0

Niektóre przykładowy kod może być pomocny. Mógłbym podać przykład tego, o czym mówię. – jjnguy

+0

Chcę zmienić treść podpowiedzi w zależności od tego, na jakie słowo przesuwa się użytkownik. Zadanie wypełniania zawartości etykiety narzędzi jest dość kosztowne, więc chcę wykonać to obliczenie tylko wtedy, gdy użytkownik utknął nad słowem. – Scottm

Odpowiedz

6

Cóż, polecam wykonanie zadania intensywnego procesora na innym wątku, aby nie zakłócało normalnych zadań GUI.

To byłoby lepsze rozwiązanie. (Zamiast próbować obejść ten problem)

* Edit * można ewentualnie obliczyć tootips dla każdego słowa w JEditorPane i przechowywać je w Map. Wtedy wszystko, co musisz zrobić, to uzyskać dostęp do tootip z Map, jeśli się zmieni.

Idealnie ludzie nie będą poruszać myszką i pisać w tym samym czasie. Możesz więc obliczyć tootlipy po zmianie tekstu i po prostu je wyciągnąć z Map na mouseMoved().

+0

Twoja edycja jest bardzo dobrą sugestią. Nie jestem pewien, czy to zadziała, ponieważ w rzeczywistości jest to debugger, nad którym pracuję, a więc wartości umieszczone na mapie mogą ulec zmianie - to świetny pomysł. Myślę, że twoja sugestia obliczenia wartości w wątku jest również dobra. – Scottm

+0

Tak, zgadzam się - pewna forma buforowania odpowiedzi, gdy mysz się porusza i jej pobieranie po zatrzymaniu użytkownika może rozwiązać mój problem. Spróbuję jutro - ustawię twoją odpowiedź na zaakceptowaną. Dzięki za pomoc. – Scottm

3

Możesz wyświetlić okno wyskakujące samodzielnie. Nasłuchiwać mouseMoved() zdarzenia, start/stop timera a następnie pokazać okienko z następującego kodu:

najpierw trzeba PopupFactory, Popup i ToolTip:

private PopupFactory popupFactory = PopupFactory.getSharedInstance(); 
private Popup popup; 
private JToolTip toolTip = jEditorPane.createToolTip(); 

następnie, aby pokazać lub ukryć podpowiedzi :

private void showToolTip(MouseEvent e) { 
    toolTip.setTipText(...); 
    int x = e.getXOnScreen(); 
    int y = e.getYOnScreen(); 
    popup = popupFactory.getPopup(jEditorPane, toolTip, x, y); 
    popup.show(); 
} 

private void hideToolTip() { 
    if (popup != null) 
     popup.hide(); 
} 

to daje regulowane opóźnienie i dużo kłopotów :)

+0

W moim przypadku, jeśli umieścisz kursor nad ikoną na początku paska stanu, pojawi się podpowiedź z poprzednimi wiadomościami "n". Dopóki trzymasz mysz w granicach podpowiedzi, pozostaje.Ale chciałem kontrolować wszystkie aspekty czasowe bez zmiany globalnych czasów etykiet narzędzi. Moim zdaniem, twoje rozwiązanie wydaje się znacznie lepszą alternatywą niż zaakceptowana odpowiedź, ale hej to tylko moje dwa centy? Dzięki za to rozwiązanie Piligrimie, spróbuję tego bardzo krótko! – Jeach

+0

Nie oglądałem tego wątku przez długi czas, ale podoba mi się twoja sugestia. Nigdy nie miałem okazji ukończyć tego projektu, więc niedługo spróbuję. Dam ci pomysł :) – Scottm

23

Jeśli to, co chcesz, aby etykietka oddalenie opóźnienie znacznie dłużej specyficzny składnik, to jest to miłe Hack:

(uznanie dla tech w http://tech.chitgoks.com/2010/05/31/disable-tooltip-delay-in-java-swing/)

private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay(); 

addMouseListener(new MouseAdapter() { 

    public void mouseEntered(MouseEvent me) { 
    ToolTipManager.sharedInstance().setDismissDelay(60000); 
    } 

    public void mouseExited(MouseEvent me) { 
    ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout); 
    } 
}); 
+0

+1, ale dokonałem zmiany. Zrobiłem domyślny limit czasu poza 'mouseEntered()', ponieważ może to doprowadzić do pomyłki, jeśli ustawiasz defaultDismissTimeout wiele razy (co, jeśli użytkownik ma wiele komponentów obok siebie, gdzie zmienił limit czasu? Mogliby całkowicie stracić domyślny limit czasu, przechodząc od jednego do drugiego.) Najlepiej, gdyby domyślna wartość parametru Czas zwłoki w ruchu została zmieniona na globalną, aby zapewnić, że zostanie ustawiona tylko jeden raz podczas inicjowania całej aplikacji. – ArtOfWarfare

+0

@ArtOfWarfare, W połączonym blogu defaultDismissTimeout został oznaczony jako ostateczny, co prawdopodobnie jest sposobem obejścia wielu ustawień. –

+0

@BuhBuh - Edytowałem tutaj odpowiedź, aby pobrać defaultDismissTimeout poza słuchacza, ale w prawdziwym kodzie, który napisałem na podstawie tej odpowiedzi, zdecydowałem się uczynić z niego statyczną zmienną końcową dla mojego komponentu. Jeśli chcesz zobaczyć rzeczywiste wartości, które są domyślne, spójrz na linie 85-91 tutaj: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6- b14/javax/swing/ToolTipManager.java – ArtOfWarfare