JTree의 Collapsed Icon
에서 사용자 정의 롤오버 효과를 만들려고합니다. 그러나 모든 핸들 대신 개별 핸들을 대상으로 지정하는 방법을 잘 모르겠습니다.JTree 핸들에 롤오버 추가
아래 코드를 실행하면 JTree의 핸들, 노드 또는 리프 위로 마우스를 올려 놓으면 모든 접힌 핸들이 롤오버로 변경됩니다. 이것은 바람직하지 않습니다. 그렇다면 핸들 위에 마우스를 올려 놓을 때 단 하나의 핸들을 어떻게 바꿀 수 있습니까? 노드 옆에 마우스를 올려 놓을 때 핸들을 바꿀 필요가 없습니다. 당신이 BasicTreeUI.paintExpandControl()
및 BasicTreeUI.MouseHandler.mouseMoved()
를 재정의해야 원하는 결과를 달성하기 위해
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.plaf.basic.*;
@SuppressWarnings("serial")
public class DirectoryExplorer extends JFrame {
private DirectoryExplorer() {
super("Directory Explorer");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
createPanel();
setSize(800,600);
setVisible(true);
}
private void createPanel() {
JPanel panel = new JPanel(new GridLayout(1, 1));
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Hello");
root.add(new DefaultMutableTreeNode("1"));
root.add(new DefaultMutableTreeNode("2"));
root.add(new DefaultMutableTreeNode("3"));
JTree tree = new JTree();
BasicTreeUI tUI = (BasicTreeUI) tree.getUI();
tUI.setCollapsedIcon(new ImageIcon("resources/closed.png"));
tUI.setExpandedIcon(new ImageIcon("resources/open.png"));
tree.setShowsRootHandles(true);
tree.addMouseMotionListener(new MouseHandler(tree));
panel.add(new JScrollPane(tree));
getContentPane().add(panel);
}
public static void main(String[] args) {
new DirectoryExplorer();
}
private class MouseHandler implements MouseMotionListener {
JTree t = null;
BasicTreeUI tUI = null;
public MouseHandler(JTree tree) {
t = tree;
tUI = (BasicTreeUI) tree.getUI();
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
TreePath selPath = t.getPathForLocation(e.getX(), e.getY());
if(selPath != null)
tUI.setCollapsedIcon(new ImageIcon("resources/rollover.png"));
else
tUI.setCollapsedIcon(new ImageIcon("resources/closed.png"));
t.repaint();
}
}
}
을 시도 적이 rollover.png. – trashgod
추측에, 당신은''BasicTreeUI'를 하위 클래스화할 필요가 있습니다. – trashgod
@trashgod 당신 말이 맞았습니다. 나는'BasicTreeUI'의 서브 클래스를 생성함으로써 그것을 할 수있었습니다. 관심이 있다면 코드는 아래에 있습니다 – Dan