2013-07-07 6 views
0

Я пытаюсь сделать приложение для загрузки пользовательских данных из xml для создания древовидной модели, тогда у пользователя есть возможность выбрать кусок данных из дерева и установить для него значок ,Динамически установлен значок для узла дерева на выбор пользователя

Я могу успешно загрузить данные из XML-файла, но проблема в том, что я не могу установить другую иконку для каждого узла дерева

Вот как я сделал

public class DefaultTreeRenderer extends DefaultTreeCellRenderer { 

private static final long serialVersionUID = 1L; 
private Icon userIcon; 
private int getSelecteRow; 

public DefaultTreeRenderer(String IconPath,int selected) throws IOException { 
    Image img = ImageIO.read(new File(IconPath)) ; 
    Image newimg = img.getScaledInstance(28, 28, java.awt.Image.SCALE_SMOOTH) ; 
    Icon x = new ImageIcon(newimg); 
    userIcon= x; 
    getSelecteRow = selected; 
} 

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

    JLabel label = (JLabel) super.getTreeCellRendererComponent(
        tree, value, sel, 
        expanded, leaf, row, 
        hasFocus); 


    if (?!!!) { 
    // This's the missing part, what should i state to set per row icon ? 

     label.setIcon(tutorialIcon); 
     label.setText(label.getText()+" √"); 

    } else{ 

    } 

    return label; 
    } 
} 

тестовый код:

try { 

     jTree1.setCellRenderer(new DefaultTreeRenderer(iconPathTextBox.getText(),jTree1.getMinSelectionRow())); 
    } catch (IOException ex) { 
     Logger.getLogger(frame.class.getName()).log(Level.SEVERE , null , ex); 
    } 
+1

Попробуйте подход, показанный в [JTree: установите пользовательские открытые/закрытые значки для отдельных групп] (http://stackoverflow.com/questions/14096725/jtree-set-custom-open-closed-icons-for-individual -группы). – trashgod

+0

Спасибо, trashgod за помощь. Мне удалось решить эту проблему, сделав карту для каждой части данных на jtree и ее значке. Если вы проверите, будет ли userObject равен ключу карты, тогда установите значение Icon, получив значение ключа (значок). – Nemotatu

+0

Вы можете [ответить на свой вопрос] (http://meta.stackexchange.com/q/17463/163188). – trashgod

ответ

0
public class DefaultTreeRenderer extends DefaultTreeCellRenderer { 
private static final long serialVersionUID = 1L; 
Map<String,Icon> amap = new HashMap<>(); 
ArrayList<String > drawList = new ArrayList<>(); 

public DefaultTreeRenderer(ArrayList<String > list,Map<String,Icon> amap1) throws IOException { 

    setData(list,amap1); 
} 


private void setData(ArrayList<String > lists,Map<String,Icon> amap2){ 
    amap = amap2; 
    drawList = lists; 
} 

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



      super.getTreeCellRendererComponent(
        tree, value, sel, 
        expanded, leaf, row, 
        hasFocus); 


    Object nodeInfo = ((DefaultMutableTreeNode) value).getUserObject(); 
    Icon bn = this.leafIcon; 

    if (getDrawable(nodeInfo)) { 
     setIcon(amap.get(nodeInfo.toString()));  
    } 

    if(this.getIcon()!=null && leaf) { 
     setText(nodeInfo.toString()+"  √"); 
    } 
    if(this.getIcon()==null && leaf){ 
     setIcon(bn); 
    } 



    return this; 
} 

protected boolean getDrawable(Object value) { 

    String title = value.toString(); 

    for(String c : drawList){ 
    if (title.equals(c)) { 
     return true; 
    } 
    } 

    return false; 
    } 
} 

код теста:

ArrayList<String> xmllist= new ArrayList<>(); 
Map<String,Icon> amap = new HashMap<>(); 

if(g.getName().endsWith("png") ||g.getName().endsWith("jpg")) { 

try { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) 
        jTree1.getLastSelectedPathComponent(); 

    Object nodeInfo = node.getUserObject(); 
    String hn = imagePathTextBox.getText(); 

    Image img = ImageIO.read(new File(hn)) ; 
    Image newimg = img.getScaledInstance(28, 28, java.awt.Image.SCALE_SMOOTH) ; 
    Icon x = new ImageIcon(newimg); 
    amap.put(nodeInfo.toString() , x); 

    jTree1.setCellRenderer(new DefaultTreeRenderer(xmllist,amap)); 
    } catch (IOException ex) { 
     Logger.getLogger(frame.class.getName()).log(Level.SEVERE , null , ex); 
    } 
    } 
Смежные вопросы