이 있고 JScrollPane
안에 JTree가 흐리게 표시됩니다. 스크롤 막대를 사용하면 아래 이미지에서 볼 수 있듯이 트리가 모두 흐려집니다.안에
창을 최소화 및 복원하거나 노드를 확장하거나 축소하려면 다시 그리기 위해 뭔가를하면 정상으로 돌아옵니다 (단, 노드를 드래그하면 흐려지지 않습니다. 창을 화면에서 떼어 내고 뒤로 또는 다른 창을 그 앞에서 드래그).
JTree에는 사용자 정의 TreeModel
과 셀 렌더러가 있습니다. 최근 변경된 내용은 TreeModel
입니다. 셀 렌더러는 오랫동안 거기에 있었고 잘 작동했습니다. 셀 렌더러는 DefaultTreeCellRenderer
의 하위 클래스이며 사용자 정의 아이콘을 표시하기 위해 getTreeCellRendererComponent
메서드 만 재정의됩니다.
표시 할 데이터가 들어있는 데이터 구조에서 DefaultMutableTreeNode
s를 채우는 데 사용되었지만 노드 수가 많으면 (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
스윙의 투명성 요구 사항을 준수하지 않는 경우가 있습니다. 예. 배경색을 투명하거나 반투명 한 값으로 설정하려고 시도합니다. – MadProgrammer
CustomCellRenderer와 JTree.convertValueToText의 재정의를 제거한 후에도 여전히 동일한 문제가 발생합니다. – Gigatron