package com.example.client.utils; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.MenuSelectionManager; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.ComboBoxUI; import javax.swing.plaf.basic.ComboPopup; import javax.swing.plaf.metal.MetalComboBoxUI; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; /** * 下拉树工具类 * 2019年9月16日15:20:18 * @author Administrator * */ @SuppressWarnings("serial") public class DownTheTree extends JComboBox{ /** * 显示用的树 */ private JTree tree; public DownTheTree() { this(new JTree()); } public DownTheTree(JTree tree) { this.setTree(tree); } /** * 设置树 * * @param tree * JTree */ public void setTree(JTree tree) { this.tree = tree; if (tree != null) { this.setSelectedItem(tree.getSelectionPath()); this.setRenderer(new JTreeComboBoxRenderer()); } this.updateUI(); } /** * 取得树 * * @return JTree */ public JTree getTree() { return tree; } /** * 设置当前选择的树路径 * * @param o * Object */ public void setSelectedItem(Object o) { tree.setSelectionPath((TreePath) o); getModel().setSelectedItem(o); } public void updateUI() { ComboBoxUI cui = (ComboBoxUI) UIManager.getUI(this); if (cui instanceof MetalComboBoxUI) { cui = new MetalJTreeComboBoxUI(); } setUI(cui); } // UI Inner classes -- one for each supported Look and Feel class MetalJTreeComboBoxUI extends MetalComboBoxUI { protected ComboPopup createPopup() { return new TreePopup(comboBox); } } /** * * Description: 树形结构而来的DefaultListCellRenderer */ class JTreeComboBoxRenderer extends DefaultListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (value != null) { TreePath path = (TreePath) value; TreeNode node = (TreeNode) path.getLastPathComponent(); value = node; TreeCellRenderer r = tree.getCellRenderer(); JLabel lb = (JLabel) r.getTreeCellRendererComponent(tree, value, isSelected, false, node.isLeaf(), index, cellHasFocus); return lb; } return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } } /** * 测试 */ /* public static void main(String args[]) { JFrame frame = new JFrame("JTreeComboBox 例子"); frame.setSize(400, 320); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); frame.getContentPane().setLayout(new FlowLayout()); final DownTheTree box = new DownTheTree(new JTree()); box.setPreferredSize(new Dimension(300, 21)); frame.getContentPane().add(box); frame.setVisible(true); }*/ } /** *
* Description: TreePopup *
*/ @SuppressWarnings("serial") class TreePopup extends JPopupMenu implements ComboPopup { protected DownTheTree comboBox; protected JScrollPane scrollPane; protected MouseMotionListener mouseMotionListener; protected MouseListener mouseListener; private MouseListener treeSelectListener = new MouseAdapter() { public void mouseReleased(MouseEvent e) { JTree tree = (JTree) e.getSource(); TreePath tp = tree.getPathForLocation(e.getPoint().x, e.getPoint().y); if (tp == null) { return; } comboBox.setSelectedItem(tp); togglePopup(); MenuSelectionManager.defaultManager().clearSelectedPath(); } }; public TreePopup(JComboBox comboBox) { this.comboBox = (DownTheTree) comboBox; setBorder(BorderFactory.createLineBorder(Color.black)); setLayout(new BorderLayout()); setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled()); JTree tree = this.comboBox.getTree(); if (tree != null) { scrollPane = new JScrollPane(tree); scrollPane.setBorder(null); add(scrollPane, BorderLayout.CENTER); tree.addMouseListener(treeSelectListener); } } public void show() { updatePopup(); show(comboBox, 0, comboBox.getHeight()); comboBox.getTree().requestFocus(); } public void hide() { setVisible(false); comboBox.firePropertyChange("popupVisible", true, false); } protected JList list = new JList(); public JList getList() { return list; } public MouseMotionListener getMouseMotionListener() { if (mouseMotionListener == null) { mouseMotionListener = new MouseMotionAdapter() { }; } return mouseMotionListener; } public KeyListener getKeyListener() { return null; } public void uninstallingUI() { } /** * Implementation of ComboPopup.getMouseListener(). * * @return aMouseListener
or null
* @see ComboPopup#getMouseListener
*/
public MouseListener getMouseListener() {
if (mouseListener == null) {
mouseListener = new InvocationMouseHandler();
}
return mouseListener;
}
protected void togglePopup() {
if (isVisible()) {
hide();
} else {
show();
}
}
protected void updatePopup() {
setPreferredSize(new Dimension(comboBox.getSize().width, 200));
Object selectedObj = comboBox.getSelectedItem();
if (selectedObj != null) {
TreePath tp = (TreePath) selectedObj;
((DownTheTree) comboBox).getTree().setSelectionPath(tp);
}
}
protected class InvocationMouseHandler extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()) {
return;
}
if (comboBox.isEditable()) {
Component comp = comboBox.getEditor().getEditorComponent();
if ((!(comp instanceof JComponent))
|| ((JComponent) comp).isRequestFocusEnabled()) {
comp.requestFocus();
}
} else if (comboBox.isRequestFocusEnabled()) {
comboBox.requestFocus();
}
togglePopup();
}
}
}