2009-07-22 41 views
6

Tôi có số này JTextPane (được bọc trong JScrollPane) được hỗ trợ bởi HTMLEditorKit. Nội dung của JTextPane là HTML đơn giản với một số hình ảnh (tệp cục bộ) được nhúng bằng thẻ img. Vấn đề là khi bạn tải JTextPane, phải mất một giây để tải và sau đó nó đi kèm với thanh cuộn ở dưới cùng của trang. Nếu tôi làm:Đặt thanh cuộn trên JScrollPane

JTextPane text = new JTextPane(); 
JScrollPane scroll = new JScrollPane(text); 
// do some set up... 
scroll.getVerticalScrollBar().setValue(0); 

nó đặt thanh cuộn trong giây lát và sau đó một thead (có lẽ đó là chịu trách nhiệm về tải hình ảnh) đến và gõ thanh cuộn lại để phía dưới. Tôi đã thử thêm:

((AbstractDocument)text.getDocument()).setAsynchronousLoadPriority(-1); 

nhưng điều đó không khắc phục được. Có cách nào để nhận sự kiện từ text.getDocument() hoặc text sẽ thông báo cho tôi khi ngăn tải hoàn tất để tôi có thể đặt thanh cuộn không? Cách khác là tôi thiết lập một luồng khác để chờ một giây hoặc lâu hơn, và sau đó thiết lập thanh cuộn, nhưng đây là một hack xấu.

Đề xuất của bạn?

Trả lời

20

Bạn đã thử sử dụng invokeLater chưa?

final JScrollPane scroll = new JScrollPane(text); 
javax.swing.SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     scroll.getVerticalScrollBar().setValue(0); 
    } 
}); 

Nếu điều đó không làm việc, đào vào xem hình ảnh là khá khó khăn để bước tiếp theo của tôi sẽ được theo dõi tại sao scrollbar đang thay đổi:

scroll.setVerticalScrollbar(new JScrollBar() { 
    public void setValue(int value) { 
     new Exception().printStackTrace(); 
     super.setValue(value); 
    } 
}); 

Bạn cũng có thể sử dụng một trình gỡ lỗi trong phương thức setValue() thay vì chỉ in dấu vết ngăn xếp.

+1

Giải pháp đầu tiên hoạt động, cảm ơn. Tại sao trên trái đất không có phương pháp để thiết lập điều này mà không cần phải gọi SwingUtilities? –

+3

Không có ý tưởng. Tôi nghĩ cách nó được thiết kế là bạn phải tạo JScrollPane, thêm nó vào màn hình và _then_ đặt giá trị. Không có ý nghĩa với tôi. – Spyder

0

Ứng dụng của bạn có được tạo luồng bởi bất kỳ cơ hội nào không? Nếu đó là bạn có thể yêu cầu một danh sách các chủ đề đang chạy và được thông báo khi họ kết thúc và sau đó thiết lập giá trị thanh cuộn. Đó có phải là một lựa chọn không?

Hoặc bạn có thể cung cấp ImageObserver cho mỗi hình ảnh được tải và đặt vị trí của thanh cuộn khi tất cả hình ảnh được báo cáo được tải?

+1

ứng dụng Swing dựa trên một sợi gọi là Chủ đề tổ chức sự kiện văn để kiểm soát mọi hành động GUI. Bạn có thể giải quyết vấn đề này nếu bạn cần, nhưng tất cả công việc tôi đang làm bây giờ là trên Chủ đề công văn sự kiện. Điều này có thể được coi là một lựa chọn, nhưng có lẽ chỉ là một hack xấu như những gì tôi đề xuất trong câu hỏi của tôi. Tôi sẽ giữ nó trong tâm trí mặc dù. – twolfe18

+0

ImageObserver có thể hoạt động sau đó ... –

1

Sau đây giải quyết vấn đề đối với tôi, sau 50 phút tuyệt vọng:

JTextPane.grabFocus(); 
JTextPane.setCaretPosition(20); 
Các vấn đề liên quan