2015-05-21 15 views
6

Tôi muốn triển khai ToolTip trong Swing có hành vi tùy chỉnh: người dùng di chuyển trên thành phần càng dài, chi tiết càng được hiển thị trong chú giải công cụ (nghĩa là một vài dòng mới được thêm sau vài giây người dùng di chuột qua thành phần). Tôi chỉ cần kiểm tra xem điều này thực sự có thể thực hiện được với Swing mà không có những thứ quá lộn xộn. Ý tưởng của tôi vào lúc này có lẽ sẽ là:Mở rộng ToolTipManager của Swing để thay đổi hành vi khi di chuột?

  • Mở rộng ToolTipManager
  • Override mouseEntered để bắt đầu một bộ đếm thời gian (có thể sử dụng javax.swing.Timer?). Gọi setToolTipText và createToolTip để làm mới các tooltip và thêm thông tin mới đều đặn
  • Override mouseExited để thiết lập lại bộ đếm thời gian
  • Có lẽ sử dụng setDismissDelay để thiết lập sự chậm trễ bỏ một cái gì đó còn rất nhiều (hoặc Integer.MAX_VALUE)

Điều này có khả thi hay không hay đây không phải là cách hay để làm việc với Swing (xin lỗi, tôi khá mới với nó)? Có cách nào tốt hơn để làm điều này?

[sửa] Hmm, chỉ cần nhớ rằng ToolTipManager là một singleton với một hàm tạo chỉ có khả năng hiển thị gói, vì vậy nó không thể được mở rộng.

[chỉnh sửa 2] Tôi đang thử một vài giải pháp vào lúc này. Một điều mà tôi quên thêm là tôi cần phải biết thành phần nào đang được di chuột qua - điều tôi đoán có nghĩa là tôi sẽ cần phải làm việc với một số loại người nghe bằng phương thức mouseEntered() (hoặc có thể truy cập thông tin). Và không có tương tác nào khác với cửa sổ bật lên/chú giải công cụ là cần thiết - nó chỉ cần hiển thị thông tin.

+1

"* Điều đó có khả thi không? *" Có. Cách của bạn trông giống như một lựa chọn tốt, nhưng không cần thực hiện cụ thể thì khó có thể nói được .. – user1803551

+0

Đúng vậy! Nếu nó có vẻ giống như một lựa chọn phong nha tôi sẽ cho nó một đi - có lẽ là cách tốt nhất để tìm ra. –

+0

Với một số thông tin khác, tôi có thể hướng dẫn bạn thêm một chút. Có một cái gì đó như "cho mỗi giây x thêm của lơ lửng, thêm một dòng khác vào văn bản chú giải công cụ" là một ví dụ tốt về những gì bạn muốn đạt được? – user1803551

Trả lời

1

(Điều này có vẻ hơi khó hiểu vì vậy hãy cho tôi biết nếu bạn cần tôi làm rõ cho tôi biết và tôi sẽ cố gắng chỉ cho bạn cách tôi hình dung mã) Tôi nghĩ ý tưởng của bạn có thể hoạt động như thể bạn mở rộng nó, và cũng có thể làm cho một lớp học tư nhân mở rộng Thread và sau đó trong phương pháp run() bạn làm điều gì đó như

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

và trong lớp học của bạn kéo dài ToolTipManager, tạo ra một lĩnh vực cho lớp đó mà kéo dài Thread và trong mouseEntered(MouseEvent e) nhanh chóng điều như:

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

và sau đó trong phương pháp mouseExited(MouseEvent e) làm

extendsThreadClass = null;

Sau đó, trong đó phương pháp mouseEntered(MouseEvent e) sau khi bắt đầu Thread sau đó bạn có thể làm những gì bạn muốn làm sau khi điều thời gian như

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

Xin lỗi nó có thể gây nhầm lẫn, hãy cho tôi biết nếu tôi có thể xóa nó cho bạn

0

Tôi nghĩ tôi nên cập nhật e này với cách tiếp cận tôi đã làm trước khi tôi thấy câu trả lời của l1zZY (tôi nghĩ đó là cách tốt hơn để làm mọi thứ - tôi vẫn còn có lỗi trong mã của mình trước khi chuyển sang thứ khác, nhưng điều này vẫn có thể hữu ích cho ai đó).Đây là những gì tôi đã làm:

  • Mở rộng JToolTip
  • Sử dụng một Timer Swing cho thời gian
  • Thêm một người biết lắng nghe MouseMotion đến JTree (trong trường hợp của tôi, tôi muốn popup để hiển thị khi một nút được quét qua)
  • Hơi inelegantly, phát hiện khi con chuột di chuyển qua nút cây như thế này:

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

    }

  • tooltip.show() đề cập đến cách chú giải công cụ được chứa trong Cửa sổ bật lên để hiển thị hoặc ẩn nó theo chương trình. show() hiển thị Popup (và do đó chú giải công cụ) và cũng bắt đầu hẹn giờ Đu.

  • Bộ hẹn giờ có phương thức được gọi là actionPerformed() được gọi ở bất kỳ khoảng thời gian nào bạn đã đặt. Tôi chỉ có phương thức đó gọi mã để thêm thông tin mới vào chú giải công cụ. trong hide(), tôi đặt lại chú giải công cụ và bộ hẹn giờ.

Tôi gặp sự cố với cửa sổ bật lên hoặc chú giải công cụ không thay đổi kích thước để phù hợp với nội dung nhưng điều này có vẻ ổn.

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