我有点头疼。也许你们中的一些人以前经历过这种情况,可以告诉我另一种方式,甚至可以告诉我这里的错误。
我需要在 JComboBox 中添加一个 JTree,下面的代码非常有用。
public class HierarchyComboBox extends JComboBox {
HierarchyTree ht = new HierarchyTree();
HierarchyComboBox box;
JPopupMenu popup;
MouseAdapter adapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
if (arg0.getClickCount() == 1) {
removeAllItems();
addItem(ht.getSelectedLevel());
// ((JPopupMenu) comp).setVisible(false);
}
}
};
PopupMenuListener listener = new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
if (box == null) {
box = (HierarchyComboBox) e.getSource();
if (popup == null) {
final Object comp = box.getUI().getAccessibleChild(box, 0);
if (!(comp instanceof JPopupMenu))
return;
popup = (JPopupMenu) comp;
}
popup.removeAll();
ht.getTreePane().setBorder(null);
ht.getTreePane().setPreferredSize(new Dimension(box.getWidth(), 200));
MyTree tree = (MyTree)ht.getTreePane().getViewport().getComponent(0);
tree.addMouseListener(adapter);
popup.add(ht.getTreePane());
}
}
@Override
public void popupMenuCanceled(PopupMenuEvent arg0) { }
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) { }
};
public HierarchyComboBox() {
setEditable(true);
addPopupMenuListener(listener);
}
}
但我将此组件添加到 2 个不同的对话框中。
我可以单击第一个并将选择添加到 JComboBox
第二个,执行完全相同的实例化和相同的测试
该组件具有不同的行为:
- JPopupMenu 消失
- 它不会将选择添加到组合
有什么想法吗?
提前致谢..
最佳答案
如图Providing a Custom Renderer , "组合框使用渲染器来显示其菜单中的每个项目。"您可以在自定义 ListCellRenderer
中渲染树。或者,
响应
ActionListener
,在相邻组件中渲染树。使用分层模型,显示 here .
关于java - 自定义 JComboBox 隐藏 JPopupMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17471789/