2013-04-04 5 views
0

По какой-то странной причине, когда я реализую JTree в java, я не вижу линий расширения (под углом) на Mac OSX; но когда дерево расширяется, чтобы показать все узлы, я вижу их в Windows. Я пробовал tree.putClientProperty("JTree.lineStyle", "Angled"), но ничего не получаю.Реализация JTree

Вторая проблема вопроса, на OSX снова: у меня есть изображение для корня, которое также не показано полностью, что-то вырезано сверху и снизу.

DefaultMutableTreeNode root = new DefaultMutableTreeNode(userId + " Album List"); 
albTree = new JTree(root); 
albTree.setCellRenderer(new IconRenderer()); 
albTree.putClientProperty("JTree.lineStyle", "Angled");  
albTree.setFont(new Font("Segoe UI", Font.PLAIN, 20)); 
albTreeModel = (DefaultTreeModel) albTree.getModel();  albTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 


class IconRenderer extends DefaultTreeCellRenderer { 

    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 

     // start with default behavior 
     super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 

     // customize based on local conditions/state 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 

     DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); 

     Icon openIcon = renderer.getDefaultOpenIcon(); 
     Icon rootIcon = new ImageIcon("images/user-1.png"); 

     if (node == nonAdminFrame.root) { 

      setIcon(rootIcon); 

     } 

     else if (nonAdminFrame.root.isNodeChild(node)) { 

      setIcon(openIcon); 
     } 

     return this; 
    } 
} 
+1

Угловая для кроссплатформенной LookAndFeel (MetalLookAndFeel) – mKorbel

+0

, что вы предлагаете? – jrdnsingh89

+0

Я не пользователь OSX, можете ли вы изменить свой код на MetalLookAndFeel, если это правда? – mKorbel

ответ

1

Вот полный пример. Обратите внимание, что значение LEG_LINE_STYLE_STRING = "Angled" по умолчанию.

Дополнение: Некоторый дополнительный getTreeCellRendererComponent() показаны примеры here; вам, возможно, придется настроить setRowHeight().

image

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.UIManager; 

/** 
* @see 
*/ 
public class Test { 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JTree tree = new JTree(); 
     tree.putClientProperty("JTree.lineStyle", "Angled"); 
     //tree.putClientProperty("JTree.lineStyle", "Horizontal"); 
     //tree.putClientProperty("JTree.lineStyle", "None"); 
     for (int i = 0; i < tree.getRowCount(); i++) { 
      tree.expandRow(i); 
     } 
     f.add(tree); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) throws Exception { 
     UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test().display(); 
      } 
     }); 
    } 
}