gpt4 book ai didi

java - JXTreeTable 结合 TreeCellRender 和 selectedBackground 与 ColorHighlighter

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:47 25 4
gpt4 key购买 nike

我正在尝试将自定义 selectionBackground 设置为 JXTreeTable 中的行。如果我没有设置自定义 TreeCellRenderer,这会起作用。如果我像在我的示例中那样另外设置它,则节点文本的 selectionBackground 是默认的。任何想法如何将节点文本的背景设置为自定义背景?

import java.awt.Color;

import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.UIManager;

import org.jdesktop.swingx.JXTreeTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.HighlightPredicate;
import org.jdesktop.swingx.renderer.DefaultTreeRenderer;
import org.jdesktop.swingx.renderer.IconValue;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;

public class TestHighlighter {

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JScrollPane scrollPane = new JScrollPane();
frame.setContentPane(scrollPane);

JXTreeTable treeTable = new JXTreeTable(new DefaultTreeTableModel(new DefaultMutableTreeTableNode("Test")));
treeTable.setRootVisible(true);
scrollPane.setViewportView(treeTable);

DefaultTreeRenderer treeCellRenderer = new DefaultTreeRenderer(new IconValue() {
@Override
public Icon getIcon(Object value) {
return UIManager.getIcon("FileView.directoryIcon");
}
});
//Comment out next line and background is like set in Highlighter
treeTable.setTreeCellRenderer(treeCellRenderer);

treeTable.addHighlighter(new ColorHighlighter(HighlightPredicate.ALWAYS, null, null, Color.RED, null));

frame.pack();
frame.setVisible(true);
}
}

我还尝试使用 IconHighlighter(避免使用自定义 TreeCellRenderer)来更改节点的图标,但图标没有更改。

treeTable.addHighlighter(new IconHighlighter(HighlightPredicate.ALWAYS, UIManager.getIcon("FileView.directoryIcon")));

最佳答案

[...]the problem is, that I want to have different selectionBackgrounds dependent of the node. [...] I thought there is maybe a more elegant way by using the swingx-renderer.

您当然可以使用 SwingX 渲染器(又名:DefaultTreeRenderer)并覆盖 getCellRendererComponent(...)为了根据需要根据节点设置背景颜色。例如:

IconValue iconValue = new IconValue() {
@Override
public Icon getIcon(Object value) {
return UIManager.getIcon("FileView.directoryIcon");
}
};

DefaultTreeRenderer treeCellRenderer = new DefaultTreeRenderer(iconValue) {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (selected && leaf) {
c.setBackground(Color.RED);
} else {
setBackground(tree.getBackground());
}
return c;
}
};

在此代码段中,如果选择了叶节点(既不是根节点也不是父节点),那么标签的背景颜色将为红色。否则标签的背景颜色将是默认的。

关于java - JXTreeTable 结合 TreeCellRender 和 selectedBackground 与 ColorHighlighter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com