Я хочу отобразить отдельный значок для сгруппированных и негруппированных узлов. Я создал выборочные коды customTreeCellRender.My, приведенные ниже. Внутри цикла нечетные одни узлы имеют один значок, а evens имеют другой. Но не меняют значок узлов. В моем приложении заполнение узлов дерева из db и группировка основаны на некоторых условиях. Это примерный исполняемый код.Как установить значок узла Jtree динамически
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
public class TestTree extends JDialog {
JTree tree;
DefaultTreeModel treeModel;
public TestTree() {
setSize(300, 800);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
System.out.println(getContentPane().getBackground());
}
protected static ImageIcon createImageIcon(String path) throws MalformedURLException {
java.net.URL imgURL = new URL(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
public void init() throws MalformedURLException {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Numbers");
treeModel = new DefaultTreeModel(root);
tree = new JTree(treeModel);
tree.setBackground(new Color(238, 238, 244));
tree.setOpaque(true);
CustomIconRenderer customIconRenderer = new CustomIconRenderer(true);
customIconRenderer.setTextSelectionColor(Color.white);
customIconRenderer.setBackgroundSelectionColor(Color.blue);
customIconRenderer.setBorderSelectionColor(Color.black);
customIconRenderer.setBackgroundNonSelectionColor(new Color(238, 238,
244));
ImageIcon icon = createImageIcon("http://i.stack.imgur.com/wCF8S.png");
customIconRenderer.setLeafIcon(icon);
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
DefaultMutableTreeNode subroot = new DefaultMutableTreeNode(
"node_" + i);
root.add(subroot);
tree.setCellRenderer(new CustomIconRenderer(false));
if (i % 3 == 0) {
for (int j = 10; j < 15; j++) {
DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(
"node_" + j);
subroot.add(leaf);
}
}
} else {
DefaultMutableTreeNode subroot = new DefaultMutableTreeNode(
"node_" + i);
root.add(subroot);
tree.setCellRenderer(new CustomIconRenderer(true));
if (i % 4 == 0) {
for (int j = 15; j < 20; j++) {
DefaultMutableTreeNode leaf = new DefaultMutableTreeNode(
"node_" + j);
subroot.add(leaf);
}
}
}
}
for (int i = 0; i < tree.getRowCount(); i++) {
tree.expandRow(i);
}
tree.setCellRenderer(customIconRenderer);
getContentPane().add(tree, BorderLayout.CENTER);
}
public static void main(String args[]) throws MalformedURLException {
TestTree tt = new TestTree();
tt.init();
tt.setVisible(true);
}
}
class CustomIconRenderer extends DefaultTreeCellRenderer {
/**
*
*/
private static final long serialVersionUID = 967937360839244309L;
ImageIcon groupedIcon;
ImageIcon unGroupedIcon;
boolean grouped;
public CustomIconRenderer() {
}
public CustomIconRenderer(boolean grouped) throws MalformedURLException {
this.grouped = grouped;
URL url=new URL("http://i.stack.imgur.com/wCF8S.png");
URL url1=new URL("http://i.stack.imgur.com/T5uTa.png");
groupedIcon = new ImageIcon(url1
);
unGroupedIcon = new ImageIcon(url
);
}
@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 nodeObj = ((DefaultMutableTreeNode) value).getUserObject();
// check whatever you need to on the node user object
if (grouped) {
setIcon(unGroupedIcon);
} else {
System.out.println("reached");
setIcon(groupedIcon);
}
return this;
}
}
добавлен работоспособный правильный пример – User123
1) MCVE должен быть один исходный файл (который может содержать более одного непубличного класса) и включает импорт. 2) Мы не можем запустить его и увидеть проблему без файлов изображений, которые находятся на вашем ПК! Одним из способов получения изображения (ов) для примера является ** горячая ссылка ** на изображения, видимые в [этот вопрос и ответы] (http://stackoverflow.com/q/19209650/418556). –
Плюс один для добавления MCVE. Я пытаюсь вернуть это снова, но все еще нужно еще два открытых голоса. В то же время, измените 'public Component getTreeCellRendererComponent (..' на '@Override public Component getTreeCellRendererComponent (..' для раскрытия сообщения компилятора. –