Ich versuche, einen benutzerdefinierten Rollover-Effekt für einen JTree Collapsed Icon
zu machen. Ich bin mir jedoch nicht sicher, wie ich ein einzelnes Handle statt aller Handles anvisieren soll.Hinzufügen von Rollover zu JTree-Handles
Wenn Sie den unten stehenden Code ausführen, werden Sie sehen, dass alle ausgeblendeten Griffe in den Rollover umgewandelt werden, wenn Sie den Mauszeiger über ein Handle, einen Knoten oder ein Blatt des JTree bewegen. Dies ist nicht erwünscht. Wie kann ich also nur einen einzigen Ziehpunkt ändern, wenn ich über diesen Ziehpunkt schwebe, und vorzugsweise nicht, wenn ich den Knoten daneben bewege?
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();
}
}
}
„_DO Sie wissen, ob es möglich ist, einzelne Griffe zum Ziel, wenn die Maus über sie ist? _“ Ich habe noch nie versucht. – trashgod
Bei einer Schätzung müssten Sie "BasicTreeUI" ableiten. – trashgod
@trashgod Du hattest Recht. Ich konnte es tun, indem ich eine Unterklasse von 'BasicTreeUI' erstellte, Code ist unten, wenn Sie interessiert sind – Dan