<!--<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 (300, 21));
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", true, false);
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中,树型下拉框是一种复合控件,它结合了树形视图(TreeView)和下拉列表(DropDownList)的功能,为用户提供了一种更直观、更丰富的交互方式来选择数据。这种控件通常用于显示层级结构的数据,如组织结构...
1. 树型下拉框的概念:树型下拉框是一种用户界面控件,用于展示层级结构数据。当用户操作时,它以树状结构展开,允许用户选择特定的节点或项。这种界面通常用于组织层次数据,如文件系统目录、公司组织架构、地理...
其中,Element input树型下拉框是一种常用的表单元素,用于在用户进行选择时提供具有层级关系的数据选项。本文将详细介绍如何在使用Element UI和Vue.js的情况下,实现Element input树型下拉框的功能。 ### 树型...
Bootstrap Tree形下拉框是一种将传统的下拉菜单与树形结构结合的UI组件,它使得在有限的空间内展示层级关系的数据变得更加直观和易用。在Web开发中,Bootstrap框架提供了丰富的样式和组件,大大简化了网页设计的工作...
2. **JavaScript 事件监听**:通过JavaScript,我们需要监听图标或文本框的点击事件,当用户点击图标时,树型下拉框应该显现。这可以通过`addEventListener`函数实现,绑定`click`事件并调用相应的处理函数。 3. **...
Ext JS 是一个强大的JavaScript库,专门用于构建富客户端应用程序。在Web开发中,它提供了丰富的组件库,包括各种用户界面元素,如表格、面板、窗口、菜单等。下拉树(Dropdown Tree)是Ext JS中的一种特殊控件,它...
在传统的下拉框(ComboBox)中,用户只能看到一个单一的列表,而“带树型结构的下拉框控件”则允许用户在展开控件时看到一个层次结构,这特别适用于表示具有分层关系的数据,如组织结构、文件系统或者分类目录。...
在案例中,`Ext.ux.TreeCombo` 是基于 `Ext.form.ComboBox` 进行扩展的,目的是实现一个包含树形结构的下拉框。 2. **Ext.ux.TreeCombo**: 这是一个自定义组件,它结合了ComboBox和TreePanel的特性。它继承了...
这个组件是基于流行的前端框架Bootstrap和JavaScript库构建的,使得在网页设计中实现树形下拉框变得简单高效。 在Bootstrap中,树形下拉框主要依赖于`bootstrap-treeview.js`这个JavaScript插件,它扩展了Bootstrap...
"layui组件之树形下拉框"是Layui框架中的一个重要组件,用于在下拉菜单中展示层级结构的数据,常用于选择组织结构、地区分类等具有树状关系的场景。 ### layui组件简介 Layui是一个轻量级的前端框架,它包含了基础...
要使用Bootstrap Select树形下拉框,首先确保已经引入了Bootstrap和Bootstrap Select的CSS和JavaScript文件。这些文件可以从Bootstrap官网或者CDN获取。同时,可能还需要引入一个专门处理树形结构的库,如jQuery ...
在Windows Presentation Foundation(WPF)框架中,下拉框树状控件是一种常见的UI元素,它结合了下拉框和树视图的功能,允许用户在有限的空间内展示层级结构的数据。这种控件在多种场景下都非常有用,比如在选择组织...
在IT行业中,构建用户友好的交互界面是至关重要的,而下拉框作为常见的表单元素,经常被用于数据选择和过滤。"zTree实现多选下拉框"这个主题聚焦于如何利用zTree这款JavaScript库来创建一个支持多选功能的下拉框控件...
"组合框"(ComboBox),又称为下拉框,它结合了文本框和列表框的功能。用户可以在文本框中直接输入,也可以从下拉列表中选择。在Windows API或易语言中,组合框通常用在需要用户从预定义选项中选择一个或多个值的...
### JSP自定义标签——树形下拉选择菜单解析 #### 一、概念与应用场景 在JSP(Java Server Pages)开发中,自定义标签是一种非常实用的技术,它允许开发者创建可重用的代码组件,简化JSP页面的编写工作。...