2011-11-01 18 views
5

Khi tôi lấy hơn 1000 đối tượng java từ cơ sở dữ liệu, nó được thực hiện rất nhanh chóng. Tôi kết thúc với số List<Object> khớp với truy vấn của tôi.JTree: tăng tốc độ vẽ hơn 1000 nút con từ các đối tượng được truy xuất từ ​​cơ sở dữ liệu?

Sự cố đang vẽ các đối tượng này lên Jtree.

Ví dụ: tôi có một parentID của một nút nhất định. Khi nút này (DefaultMutableTreeNode) được nhấp đúp (TreeMouseListener.class), nó sẽ hiển thị con trực tiếp của nút này, không phải tất cả con cháu (mặc dù điều này có thể được yêu cầu sau này nếu có thể nhưng không phải bây giờ).

Vấn đề là hoạt động vẽ jtree này mất rất nhiều thời gian để hoàn thành việc thêm 1000+ trẻ em DefaultMutableTreeNodes cho nút cha được chọn.

ex) 1000 new DefaultMutableTreeNode(Person person);

Làm thế nào có thể quá trình vẽ này được tăng tốc?

Tôi không sử dụng bất kỳ trình kết xuất ô tùy chỉnh nào hoặc tôi không hiển thị bất kỳ thứ gì ngoài các bit văn bản nhỏ cho mỗi nút.

+0

Một số nội dung trong [câu hỏi này] (http://stackoverflow.com/questions/7893162/how-to-get-the -number-of-columns-and-rows-có-được-nhìn-trong-my-jlist) có thể chứng minh có liên quan đến bạn. –

+0

im viết này như bình luận như tôi không muốn va đập nó. nhưng lý do tôi đã phải đối mặt với sự chậm chạp là becuse tôi đã sử dụng một máy chủ cơ sở dữ liệu từ xa. khi tôi sử dụng cơ sở dữ liệu cục bộ, biểu tượng pr0oblem đã biến mất. – KJW

Trả lời

-3

Viết JTree của riêng bạn bằng cách sử dụng JPanel cho đồ họa: P.

Hoặc bạn có thể tạo ra một lớp mở rộng JTree và ghi đè lên paint(Graphics g) phương pháp

2

lẽ Bạn đang tạo 1000 DefaultMutableTreeNodes đưa Danh sách của bạn trong. Vấn đề là tạo ra nhiều đối tượng một cách nhanh chóng, và dịch đối tượng của bạn để DefaultMutableTreeNode . Nếu bạn không tạo tất cả các đối tượng đó, bạn có thể cải thiện hiệu suất của mình. Tôi khuyên bạn chỉ nên viết thực hiện TreeModel của riêng bạn mà làm việc trực tiếp với mô hình đối tượng của bạn để bạn không phải tạo lại nhiều đối tượng đó nữa. Điều đó sẽ cải thiện tốc độ của bạn một cách đáng kể. Tôi đã đặt 10.000 đối tượng trong JTree trước đây (tôi đã làm nó nhưng nó có lẽ không phải là một ý tưởng tuyệt vời), nhưng tôi đã phải viết TreeModel của riêng mình vì vậy tôi không phải tạo lại các đối tượng đó.

Tuy nhiên, như với tất cả các vấn đề hiệu suất, bạn nên cấu hình nó trước tiên để tìm ra nơi bạn đang dành thời gian và giải quyết vấn đề đó. Nếu nó chỉ ra vấn đề này thì bạn có thể làm điều đó. Bạn không cần phải cố gắng và tạo ra thói quen vẽ đồ họa của riêng bạn bởi vì đó là công việc đáng kể hơn so với viết TreeModel của riêng bạn.

Tùy chọn khác là tìm nạp cây theo yêu cầu khi cần. Vì vậy, lấy gốc sau đó khi người dùng mở rộng mỗi nút tìm nạp các con của nó từ máy chủ. Người dùng không thể nhìn vào tất cả 1000 nút cùng một lúc, vì vậy điều này sẽ làm giảm đáng kể số tiền bạn đang chuyển qua mạng và ít thời gian hơn trên máy chủ.

+0

vì vậy bạn có ý định chỉ tạo defaultmutabletreenodes "trống"? – KJW

+0

No. DefaultMutableTreeNode thực hiện hai giao diện MutableTreeNode và TreeNode. Các đối tượng của bạn đang được gửi từ máy chủ có thể thực hiện TreeNode hoặc MutableTreeNode và JTree có thể sử dụng chúng trực tiếp thay vì DefaultMutableTreeNode. Bạn cũng sẽ cần phải tạo trình tạo TreeModel của riêng bạn để phân phát các tham chiếu đến việc triển khai TreeNode/MutableTreeNode của bạn. Đọc javadoc về điều này, và google trên web làm thế nào để làm điều này có rất nhiều tài liệu ra khỏi đó. – chubbsondubs

+0

danh sách chứa các đối tượng được lưu trữ trong cơ sở dữ liệu đối tượng. không thể lưu trữ các đối tượng thực hiện TreeNode chỉ POJO. Khi danh sách được truy xuất, tôi nên tạo một danh sách khác chứa các đối tượng đó? bởi vì tôi không hiểu làm thế nào tôi có thể tạo ra một "thực hiện" trên bay khác hơn là làm 'mới DefaultMutableTreeNode (đối tượng)' .... bạn có nghĩa là 'đối tượng thực hiện MutableTreeNode' và lưu trữ trực tiếp? xin lỗi vì sự nhầm lẫn. Tôi cũng đang cố gắng phương pháp này ở đây: http://stackoverflow.com/questions/7962252/jtree-how-to-hide-parts-of-a-given-defaultmutabletreenodes-text – KJW

5

Bạn sẽ cần đến thời gian mà sự chậm lại là nhưng tôi nghi ngờ nó chỉ là tạo DefaultMutableTreeNodes nên nhanh hơn tải các đối tượng Person từ cơ sở dữ liệu. Nó không thể là bức tranh (trừ khi Person # toString() của bạn rất chậm) vì sẽ không có một nghìn nút trên màn hình.

Đoán của tôi là bạn đang thêm từng nút một, gây ra hàng nghìn sự kiện thay đổi thay vì thêm tất cả trẻ em cùng một lúc. Bạn nên thêm hàng ngàn nút con vào nút cha trực tiếp và sau đó gọi DefaultTreeModel # nodeStructureChanged (nút) trên nút cha.

Nếu điều đó vẫn còn chậm, đó là thời gian cho SSCCE.Ví dụ: nhấn nút trên hệ thống của tôi sẽ không có sự chậm trễ nào cả:

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 

public class TestJTree { 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root"); 
       final DefaultTreeModel model = new DefaultTreeModel(root); 
       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       frame.getContentPane().add(new JScrollPane(new JTree(model))); 
       frame.getContentPane().add(new JButton(
         new AbstractAction("Add thousand children") { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         int offset = root.getChildCount() + 1; 
         for (int i = 0; i < 1000; i++) { 
          DefaultMutableTreeNode child = new DefaultMutableTreeNode(
            "Person " + (i + offset)); 
// adding child with event (but isn't much slower really) 
//        model.insertNodeInto(child, root, root.getChildCount()); 
          root.add(child); 
         } 
         model.nodeStructureChanged(root); 
        } 
       }), BorderLayout.PAGE_END); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

làm cách nào bạn có thể thêm trực tiếp hàng ngàn nút con mà không cần thêm từng nút con trong một vòng lặp? – KJW

+0

@ kim-jong-woo xem câu trả lời cập nhật –

+0

Thực ra đã được thử nghiệm với DefaultTreeModel # insertNodeInto (đã nhận xét trong SSCCE) và tôi không thể nhận thấy sự khác biệt về tốc độ. Vì vậy, nếu bạn thấy một sự khác biệt trong mã của bạn, nó chắc chắn không Swing đó là vấn đề. Tốt hơn hãy kích hoạt VisualVM để xem vấn đề ở đâu trong mã của bạn. –

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