簡體   English   中英

TreeCellRenderer吃CPU

[英]TreeCellRenderer eating CPU

我有一個簡單的TreeCellRenderer,它從節點中提取JButton並將其輸出到JTree。

public class ButtonCellRenderer extends JButton implements TreeCellRenderer {

  @Override
  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean     selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    //setBackgroundNonSelectionColor(tree.getBackground());
    ProgressButton b = null;
    if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
      Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
      if (userObject instanceof ProgressButton) {
        b = (ProgressButton) userObject;
        return b;
      }
    }
    if (b == null) {
      System.out.println("Null!");
      DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
      return defaultRenderer.getTreeCellRendererComponent(tree,
              value, selected, expanded, leaf, row, hasFocus);
    } else {
      System.out.println("Returning label");
      return new JLabel(b.getToolTipText(), b.getIcon(), SwingConstants.CENTER);
    }
  }
}

我不確定為什么,但是似乎卡住了循環,占用了30%到50%的CPU。 有什么辦法可以消除這種情況? 還是不必使用渲染器將JButton輸出到樹中?

我已經在上面添加了修改后的代碼,但是現在我遇到了一個問題,即按鈕無法正確顯示(它們全部都變小了)。

您正在調用super.getTreeCellRendererComponent而不存儲該值。 如果以后沒有創建渲染器,則再次調用此方法( if c==null... )。 這本身就很昂貴。

更重要:

渲染器應該是可重復使用的組件,並且僅針對要顯示的特定值進行配置。 這就是為什么默認實現重復使用標簽並僅設置文本,顏色,邊框等的原因。這就是渲染器調用非常便宜的原因。

每次顯示一個值時,您都會創建一個新的JLabelreturnLab = new JLabel(text); 這很貴。 將為每個重繪事件上顯示的每個單元格調用此方法。 這比構建組件網格要昂貴得多,並且無法滿足渲染器概念的整個目的。

請查看默認渲染器實現,以了解如何正確執行。 並看看教程

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM