2009-07-27 35 views
23

Tôi đang cố gắng đặt chú giải công cụ trên JEditorPane. Phương pháp mà tôi sử dụng để xác định văn bản chú giải công cụ nào hiển thị là khá nhiều CPU - và vì vậy tôi muốn chỉ hiển thị nó sau khi chuột đã dừng trong một khoảng thời gian ngắn - nói 1 giây.Đặt thời gian trễ của chú giải công cụ cho một thành phần cụ thể trong Java Swing

Tôi biết tôi có thể sử dụng ToolTipManager.sharedInstance().setInitialDelay(), tuy nhiên điều này sẽ đặt thời gian trễ cho chú giải công cụ trên tất cả các thành phần xoay cùng một lúc và tôi không muốn điều này.

+0

Bạn làm gì hiện diện trong tooltip mà không thể được tính toán trong một thread nền? – akarnokd

+0

Một số mã mẫu có thể hữu ích. Tôi có lẽ có thể đưa ra một ví dụ về những gì tôi đang nói về. – jjnguy

+0

Tôi muốn thay đổi nội dung của chú giải công cụ tùy thuộc vào từ mà người dùng đang di chuột qua. Nhiệm vụ điền nội dung của chú giải công cụ khá tốn kém, vì vậy tôi chỉ muốn thực hiện tính toán đó nếu người dùng đã dừng lại trên một từ. – Scottm

Trả lời

6

Vâng, tôi khuyên bạn nên thực hiện tác vụ chuyên sâu của CPU trên một chuỗi khác để nó không làm gián đoạn các tác vụ GUI thông thường.

Đó sẽ là giải pháp tốt hơn. (Thay vì cố gắng để phá vỡ các vấn đề)

* Chỉnh sửa * Bạn có thể có thể tính toán tootips cho mỗi từ trong JEditorPane và lưu trữ chúng trong một Map. Sau đó, tất cả những gì bạn phải làm là truy cập vào cái tootip trong số Map nếu nó thay đổi.

Lý tưởng nhất mọi người sẽ không di chuyển chuột và nhập cùng một lúc. Vì vậy, bạn có thể tính toán các dấu nháy kép khi văn bản thay đổi và chỉ kéo chúng từ số Map trên mouseMoved().

+0

Chỉnh sửa của bạn là một gợi ý rất hay. Tôi không chắc chắn nếu nó sẽ làm việc vì nó thực sự là một trình gỡ lỗi tôi đang làm việc trên và vì vậy các giá trị được đặt trong bản đồ có thể thay đổi - đó là một ý tưởng tuyệt vời mặc dù. Tôi nghĩ rằng đề xuất của bạn về tính toán giá trị trong một chủ đề là tốt quá. – Scottm

+0

Có Tôi đồng ý - một số hình thức lưu vào bộ nhớ cache câu trả lời khi con chuột di chuyển và truy xuất nó khi người dùng dừng lại có thể giải quyết vấn đề của tôi. Tôi sẽ thử vào ngày mai - Tôi sẽ đặt câu trả lời của bạn để được chấp nhận. Cảm ơn bạn đã giúp đỡ. – Scottm

3

Bạn có thể tự hiển thị cửa sổ bật lên. Nghe mouseMoved() sự kiện, bắt đầu/dừng bộ đếm thời gian và sau đó hiển thị popup với đoạn mã sau:

Trước tiên, bạn cần PopupFactory, Popup, và ToolTip:

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

sau đó, để hiển thị hoặc ẩn các tooltip :

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(); 
} 

này sẽ cung cấp cho bạn chậm trễ có thể điều chỉnh và rất nhiều rắc rối :)

+0

Trong trường hợp của tôi, nếu bạn di chuột qua biểu tượng ở đầu thanh trạng thái, một chú giải công cụ hiện lên với các thông điệp 'n' trước đây. Miễn là bạn giữ con chuột trong tooltip giới hạn nó vẫn còn.Nhưng tôi muốn kiểm soát tất cả các khía cạnh thời gian mà không thay đổi thời gian chú giải công cụ toàn cầu. Theo ý kiến ​​của tôi, giải pháp của bạn có vẻ như là một lựa chọn tốt hơn nhiều so với câu trả lời được chấp nhận, nhưng hey của nó chỉ có hai xu của tôi? Cảm ơn giải pháp này Piligrim, tôi sẽ thử nó rất sớm! – Jeach

+0

Tôi chưa xem chủ đề này trong một thời gian dài nhưng tôi thích đề xuất của bạn. Tôi không bao giờ có cơ hội hoàn thành dự án này vì vậy tôi sẽ sớm thử lại điều này. Tôi sẽ đưa ra ý tưởng của bạn một shot :) – Scottm

23

Nếu những gì bạn muốn là làm cho tooltip sa thải chậm trễ lâu hơn nữa cho một cụ thể thành phần, thì đây là một hack thoải mái:

(thanh danh cho công nghệ tại 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, nhưng tôi đã thay đổi. Tôi đã nhận được thời gian chờ mặc định bên ngoài 'mouseEntered()', bởi vì nó có khả năng làm hỏng mọi thứ nếu bạn đang thiết lập defaultDismissTimeout nhiều lần (điều gì sẽ xảy ra nếu người dùng có nhiều thành phần cạnh nhau khi họ thay đổi thời gian chờ? Lý tưởng nhất, có vẻ như defaultDismissTimeout nên đi một nơi nào đó toàn cầu để đảm bảo nó được thiết lập chỉ một lần, lúc khởi tạo của toàn bộ ứng dụng. – ArtOfWarfare

+0

@ArtOfWarfare, Trong blog được liên kết, defaultDismissTimeout được đánh dấu là cuối cùng, mà tôi cho là cách chúng có xung quanh nhiều cài đặt. –

+0

@BuhBuh - Tôi đã chỉnh sửa câu trả lời ở đây để lấy defaultDismissTimeout bên ngoài trình lắng nghe, nhưng trong mã thực tế tôi đã viết dựa trên câu trả lời này, tôi quyết định biến nó thành biến cuối cùng tĩnh cho thành phần của mình. Nếu bạn muốn xem các giá trị thực tế mặc định, hãy xem các dòng 85-91 tại đây: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6- b14/javax/swing/ToolTipManager.java – ArtOfWarfare

Các vấn đề liên quan