2013-01-10 33 views
3

我知道您可以在使用Swing使用UImanager的應用程序中更改Tree.collapsedIcon的所有JTrees。例如:爲單個JTree定製Tree.collapsedIcon

UIManager.put("Tree.collapsedIcon",closedcabinet); 

我想與最終的結果是,該Tree.collpasedIcon可能出現不同的在同一應用不同的樹同一個應用程序改變Tree.collapsedIcon個人JTrees的靈活性。

我知道如何使用自定義渲染器來自定義各個圖標。例如,我使用setIcon來設置葉子的圖標SetOpenIcon,以便爲展開時具有子級的節點設置圖標,並且對於不是的節點設置相同的圖標。

但我不知道如何爲Tree.collapsedIcon做這個,除了使用UIManager,它具有上述的限制。

任何人都知道如何做到這一點?

+0

* 「謝謝, 埃利奧特」 *通過1100+代表。你應該知道4行sig。不受歡迎。 -1 –

+0

好奇:爲什麼downvotes?看起來對我來說是一個很好的問題。 – kleopatra

回答

5

另一種方法是構建每棵樹的時候,以調節UIManager。在下面的例子中,靜態工廠提供了所需的Icon對。這個例子借用MetalLookAndFeel中的兩個圖標作爲對比。自定義圖標,看到here,也是可能的。

frame.add(new JTreePanel(Icons.getDefault())); 
frame.add(new JTreePanel(Icons.getMetal())); 

image

SSCCE:

import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTree; 
import javax.swing.LookAndFeel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.plaf.metal.MetalLookAndFeel; 

/** @see https://stackoverflow.com/a/14262706/230513 */ 
public class JTreePanel extends JPanel { 

    public static final class Icons { 

     private static final String COLLAPSED_ICON = "Tree.collapsedIcon"; 
     private static final String EXPANDED_ICON = "Tree.expandedIcon"; 
     private Icon collapsed; 
     private Icon expanded; 

     public static Icons getDefault() { 
      Icons icons = new Icons(); 
      icons.collapsed = (Icon) UIManager.get(COLLAPSED_ICON); 
      icons.expanded = (Icon) UIManager.get(EXPANDED_ICON); 
      return new Icons(); 
     } 

     public static Icons getMetal() { 
      Icons icons = new Icons(); 
      try { 
       LookAndFeel save = UIManager.getLookAndFeel(); 
       LookAndFeel laf = new MetalLookAndFeel(); 
       UIManager.setLookAndFeel(laf); 
       icons.collapsed = (Icon) UIManager.get(COLLAPSED_ICON); 
       icons.expanded = (Icon) UIManager.get(EXPANDED_ICON); 
       UIManager.setLookAndFeel(save); 
      } catch (UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(System.err); 
      } 
      return icons; 
     } 
    } 

    public JTreePanel(Icons pair) { 
     UIManager.put("Tree.collapsedIcon", pair.collapsed); 
     UIManager.put("Tree.expandedIcon", pair.expanded); 
     JTree tree = new JTree(); 
     this.add(tree); 
     for (int i = 0; i < tree.getRowCount(); i++) { 
      tree.expandRow(i); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createGUI(); 
      } 
     }); 
    } 

    private static void createGUI() { 
     final JFrame frame = new JFrame(); 
     frame.setLayout(new GridLayout(1, 0)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JTreePanel(Icons.getDefault())); 
     frame.add(new JTreePanel(Icons.getMetal())); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
0

我看到的唯一方法是從Java source code創建您自己的JTree版本,該版本允許您爲每個JTree定義圖標。

我看到JTree從javax.accessibility.AccessibleContext獲取圖標,最終得到AccessibleIcon接口的一些定義類。

+0

hmm ...好奇:你在哪裏看到一個樹從accessibilityContext獲取其摺疊/展開圖標?在超級getIcon返回null,我可以找到沒有明顯的覆蓋。 – kleopatra

6

如果你作出這樣的TreeUI您正在使用是instance ofBasicTreeUI的假設,你可以做到以下幾點:

TreeUI tui = treeInstance.getUI(); 
if (tui instanceof BasicTreeUI) { 
    ((BasicTreeUI)tui).setCollapsedIcon(myIcon); 
} 
+0

+1這就是SwingX的JXTree所做的:-)要小心:它必須更新在切換LAF ...... JXTree也忘記了...咳嗽 – kleopatra

+0

+1注意到隱含的假設。 – trashgod