gpt4 book ai didi

java - JTree 中的颜色行

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

我想为 JTree 中的元素着色。但是,仅向标签添加背景颜色看起来有点奇怪。特别是如果选择了多个节点,生成的形状看起来参差不齐且令人分心。

有没有办法让背景延伸到树元素的整个宽度,从而使整行都变色?要么从左边界开始,要么从标签的开头开始,但肯定延伸到组件的右边界?

这是一个独立的小演示,基于 this question .

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class SO26724913 {
public static void main(String[] args) {
DefaultMutableTreeNode a = new DefaultMutableTreeNode("a");
DefaultMutableTreeNode b = new DefaultMutableTreeNode("b");
DefaultMutableTreeNode c = new DefaultMutableTreeNode("c");
a.add(b);
a.add(c);
final JTree tree = new JTree(a);
tree.setCellRenderer(new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent
(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean focus)
{
JComponent c = (JComponent)
super.getTreeCellRendererComponent
(tree, value, selected, expanded, leaf, row, focus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
String data = (String)node.getUserObject();
if ("b".equals(data)) {
c.setBackground(Color.RED);
c.setOpaque(true);
}
else {
c.setBackground(null);
c.setOpaque(false);
}
return c;
}
});
JFrame frm = new JFrame();
frm.getContentPane().add(tree);
frm.setSize(200, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}

Current rendering这是代码当前生成的内容。

Background starting at icon我更喜欢这个
Background starting at left border或者这个。

最佳答案

您可以覆盖 JTreepaintComponent(Graphics) 方法来直接绘制选择矩形:

enter image description here

import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.tree.*;

public class ColorTreeTest {
private static final Color SELC = Color.RED;
public JComponent makeUI() {
FocusListener fl = new FocusListener() {
@Override public void focusGained(FocusEvent e) {
e.getComponent().repaint();
}
@Override public void focusLost(FocusEvent e) {
e.getComponent().repaint();
}
};
DefaultTreeCellRenderer r = new DefaultTreeCellRenderer() {
@Override public Component getTreeCellRendererComponent(
JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
JLabel l = (JLabel) super.getTreeCellRendererComponent(
tree, value, selected, expanded, leaf, row, false);
l.setBackground(selected ? Color.RED
: tree.getBackground());
l.setOpaque(true);
return l;
}
};
JPanel p = new JPanel(new GridLayout(1, 2));
for (JTree t : Arrays.asList(new ColorTree1(), new ColorTree2())) {
t.addFocusListener(fl);
t.setCellRenderer(r);
t.setOpaque(false);
p.add(new JScrollPane(t));
}
return p;
}
static class ColorTree1 extends JTree {
@Override public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
if (getSelectionCount() > 0) {
g.setColor(SELC);
for (int i : getSelectionRows()) {
Rectangle r = getRowBounds(i);
g.fillRect(r.x, r.y, getWidth() - r.x, r.height);
}
}
super.paintComponent(g);
if (getLeadSelectionPath() != null) {
Rectangle r = getRowBounds(getRowForPath(getLeadSelectionPath()));
g.setColor(hasFocus() ? SELC.darker() : SELC);
g.drawRect(r.x, r.y, getWidth() - r.x - 1, r.height - 1);
}
}
}
static class ColorTree2 extends JTree {
private static final Color SELC = Color.RED;
@Override public void paintComponent(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
if (getSelectionCount() > 0) {
g.setColor(SELC);
//@see http://ateraimemo.com/Swing/TreeRowSelection.html
for (int i : getSelectionRows()) {
Rectangle r = getRowBounds(i);
g.fillRect(0, r.y, getWidth(), r.height);
}
}
super.paintComponent(g);
if (getLeadSelectionPath() != null) {
Rectangle r = getRowBounds(getRowForPath(getLeadSelectionPath()));
g.setColor(hasFocus() ? SELC.darker() : SELC);
g.drawRect(0, r.y, getWidth() - 1, r.height - 1);
}
}
}
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new ColorTreeTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}

关于java - JTree 中的颜色行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26724913/

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