📄 cascadecombobox.java
字号:
package com;
/*
* 文件名: CascadeComboBox.java
* 描述信息:
* 作者: 张磊(rockis@msn.com)
* 创建时间: 2004-8-12
* 修改纪录: $Id: CascadeComboBox.java,v 1.6 2004/08/30 06:27:19 zhanglei Exp $
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
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 java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ListCellRenderer;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.BasicMenuItemUI;
import javax.swing.plaf.basic.ComboPopup;
import javax.swing.plaf.metal.MetalComboBoxUI;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import com.sun.java.swing.plaf.motif.MotifComboBoxUI;
import com.sun.java.swing.plaf.windows.WindowsComboBoxUI;
/**
*
*/
public class CascadeComboBox extends JComboBox
{
TreeModel treeModel = null;
TreeCellRenderer cellRenderer = new DefaultTreeCellRenderer();
boolean showPathOnSelected = false;
HashMap nodesMap = new HashMap();
public CascadeComboBox()
{
this(new DefaultTreeModel(new DefaultMutableTreeNode("Test")));
}
public CascadeComboBox(TreeModel treeModel)
{
setTreeModel(treeModel);
JTextField textField = ((JTextField)this.getEditor().getEditorComponent());
textField.addKeyListener(new KeyAdapter(){
public void keyReleased(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_ENTER){
}
}
});
}
public void setTreeModel(TreeModel treeModel)
{
TreeModel oldModel = this.treeModel;
this.treeModel = treeModel;
firePropertyChange("treeModel", oldModel, this.treeModel);
setModel(new DefaultComboBoxModel());
if (treeModel != null)
{
Object root = treeModel.getRoot();
saveComboBoxData(root);
}
}
public void showPathOnSelected(boolean b)
{
boolean oldValue = showPathOnSelected;
this.showPathOnSelected = b;
firePropertyChange("showPathOnSelected", new Boolean(oldValue), new Boolean(b));
}
private void saveComboBoxData(Object node)
{
((DefaultComboBoxModel)getModel()).addElement(node);
Object uobj = node;
if (node instanceof DefaultMutableTreeNode)
{
uobj = ((DefaultMutableTreeNode)node).getUserObject();
}
nodesMap.put(uobj, node);
if (!treeModel.isLeaf(node))
{
for (int i = 0; i < treeModel.getChildCount(node); i++)
{
Object child = treeModel.getChild(node, i);
saveComboBoxData(child);
}
}
}
public Object getSelectedObject()
{
Object obj = getSelectedItem();
return nodeToObject(obj);
}
private Object nodeToObject(Object node)
{
if (node instanceof DefaultMutableTreeNode)
{
return ((DefaultMutableTreeNode)node).getUserObject();
}else{
return node;
}
}
public void setSelectedItem(Object o)
{
getModel().setSelectedItem(o);
}
public void setSelectedObject(Object node)
{
Object o = nodesMap.get(node);
getModel().setSelectedItem(o);
}
protected void selectedItemChanged() {
Object oldItem = selectedItemReminder;
super.selectedItemChanged();
Object newItem = selectedItemReminder;
firePropertyChange("itemChange", nodeToObject(oldItem), nodeToObject(newItem));
}
public void setCellRenderer(TreeCellRenderer x)
{
TreeCellRenderer oldRenderer = cellRenderer;
this.cellRenderer = x;
firePropertyChange("cellRenderer", oldRenderer, cellRenderer);
}
public TreeCellRenderer getCellRenderer()
{
return this.cellRenderer;
}
public TreeModel getTreeModel()
{
return this.treeModel;
}
public void updateUI(){
ComboBoxUI cui = (ComboBoxUI)UIManager.getUI(this);
if(cui instanceof MetalComboBoxUI){
cui = new MetalCascadeComboBoxUI();
} else if(cui instanceof MotifComboBoxUI){
cui = new MotifCascadeComboBoxUI();
} else if(cui instanceof WindowsComboBoxUI){
cui = new WindowsCascadeComboBoxUI();
}
setUI(cui);
}
interface TreePopupComboBoxUI
{
TreePopup getTreePopup();
}
// UI Inner classes -- one for each supported Look and Feel
class MetalCascadeComboBoxUI extends MetalComboBoxUI implements TreePopupComboBoxUI{
TreePopup treePopup = new TreePopup(CascadeComboBox.this);
protected ComboPopup createPopup(){
CascadeComboBox.this.addPropertyChangeListener(treePopup);
return treePopup;
}
protected ListCellRenderer createRenderer()
{
return new CascadeComboBoxRenderer();
}
public TreePopup getTreePopup()
{
return treePopup;
}
}
class WindowsCascadeComboBoxUI extends WindowsComboBoxUI implements TreePopupComboBoxUI{
TreePopup treePopup = new TreePopup(CascadeComboBox.this);
protected ComboPopup createPopup(){
CascadeComboBox.this.addPropertyChangeListener(treePopup);
return treePopup;
}
protected ListCellRenderer createRenderer()
{
return new CascadeComboBoxRenderer();
}
public TreePopup getTreePopup()
{
return treePopup;
}
}
class MotifCascadeComboBoxUI extends MotifComboBoxUI implements TreePopupComboBoxUI{
TreePopup treePopup = new TreePopup(CascadeComboBox.this);
protected ComboPopup createPopup(){
CascadeComboBox.this.addPropertyChangeListener(treePopup);
return treePopup;
}
protected ListCellRenderer createRenderer()
{
return new CascadeComboBoxRenderer();
}
public TreePopup getTreePopup()
{
return treePopup;
}
}
class CascadeComboBoxRenderer extends DefaultListCellRenderer
{
String SEPARATOR = "/";
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
CascadeComboBox comboBox = CascadeComboBox.this;
JLabel lb = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value == null)
{
comboBox.setToolTipText(null);
return lb;
}
ComboBoxUI ui = comboBox.getUI();
if (ui instanceof TreePopupComboBoxUI)
{
TreePopupComboBoxUI tui = (TreePopupComboBoxUI)ui;
JTree tree = tui.getTreePopup().getTree();
boolean isLeaf = tree.getModel().isLeaf(value);
JLabel r = (JLabel)cellRenderer.getTreeCellRendererComponent(tui.getTreePopup().getTree()
, value, false, true, isLeaf, 0, false);
lb.setIcon(r.getIcon());
lb.setEnabled(comboBox.isEnabled());
String label = getText((TreeNode)value);
lb.setText(label);
comboBox.setToolTipText(label);
}
return lb;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -