Этот вопрос основан на this question.Цветные ряды в JTree
Я хочу, чтобы дерево было по-разному окрашено в зависимости от уровня узлов. Эта работа просто прекрасно, когда им с использованием стандарта groundNonSelectionColor
this is how it Looks right now
Я хочу, чтобы этот цвет покрывает всю ширину JScrollPanel.
Пример кода:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
public class Main extends JFrame {
public Main(){
JFrame f = new JFrame();
JTree tree = new JTree();
MyTreeCellRenderer renderer = new MyTreeCellRenderer();
tree.setCellRenderer(renderer);
JScrollPane p = new JScrollPane(tree);
f.getContentPane().add(BorderLayout.CENTER,p);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,400);
}
public static void main(String[] args) {
new Main();
}
public static class MyTreeCellRenderer extends DefaultTreeCellRenderer{
public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel,
boolean expanded,boolean leaf,int row,boolean hasFocus) {
JComponent component = (JComponent)super.getTreeCellRendererComponent(tree, value, sel,expanded, leaf, row,hasFocus);
if (getRowOfNode(value) != -1) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
switch (getRowOfNode(value)){
//Different Level - Different Colors => 1 == Root
case 1: component.setBackground(Color.RED);break;
case 2: component.setBackground(Color.BLUE);component.setForeground(Color.WHITE);break;
case 3: component.setBackground(Color.YELLOW);break;
}
}
//component.setPreferredSize(new Dimension(tree.getWidth(),tree.getRowHeight()));
component.setOpaque(true);
return component;
}
}
public static int getRowOfNode(Object value){
if(value instanceof DefaultMutableTreeNode){
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
return node.getPath().length;
}
return -1;
}
}
Примечание: если добавить setPreferredSize
Группа не показывает ничего вообще (tree.getWidth() работает отлично) с при помощи ссылки выше я смог получить выделение «Фон» по всей строке, а не только по тексту, но им не удалось заставить его работать для «Цвет всех строк».
Указание значения для решения задачи Questino связаны выше:
В вопросе связан целый ряд мы окрашиваться только если выбраны элементы. Моя проблема заключается в том, чтобы покрасить всю строку при выборе элементов arent (в решении связанного вопроса проблема такая же, как в моем примере Picture! - вся строка будет окрашена только при выборе элемента - если нет выбирающий Случается цвет будет уменьшен до названия узла/лист)
это ответ ссылка не работает для вас? Я думаю, что это простой способ. – TomN
Я отредактировал вопрос, чтобы указать разницу между вопросом, который я связал, и проблемой у меня есть – mayha