[英]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...
)。 這本身就很昂貴。
更重要:
渲染器應該是可重復使用的組件,並且僅針對要顯示的特定值進行配置。 這就是為什么默認實現重復使用標簽並僅設置文本,顏色,邊框等的原因。這就是渲染器調用非常便宜的原因。
每次顯示一個值時,您都會創建一個新的JLabel
: returnLab = new JLabel(text);
。 這很貴。 將為每個重繪事件上顯示的每個單元格調用此方法。 這比構建組件網格要昂貴得多,並且無法滿足渲染器概念的整個目的。
請查看默認渲染器實現,以了解如何正確執行。 並看看教程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.