gpt4 book ai didi

java - 滚动时 JTree 严重模糊

转载 作者:行者123 更新时间:2023-11-30 04:26:43 25 4
gpt4 key购买 nike

我有一个JTree里面 JScrollPane ,当我使用滚动条时,树变得模糊,如下图所示。

如果我执行某些操作使其重新绘制,例如最小化和恢复窗口,或者单击树以使节点展开或折叠,它就会恢复正常(但是,如果我拖动窗口,模糊不会消失)离开屏幕并返回,或拖动其前面的另一个窗口)。

JTree 有一个自定义 TreeModel和单元格渲染器。最近的更改是针对 TreeModel ;单元格渲染器已经存在很长时间并且工作正常。单元格渲染器是 DefaultTreeCellRenderer 的子类,仅包含 getTreeCellRendererComponent重写方法(以显示自定义图标)。

我曾经填充DefaultMutableTreeNode来自包含要显示的数据的数据结构,但是当节点数量很大(例如超过 10,000 个)时,这会带来性能问题。由于我拥有的数据已经在树结构中,我意识到围绕它创建一个自定义 TreeModel 非常简单,而不使用任何 DefaultMutableTreeNode s。这使得 JTree 填充得更快,但现在我遇到了滚动模糊的问题。

Blurred 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();
}
});
}
}

最佳答案

我怀疑您已经覆盖了 paintComponent() 但忽略了 super.paintComponent(g),如图 here .

不太可能,您可以在滚动 Pane 的视口(viewport)中尝试使用 setScrollMode()

编辑您的问题以包含 sscce可能会澄清问题。

附录:作为引用,这里有一个示例,没有展示问题中看到的渲染伪像。

enter image description here

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;

/**
* @see https://stackoverflow.com/a/15696825/230513
*/
public class Sscce {

private void display() {
JFrame f = new JFrame("Sscce");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTree tree = new JTree();
for (int i = 0; i < tree.getRowCount(); i++) {
tree.expandRow(i);
}
f.add(new JScrollPane(tree));
f.pack();
f.setSize(200, 200);
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new Sscce().display();
}
});
}
}

关于java - 滚动时 JTree 严重模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696673/

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