我在JScrollPane
內部有一個JTree
,當我使用滾動條時,樹會變得模糊起來,如下圖所示。JTree在滾動時模糊不清
如果我做了一些重繪,比如最小化和恢復窗口,或者單擊樹中的某個節點以使節點展開或摺疊(但是如果拖動模糊不會消失,它將恢復正常窗戶離開屏幕並返回,或拖動它前面的另一個窗口)。
JTree有一個自定義TreeModel
和單元格渲染器。最近的變化是針對TreeModel
;單元格渲染器在那裏已經很久了,並且工作正常。單元格渲染器是DefaultTreeCellRenderer
的子類,只覆蓋getTreeCellRendererComponent
方法(顯示自定義圖標)。
我曾經從包含要顯示的數據的數據結構中填充DefaultMutableTreeNode
,但是當節點數量很大時(例如超過10,000),這會帶來性能問題。由於我所擁有的數據已經是樹形結構,我意識到在不使用任何DefaultMutableTreeNode
的情況下創建一個自定義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(http://sscce.org/)表現出您所描述的問題。 – trashgod
某些地方不符合Swing的透明度要求。 IE瀏覽器。嘗試將背景顏色設置爲透明或半透明值 – MadProgrammer
刪除CustomCellRenderer和重寫JTree.convertValueToText後,它仍然會出現相同的問題。 – Gigatron