gpt4 book ai didi

java - 动态设置不同的jtree行高

转载 作者:行者123 更新时间:2023-11-30 08:48:16 24 4
gpt4 key购买 nike

全部,

过去两天尝试为 JTree 动态设置不同的行高但零成功。下面是我想要实现的目标的图像...这是我尝试过的:

(1) 使用 setRowHeight(0) 这样节点会查询它当前的单元格渲染器

(2) 设置从 jtree 的单元格渲染器返回的组件的 PreferredSize(Dimension d)。

(3) 更改渲染器本身的行高,据我所知现在不应该这样做。

我不知道如何在同一列上设置不同的单元格渲染器,例如下面的 A 列也许我可以硬编码不同的行高。

enter image description here

任何人都有任何提示或技巧或更好的是一个有效的例子,我的脑袋炸了,我似乎已经用尽了所有其他资源..这应该是可能的,对吧?

最佳答案

(1)(2)Windows 10 上使用 JDK1.8.0_51 对我来说效果很好:

enter image description here

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;

public class RowHeightsDynamicallyTest {
public JComponent makeUI() {
JTree tree = new JTree() {
@Override public void updateUI() {
setCellRenderer(null);
super.updateUI();
setCellRenderer(new RowHeightsDynamicallyRenderer());
setRowHeight(0);
setRootVisible(false);
setShowsRootHandles(false);
}
};
return new JScrollPane(tree);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
try {
for (UIManager.LookAndFeelInfo laf: UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(laf.getName())) {
UIManager.setLookAndFeel(laf.getClassName());
}
}
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new RowHeightsDynamicallyTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}

class RowHeightsDynamicallyRenderer extends DefaultTreeCellRenderer {
private int height;
@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, hasFocus);
l.setFont(tree.getFont().deriveFont(leaf ? 16f : 48f));

height = leaf ? 20 : 60;
//use dummy height Icon: l.setIcon(new DummyHeightIcon(height));
//use <td> height: l.setText(String.format("<html><table><tr><td height='%d'>%s", height, value));
return l;
}
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = height;
return d;
}
}

// class DummyHeightIcon implements Icon {
// private final int height;
// public DummyHeightIcon(int height) {
// this.height = height;
// }
// @Override public void paintIcon(Component c, Graphics g, int x, int y) {}
// @Override public int getIconWidth() {
// return 0;
// }
// @Override public int getIconHeight() {
// return height;
// }
// }

关于java - 动态设置不同的jtree行高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055606/

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