`
阅读更多
 
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->  1 //////////////////////////////////////////////////////////////////////////////////
  2 //
  3 // title : TestJTreeComboBox.java
  4 //
  5 // Description : 树型下拉框
  6 //
  7 // authot : java&he
  8 //
  9 // date : 2006 -10
 10 //
 11 /////////////////////////////////////////////////////////////////////////////////
 12 import java.awt.*;
 13 import java.awt.event.*;
 14 import javax.swing.*;
 15 import javax.swing.plaf.*;
 16 import javax.swing.plaf.basic.*;
 17 import javax.swing.plaf.metal.*;
 18 import javax.swing.tree.*;
 19 
 20 import com.sun.java.swing.plaf.motif.*;
 21 import com.sun.java.swing.plaf.windows.*;
 22 
 23 /**
 24  * <p>Title: OpenSwing</p>
 25  * <p>Description: 树形下拉列表框</p>
 26  * <p>Copyright: Copyright (c) 2004</p>
 27  * <p>Company: </p>
 28  * @author  <a href="mailto:rockis@msn.com">zhanglei</a>
 29  *  && <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
 30  * @version 1.0
 31  */
 32 public class TestJTreeComboBox extends JComboBox
 33 {
 34     /**
 35      * 显示用的树
 36      */
 37     private JTree tree;
 38     
 39     public TestJTreeComboBox ()
 40     {
 41         this (new JTree ());
 42     }
 43     
 44     public TestJTreeComboBox (JTree tree)
 45     {
 46         
 47         this.setTree (tree);
 48     }
 49     
 50     /**
 51      * 设置树
 52      * @param tree JTree
 53      */
 54     public void setTree (JTree tree)
 55     {
 56         this.tree = tree;
 57         if(tree != null)
 58         {
 59             this.setSelectedItem (tree.getSelectionPath ());
 60             this.setRenderer (new JTreeComboBoxRenderer ());
 61         }
 62         this.updateUI ();
 63     }
 64     
 65     /**
 66      * 取得树
 67      * @return JTree
 68      */
 69     public JTree getTree ()
 70     {
 71         return tree;
 72     }
 73     
 74     /**
 75      * 设置当前选择的树路径
 76      * @param o Object
 77      */
 78     public void setSelectedItem (Object o)
 79     {
 80         tree.setSelectionPath ((TreePath)o);
 81         getModel ().setSelectedItem (o);
 82     }
 83     
 84     public void updateUI ()
 85     {
 86         ComboBoxUI cui = (ComboBoxUI)UIManager.getUI (this);
 87         if(cui instanceof MetalComboBoxUI)
 88         {
 89             cui = new MetalJTreeComboBoxUI ();
 90         }
 91         else if(cui instanceof MotifComboBoxUI)
 92         {
 93             cui = new MotifJTreeComboBoxUI ();
 94         }
 95         else
 96         {
 97             cui = new WindowsJTreeComboBoxUI ();
 98         }
 99         setUI (cui);
100     }
101     
102     // UI Inner classes -- one for each supported Look and Feel
103     class MetalJTreeComboBoxUI extends MetalComboBoxUI
104     {
105         protected ComboPopup createPopup ()
106         {
107             return new TreePopup (comboBox);
108         }
109     }
110     
111     class WindowsJTreeComboBoxUI extends WindowsComboBoxUI
112     {
113         protected ComboPopup createPopup ()
114         {
115             return new TreePopup (comboBox);
116         }
117     }
118     
119     class MotifJTreeComboBoxUI extends MotifComboBoxUI
120     {
121         protected ComboPopup createPopup ()
122         {
123             return new TreePopup (comboBox);
124         }
125     }
126     /**
127      * <p>Title: OpenSwing</p>
128      * <p>Description: 树形结构而来的DefaultListCellRenderer </p>
129      * <p>Copyright: Copyright (c) 2004</p>
130      * <p>Company: </p>
131      * @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
132      * @version 1.0
133      */
134     class JTreeComboBoxRenderer extends DefaultListCellRenderer
135     {
136         public Component getListCellRendererComponent (JList list, Object value,
137                 int index, boolean isSelected, boolean cellHasFocus)
138         {
139             if(value != null)
140             {
141                 TreePath path = (TreePath)value;
142                 TreeNode node = (TreeNode)path.getLastPathComponent ();
143                 value = node;
144                 TreeCellRenderer r = tree.getCellRenderer ();
145                 JLabel lb = (JLabel)r.getTreeCellRendererComponent (
146                         tree, value, isSelected, false, node.isLeaf (), index,
147                         cellHasFocus);
148                 return lb;
149             }
150             return super.getListCellRendererComponent (list, value, index,
151                     isSelected, cellHasFocus);
152         }
153     }
154     
155     /**
156      * 测试
157      */
158     public static void main (String args[])
159     {
160         JFrame frame = new JFrame ("JTreeComboBox Demo");
161         frame.getContentPane ().setLayout (new FlowLayout ());
162         
163         TestJTreeComboBox box = new TestJTreeComboBox (new JTree ());
164         // box.setEditable(true);
165         
166         box.setPreferredSize (new Dimension (30021));
167         frame.getContentPane ().add (box);
168         //  final JButton btt = new JButton("Set As JFileTree");
169         // btt.addActionListener(new ActionListener(){
170         //  public void actionPerformed(ActionEvent e){
171         //      box.setTree(new JFileTree());
172         //     btt.setEnabled(false);
173         //   }
174         //   });
175         //   frame.getContentPane().add(btt);
176         frame.setVisible (true);
177         frame.setDefaultCloseOperation (3);
178     }
179 }
180 
181 /**
182  * <p>Title: JTreeComboBox</p>
183  * <p>Description: TreePopup</p>
184  * <p>Copyright: Copyright (c) 2004</p>
185  * <p>Company: </p>
186  * @author  <a href="mailto:rockis@msn.com">zhanglei</a>
187  *  && <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
188  * @version 1.0
189  */
190 class TreePopup extends JPopupMenu implements ComboPopup
191 {
192     protected TestJTreeComboBox comboBox;
193     protected JScrollPane scrollPane;
194     
195     protected MouseMotionListener mouseMotionListener;
196     protected MouseListener mouseListener;
197     private MouseListener treeSelectListener = new MouseAdapter ()
198     {
199         
200         public void mouseReleased (MouseEvent e)
201         {
202             JTree tree = (JTree)e.getSource ();
203             TreePath tp = tree.getPathForLocation (e.getPoint ().x,
204                     e.getPoint ().y);
205             if(tp == null)
206             {
207                 return;
208             }
209             comboBox.setSelectedItem (tp);
210             togglePopup ();
211             MenuSelectionManager.defaultManager ().clearSelectedPath ();
212         }
213     };
214     
215     public TreePopup (JComboBox comboBox)
216     {
217         this.comboBox = (TestJTreeComboBox)comboBox;
218         setBorder (BorderFactory.createLineBorder (Color.black));
219         setLayout (new BorderLayout ());
220         setLightWeightPopupEnabled (comboBox.isLightWeightPopupEnabled ());
221         JTree tree = this.comboBox.getTree ();
222         if(tree != null)
223         {
224             scrollPane = new JScrollPane (tree);
225             scrollPane.setBorder (null);
226             add (scrollPane, BorderLayout.CENTER);
227             tree.addMouseListener (treeSelectListener);
228         }
229     }
230     
231     public void show ()
232     {
233         updatePopup ();
234         show (comboBox, 0, comboBox.getHeight ());
235         comboBox.getTree ().requestFocus ();
236     }
237     
238     public void hide ()
239     {
240         setVisible (false);
241         comboBox.firePropertyChange ("popupVisible"truefalse);
242     }
243     
244     protected JList list = new JList ();
245     public JList getList ()
246     {
247         return list;
248     }
249     
250     public MouseMotionListener getMouseMotionListener ()
251     {
252         if(mouseMotionListener == null)
253         {
254             mouseMotionListener = new MouseMotionAdapter ()
255             {};
256         }
257         return mouseMotionListener;
258     }
259     
260     public KeyListener getKeyListener ()
261     {
262         return null;
263     }
264     
265     public void uninstallingUI ()
266     {}
267     
268     /**
269      * Implementation of ComboPopup.getMouseListener().
270      *
271      * @return a <code>MouseListener</code> or null
272      * @see ComboPopup#getMouseListener
273      */
274     public MouseListener getMouseListener ()
275     {
276         if(mouseListener == null)
277         {
278             mouseListener = new InvocationMouseHandler ();
279         }
280         return mouseListener;
281     }
282     
283     protected void togglePopup ()
284     {
285         if(isVisible ())
286         {
287             hide ();
288         }
289         else
290         {
291             show ();
292         }
293     }
294     
295     protected void updatePopup ()
296     {
297         setPreferredSize (new Dimension (comboBox.getSize ().width, 200));
298         Object selectedObj = comboBox.getSelectedItem ();
299         if(selectedObj != null)
300         {
301             TreePath tp = (TreePath)selectedObj;
302             ((TestJTreeComboBox)comboBox).getTree ().setSelectionPath (tp);
303         }
304     }
305     
306     protected class InvocationMouseHandler extends MouseAdapter
307     {
308         public void mousePressed (MouseEvent e)
309         {
310             if(!SwingUtilities.isLeftMouseButton (e) || !comboBox.isEnabled ())
311             {
312                 return;
313             }
314             if(comboBox.isEditable ())
315             {
316                 Component comp = comboBox.getEditor ().getEditorComponent ();
317                 if((!(comp instanceof JComponent)) ||
318                         ((JComponent)comp).isRequestFocusEnabled ())
319                 {
320                     comp.requestFocus ();
321                 }
322             }
323             else if(comboBox.isRequestFocusEnabled ())
324             {
325                 comboBox.requestFocus ();
326             }
327             togglePopup ();
分享到:
评论

相关推荐

    asp.net 树型下拉框 (用户自定义控件)

    在ASP.NET中,树型下拉框是一种复合控件,它结合了树形视图(TreeView)和下拉列表(DropDownList)的功能,为用户提供了一种更直观、更丰富的交互方式来选择数据。这种控件通常用于显示层级结构的数据,如组织结构...

    javascript实现的树型下拉框改进版

    1. 树型下拉框的概念:树型下拉框是一种用户界面控件,用于展示层级结构数据。当用户操作时,它以树状结构展开,允许用户选择特定的节点或项。这种界面通常用于组织层次数据,如文件系统目录、公司组织架构、地理...

    Element input树型下拉框的实现代码

    其中,Element input树型下拉框是一种常用的表单元素,用于在用户进行选择时提供具有层级关系的数据选项。本文将详细介绍如何在使用Element UI和Vue.js的情况下,实现Element input树型下拉框的功能。 ### 树型...

    bootstrap树形下拉框 下拉框树形菜单

    Bootstrap Tree形下拉框是一种将传统的下拉菜单与树形结构结合的UI组件,它使得在有限的空间内展示层级关系的数据变得更加直观和易用。在Web开发中,Bootstrap框架提供了丰富的样式和组件,大大简化了网页设计的工作...

    JS 下拉框树型控件.rar

    2. **JavaScript 事件监听**:通过JavaScript,我们需要监听图标或文本框的点击事件,当用户点击图标时,树型下拉框应该显现。这可以通过`addEventListener`函数实现,绑定`click`事件并调用相应的处理函数。 3. **...

    ext js 下拉树

    Ext JS 是一个强大的JavaScript库,专门用于构建富客户端应用程序。在Web开发中,它提供了丰富的组件库,包括各种用户界面元素,如表格、面板、窗口、菜单等。下拉树(Dropdown Tree)是Ext JS中的一种特殊控件,它...

    C#编写的一个带树型结构的下拉框控件

    在传统的下拉框(ComboBox)中,用户只能看到一个单一的列表,而“带树型结构的下拉框控件”则允许用户在展开控件时看到一个层次结构,这特别适用于表示具有分层关系的数据,如组织结构、文件系统或者分类目录。...

    Extjs中ComboBoxTree实现的下拉框树效果(自写)

    在案例中,`Ext.ux.TreeCombo` 是基于 `Ext.form.ComboBox` 进行扩展的,目的是实现一个包含树形结构的下拉框。 2. **Ext.ux.TreeCombo**: 这是一个自定义组件,它结合了ComboBox和TreePanel的特性。它继承了...

    bootstrap树形下拉框 下拉框树形菜单(花了一小时修改过的)

    这个组件是基于流行的前端框架Bootstrap和JavaScript库构建的,使得在网页设计中实现树形下拉框变得简单高效。 在Bootstrap中,树形下拉框主要依赖于`bootstrap-treeview.js`这个JavaScript插件,它扩展了Bootstrap...

    layui组件之树形下拉框

    "layui组件之树形下拉框"是Layui框架中的一个重要组件,用于在下拉菜单中展示层级结构的数据,常用于选择组织结构、地区分类等具有树状关系的场景。 ### layui组件简介 Layui是一个轻量级的前端框架,它包含了基础...

    bootstrap select树形下拉框

    要使用Bootstrap Select树形下拉框,首先确保已经引入了Bootstrap和Bootstrap Select的CSS和JavaScript文件。这些文件可以从Bootstrap官网或者CDN获取。同时,可能还需要引入一个专门处理树形结构的库,如jQuery ...

    WPF 下拉框树状通用控件

    在Windows Presentation Foundation(WPF)框架中,下拉框树状控件是一种常见的UI元素,它结合了下拉框和树视图的功能,允许用户在有限的空间内展示层级结构的数据。这种控件在多种场景下都非常有用,比如在选择组织...

    zTree实现多选下拉框

    在IT行业中,构建用户友好的交互界面是至关重要的,而下拉框作为常见的表单元素,经常被用于数据选择和过滤。"zTree实现多选下拉框"这个主题聚焦于如何利用zTree这款JavaScript库来创建一个支持多选功能的下拉框控件...

    树型框内容转到组合框

    "组合框"(ComboBox),又称为下拉框,它结合了文本框和列表框的功能。用户可以在文本框中直接输入,也可以从下拉列表中选择。在Windows API或易语言中,组合框通常用在需要用户从预定义选项中选择一个或多个值的...

    JSP自定义标签(一)_树形下拉选择菜单

    ### JSP自定义标签——树形下拉选择菜单解析 #### 一、概念与应用场景 在JSP(Java Server Pages)开发中,自定义标签是一种非常实用的技术,它允许开发者创建可重用的代码组件,简化JSP页面的编写工作。...

Global site tag (gtag.js) - Google Analytics