【发布时间】:2013-03-29 03:01:00
【问题描述】:
我在JScrollPane 中有一个JTree,当我使用滚动条时,树变得模糊,如下图所示。
如果我做一些事情让它重新绘制,它会恢复正常,比如最小化和恢复窗口,或者在树中单击以使节点展开或折叠(但是如果我拖动窗口,模糊不会消失离开屏幕并返回,或将另一个窗口拖到它前面)。
JTree 有一个自定义的TreeModel 和单元格渲染器。最近的更改是针对TreeModel;单元格渲染器已经存在了很长时间并且工作正常。单元格渲染器是DefaultTreeCellRenderer 的子类,仅重写了getTreeCellRendererComponent 方法(以显示自定义图标)。
我曾经从包含要显示的数据的数据结构中填充DefaultMutableTreeNodes,但是当节点数量很大(比如超过 10,000 个)时,这会导致性能问题。由于我拥有的数据已经在树形结构中,我意识到在不使用任何DefaultMutableTreeNodes 的情况下围绕它创建自定义 TreeModel 将相当简单。这使得 JTree 的填充速度更快,但现在我遇到了滚动模糊的问题。
下面的代码不是来自应用程序,但它可以按原样编译并演示问题。删除 tree.setBackground 行会停止模糊行为。
package stackoverflow;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import javax.swing.*;
import java.awt.Color;
public class NumberTreeModel implements TreeModel {
public static final int ROOT_NUMBER = 100;
public Object getChild(Object parent, int index) {
return index;
}
public int getChildCount(Object node) {
return isLeaf(node) ? 0 : ROOT_NUMBER;
}
@Override
public int getIndexOfChild(Object parent, Object child) {
int parentValue = ((Integer) parent).intValue();
int childValue = ((Integer) child).intValue();
return parentValue == ROOT_NUMBER ? childValue : -1 ;
}
public Object getRoot() {
return ROOT_NUMBER;
}
public boolean isLeaf(Object node) {
return ((Integer) node).intValue() < ROOT_NUMBER;
}
public void addTreeModelListener(TreeModelListener listener) { }
public void removeTreeModelListener(TreeModelListener listener) { }
public void valueForPathChanged(TreePath path, Object obj) { }
public static void display() {
JFrame frame = new JFrame("Number JTree");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
NumberTree tree = new NumberTree();
tree.setModel(new NumberTreeModel());
tree.setBackground(new Color(0,0,0,0));
JScrollPane scroll = new JScrollPane(tree);
frame.add(scroll);
scroll.getViewport().setScrollMode(JViewport.BLIT_SCROLL_MODE);
tree.expandRow(0);
frame.pack();
frame.setSize(300, 400);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static class NumberTree extends JTree {
static final long serialVersionUID = 1;
@Override
public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus) {
if (value instanceof Integer) {
int n = ((Integer) value).intValue();
return n + "=========".substring(0, n % 10);
} else {
System.out.println("value class=" + value.getClass());
return value.toString();
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
display();
}
});
}
}
【问题讨论】:
-
请编辑您的问题以包含一个 sscce 来展示您所描述的问题。
-
某些地方不符合 Swing 的透明度要求。 IE。尝试将背景颜色设置为透明或半透明值
-
移除 CustomCellRenderer 并覆盖 JTree.convertValueToText 后,仍然会出现同样的问题。
-
SSCCE 将花费大量时间 啊……换句话说:你的时间太宝贵了,我们的 即使发布不完整,也可以花时间解决您的问题? -1 并投票结束。
-
我说如果必须要写SSCCE,看来我必须写了,所以我今天要写。但这需要很多时间。我不希望任何人花几个小时来为我解决这个问题,我只是希望以前遇到过这个问题的其他人能给我一个提示,告诉我出了什么问题,这样我就可以自己解决了。跨度>
标签: java swing jscrollpane jtree treemodel