现在有一个问题很疑惑,JTree在JDK1.5下和JDK1.6下显示都不是很满意,如下图:是在1.5下的效果:JTree是放在一个下拉框中的,现在的问题是这个JTree的高度必须要大于界面的高度才能选中,否则的话选中之后,那个JTree就会跑掉。
如下图:是在JDK1.6下的效果:在1.6下,根本就没有树结构了,都变成下拉选项了。我现在都不知道从哪下手,不知道为什么会这样?大家伙给我出出主意。先谢谢大家了。
如下图:是在JDK1.6下的效果:在1.6下,根本就没有树结构了,都变成下拉选项了。我现在都不知道从哪下手,不知道为什么会这样?大家伙给我出出主意。先谢谢大家了。
而在JDK1.6中,就不是树形结构了,变成下拉选项了。
我写了一个继承JComboBox的类。
private class ComponentHandler extends ComponentAdapter {
public void componentMoved(ComponentEvent e) {
initPopup(e);
} public void componentResized(ComponentEvent e) {
initPopup(e);
} public void componentShown(ComponentEvent e) {
initPopup(e);
} private void initPopup(ComponentEvent e) {
if (_popup != null && _popupComp != null
&& _popup.isAncestorOf(_popupComp)) {
return;
} Component comp = e.getComponent();
while ((comp = comp.getParent()) != null) {
if (comp instanceof JPopupMenu) {
break;
}
}
if (!(comp instanceof JPopupMenu)) {
return;
} _popup = (JPopupMenu) comp;
if (_popupComp != null) {
_popup.removeAll();
JScrollPane spn = new JScrollPane(_popupComp) {
public Insets getInsets() {
return new Insets(5, 5, 5, 5);
}
}; if (_popupSize != null) {
spn.setPreferredSize(_popupSize);
}
else {
Dimension size = _popupComp.getPreferredSize();
if (size.getHeight() < 180) {
Dimension screenSize = Toolkit.getDefaultToolkit().
getScreenSize();
Point point = _popup.getLocationOnScreen();
if (point.y > screenSize.getHeight() / 2) {
spn.setPreferredSize(new Dimension(getWidth(),
screenSize.height - point.y - 50));
}
else {
spn.setPreferredSize(new Dimension(getWidth(),
screenSize.height / 2));
}
}
else {
spn.setPreferredSize(new Dimension(getWidth(),
size.height));
}
}
_popup.add(spn);
_popup.revalidate();
_popup.repaint(); spn.addMouseListener(_dragginHandler);
spn.addMouseMotionListener(_dragginHandler);
}
}
}我觉得主要应该是这一段,我想把代码全部贴出来,可以贴不了,代码太长了。gentalguo, 我能加您QQ,或者发您邮箱里边吗?
或者您加我也行,谢谢了。我的QQ:395751870
private Vector _data = new Vector();
private boolean _eventEnabled = true;
private JPopupMenu _popup;
private Component _popupComp;
private Dimension _popupSize; private ComponentHandler _componentHandler;
private MouseHandler _mouseHandler;
private DraggingHandler _dragginHandler;
private JList _popupList; public MyComboBox() {
setEditable(true);
setAutoscrolls(true);
setRenderer(new Renderer(this)); Component re = getRenderer().getListCellRendererComponent(getPopupList(),
null, -1, false, false);
_componentHandler = new ComponentHandler();
re.addComponentListener(_componentHandler); _mouseHandler = new MouseHandler();
_dragginHandler = new DraggingHandler();
} public void setPopupComponent(Component comp) {
if (!ObjectUtil.equals(comp, _popupComp)) {
if (_popupComp != null) {
_popupComp.removeMouseListener(_mouseHandler);
_popupComp.removeMouseListener(_dragginHandler);
_popupComp.removeMouseMotionListener(_dragginHandler);
} _popupComp = comp;
if (_popupComp != null) {
_popupComp.addMouseListener(_mouseHandler);
_popupComp.addMouseListener(_dragginHandler);
_popupComp.addMouseMotionListener(_dragginHandler);
}
}
convertPopupDataToComboBox();
} public Component getPopupComponent() {
return _popupComp;
} public void convertPopupDataToComboBox() {
AbstractListModel amodel = (AbstractListModel) getModel();
ListDataListener[] lListener = amodel.getListDataListeners();
if (lListener != null) {
for (int i = 0, length = lListener.length; i < length; i++) {
amodel.removeListDataListener(lListener[i]);
}
}
ActionListener[] aListener = getActionListeners();
if (aListener != null) {
for (int i = 0, length = aListener.length; i < length; i++) {
removeActionListener(aListener[i]);
}
}
ItemListener[] iListener = getItemListeners();
if (iListener != null) {
for (int i = 0, length = iListener.length; i < length; i++) {
removeItemListener(iListener[i]);
}
}
PopupMenuListener[] pListener = getPopupMenuListeners();
if (pListener != null) {
for (int i = 0, length = pListener.length; i < length; i++) {
removePopupMenuListener(pListener[i]);
}
} removeAllItems();
if (_popupComp instanceof JTree) {
JTree tree = (JTree) _popupComp;
//将树里面的数据添加到
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) model.getRoot();
if (node != null) {
addItem(node);
while ((node = (DefaultMutableTreeNode) node.getNextNode()) != null) {
addItem(node);
}
}
}
setSelectedItem(null); if (lListener != null) {
for (int i = lListener.length - 1; i >= 0; i--) {
amodel.addListDataListener(lListener[i]);
}
}
if (aListener != null) {
for (int i = aListener.length - 1; i >= 0; i--) {
addActionListener(aListener[i]);
}
}
if (iListener != null) {
for (int i = iListener.length - 1; i >= 0; i--) {
addItemListener(iListener[i]);
}
}
if (pListener != null) {
for (int i = pListener.length - 1; i >= 0; i--) {
addPopupMenuListener(pListener[i]);
}
}
} public void setRenderer(ListCellRenderer renderer) {
if (!ObjectUtil.equals(renderer, getRenderer())) {
Component comp;
if (getRenderer() != null) {
comp = getRenderer().getListCellRendererComponent(getPopupList(),
null, -1, false, false);
if (comp != null) {
comp.removeComponentListener(_componentHandler);
}
}
super.setRenderer(renderer); comp = getRenderer().getListCellRendererComponent(getPopupList(),
null, -1, false, false);
if (comp != null) {
comp.addComponentListener(_componentHandler);
}
}
} public void addItem(Object object) {
_data.add(object);
super.addItem(object);
} public void insertItemAt(Object object, int index) {
_data.insertElementAt(object, index);
super.insertItemAt(object, index);
} public void removeItem(Object anObject) {
_data.remove(anObject);
super.removeItem(anObject);
} public void removeItemAt(int anIndex) {
_data.removeElementAt(anIndex);
super.removeItemAt(anIndex);
} public void removeAllItems() {
_data.removeAllElements();
super.removeAllItems();
} public void setSelectedItem(Object anItem) {
if (anItem != null && !_data.contains(anItem)) {
super.setSelectedItem(null);
}
else {
super.setSelectedItem(anItem);
}
initTextField(anItem); /**
* 当_popupComp为MultiTree时, 在弹出弹出菜单时, 选中当前树选中的节点
*/
if (_popupComp instanceof JTree) {
Object sel = getSelectedItem();
JTree tree = (JTree) _popupComp;
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
DefaultMutableTreeNode node = null;
if (sel != null) {
model.getRoot();
// node = model.getNode(sel);
}
if (node == null) {
node = (DefaultMutableTreeNode) model.getRoot();
}
if (node != null) {
tree.setSelectionPath(new TreePath(node.getPath()));
tree.scrollPathToVisible(new TreePath(node.getPath()));
}
}
} public JTextField getTextField() {
return (JTextField)super.getEditor().getEditorComponent();
} private void initTextField(Object anItem) {
if (anItem == null) {
if (isEditable()) {
_eventEnabled = false;
getTextField().setText("");
_eventEnabled = true;
}
}
else if (anItem != null && isEditable()) {
String value = "";
// String value = getValue(anItem);
_eventEnabled = false;
if (value != null) {
getTextField().setText(value);
}
else {
getTextField().setText("");
}
_eventEnabled = true;
}
} public Vector getDataVector() {
return _data;
} protected void selectedItemChanged() {
if (_eventEnabled) {
if (selectedItemReminder != null) {
fireItemStateChanged(new ItemEvent(this,
ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.DESELECTED));
} // set the new selected item.
selectedItemReminder = dataModel.getSelectedItem();
fireItemStateChanged(new ItemEvent(this,
ItemEvent.ITEM_STATE_CHANGED,
selectedItemReminder,
ItemEvent.SELECTED));
}
} protected void fireActionEvent() {
if (_eventEnabled) {
super.fireActionEvent();
}
} public JList getPopupList() {
if (_popupList == null) {
Accessible a = getUI().getAccessibleChild(MyComboBox.this, 0);
if (a instanceof javax.swing.plaf.basic.ComboPopup) {
_popupList = ((javax.swing.plaf.basic.ComboPopup) a).
getList();
}
}
return _popupList;
}
public void componentMoved(ComponentEvent e) {
initPopup(e);
} public void componentResized(ComponentEvent e) {
initPopup(e);
} public void componentShown(ComponentEvent e) {
initPopup(e);
} private void initPopup(ComponentEvent e) {
if (_popup != null && _popupComp != null
&& _popup.isAncestorOf(_popupComp)) {
return;
} Component comp = e.getComponent();
while ((comp = comp.getParent()) != null) {
if (comp instanceof JPopupMenu) {
break;
}
}
if (!(comp instanceof JPopupMenu)) {
return;
} _popup = (JPopupMenu) comp;
if (_popupComp != null) {
_popup.removeAll();
JScrollPane spn = new JScrollPane(_popupComp) {
public Insets getInsets() {
return new Insets(5, 5, 5, 5);
}
}; if (_popupSize != null) {
spn.setPreferredSize(_popupSize);
}
else {
Dimension size = _popupComp.getPreferredSize();
if (size.getHeight() < 180) {
Dimension screenSize = Toolkit.getDefaultToolkit().
getScreenSize();
Point point = _popup.getLocationOnScreen();
if (point.y > screenSize.getHeight() / 2) {
spn.setPreferredSize(new Dimension(getWidth(),
screenSize.height - point.y - 50));
}
else {
spn.setPreferredSize(new Dimension(getWidth(),
screenSize.height / 2));
}
}
else {
spn.setPreferredSize(new Dimension(getWidth(),
size.height));
}
}
_popup.add(spn);
_popup.revalidate();
_popup.repaint(); spn.addMouseListener(_dragginHandler);
spn.addMouseMotionListener(_dragginHandler);
}
}
} private class MouseHandler extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.getClickCount() > 1) {
if (_popupComp instanceof JTree
&& ((JTree) _popupComp).getPathForLocation(e.getX(),
e.getY()) != null) {
TreePath path = ((JTree) _popupComp).getSelectionPath();
if (path == null) {
return;
}
MultiTreeNode node = (MultiTreeNode) path.
getLastPathComponent();
if (node == null) {
return;
}
if (!node.isLeaf() &&
((JTree) _popupComp).isCollapsed(path)) {
return;
} DTOTreeModel model = (DTOTreeModel) (((JTree)
_popupComp).getModel());
Object object = model.getObject(node);
if (object != null) {
setSelectedItem(object);
}
_popup.setVisible(false);
requestFocus();
}
}
}
}
SwingConstants {
protected final int RESIZE_NONE = 0;
private int _x, _y;
private int _resizeDir;
private int _space = 7;
private Dimension _screenSize = Toolkit.getDefaultToolkit().
getScreenSize();
private void dragging(int newX, int newY) {
if (_popup == null) {
return;
}
Point location = _popup.getLocationOnScreen();
Dimension oldSize = _popup.getPreferredSize();
Dimension newSize = new Dimension(oldSize.width, oldSize.height); //左上角
if (_resizeDir == NORTH_WEST) {
location.x = location.x + newX - _x;
location.y = location.y + newY - _y;
newSize.width = newSize.width - (newX - _x);
newSize.height = newSize.height - (newY - _y);
}
//左下角
else if (_resizeDir == SOUTH_WEST) {
location.x = location.x + newX - _x;
location.y = location.y + newY - _y;
newSize.width = newSize.width - (newX - _x);
newSize.height = newSize.height - (newY - _y);
}
//右下角
else if (_resizeDir == SOUTH_EAST) {
newSize.width = newSize.width + (newX - _x);
newSize.height = newSize.height + (newY - _y);
}
//右上角
else if (_resizeDir == NORTH_EAST) {
location.y = location.y + (newY - _y);
newSize.width = newSize.width + (newX - _x);
newSize.height = newSize.height - (newY - _y);
}
//左边
else if (_resizeDir == WEST) {
location.x = location.x + (newX - _x);
newSize.width = newSize.width - (newX - _x);
}
//下边
else if (_resizeDir == SOUTH) {
newSize.height = newSize.height + newY - _y;
}
//右边
else if (_resizeDir == EAST) {
newSize.width = newSize.width + newX - _x;
}
//上边
else if (_resizeDir == NORTH) {
location.y = location.y + newY - _y;
newSize.height = newSize.height - (newY - _y);
}
if (location.x < 0) {
location.x = 0;
}
if (location.y < 0) {
location.y = 0;
}
if (newSize.width + location.x > _screenSize.width) {
newSize.width = _screenSize.width - location.x;
}
if (newSize.height + location.y > _screenSize.height) {
newSize.height = _screenSize.height - location.y;
}
_popup.setLocation(location);
if (newSize.width < 50) {
newSize.width = 50;
}
if (newSize.height < 100) {
newSize.height = 100;
}
_popup.setPopupSize(newSize); _x = newX;
_y = newY;
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
if (_popup == null) {
return;
}
Point point = dispatchEvent(e);
_x = point.x;
_y = point.y;
}
public void mouseReleased(MouseEvent e) {
if (_popup == null) {
return;
}
Point point = dispatchEvent(e);
if (SwingUtilities.isLeftMouseButton(e)) {
dragging(point.x, point.y);
_resizeDir = RESIZE_NONE;
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (_popup == null) {
return;
}
if (SwingUtilities.isLeftMouseButton(e)) {
Point point = dispatchEvent(e);
dragging(point.x, point.y);
}
}
public void mouseMoved(MouseEvent e) {
if (_popup == null) {
return;
}
Point point = dispatchEvent(e);
_x = point.x;
_y = point.y;
Dimension size = _popup.getPreferredSize();
//左上角
if (_x <= _space && _y <= _space) {
_resizeDir = NORTH_WEST;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
NW_RESIZE_CURSOR));
}
//左下角
else if (_x <= _space && _y >= size.height - _space) {
_resizeDir = SOUTH_WEST;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
SW_RESIZE_CURSOR));
}
//右下角
else if (_x >= size.width - _space && _y >= size.height - _space) {
_resizeDir = SOUTH_EAST;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
SE_RESIZE_CURSOR));
}
//右上角
else if (_x >= size.width - _space && _y <= _space) {
_resizeDir = NORTH_EAST;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
NE_RESIZE_CURSOR));
}
//左边
else if (_x <= _space) {
_resizeDir = WEST;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
W_RESIZE_CURSOR));
}
//下边
else if (_y >= size.height - _space) {
_resizeDir = SOUTH;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
S_RESIZE_CURSOR));
}
//右边
else if (_x >= size.width - _space) {
_resizeDir = EAST;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
E_RESIZE_CURSOR));
}
//上边
else if (_y <= _space) {
_resizeDir = NORTH;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
N_RESIZE_CURSOR));
}
else {
_resizeDir = RESIZE_NONE;
_popup.setCursor(Cursor.getPredefinedCursor(Cursor.
DEFAULT_CURSOR));
}
}
private Point dispatchEvent(MouseEvent e) {
JComponent comp = (JComponent) e.getComponent();
int x = 0;
int y = 0;
if (e.getComponent() != _popup) {
Rectangle rec = comp.getVisibleRect();
x = e.getX() - (int) rec.getX();
y = e.getY() - (int) rec.getY();
}
else {
x = e.getX();
y = e.getY();
}
return new Point(x, y);
}
}
public static class Renderer extends DefaultListCellRenderer {
private MyComboBox _cmb;
public Renderer(MyComboBox cmb) {
_cmb = cmb;
}
public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
setComponentOrientation(list.getComponentOrientation());
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
if (value instanceof Icon) {
setIcon((Icon) value);
setText("");
}
else {
setIcon(null);
if (value instanceof IDTO) {
// value = _cmb.getValue(value);
setText((value == null) ? "" : (String) value);
}
else {
setText((value == null) ? "" : value.toString());
}
}
setEnabled(list.isEnabled());
setFont(list.getFont());
setBorder((cellHasFocus) ?
UIManager.getBorder("List.focusCellHighlightBorder") :
noFocusBorder);
return this;
}
public void setVisible(boolean b) {
super.setVisible(b);
}
}
public void setPopupVisible(boolean v) {
super.setPopupVisible(v);
}
}
调用的类为:public class JtreeComboBoxExample extends JFrame {
private JTextArea ta;
private MyComboBox tc;
private JButton btn;
public static void main(String args[]) {
new JtreeComboBoxExample();
} public JtreeComboBoxExample() {
tc = new MyComboBox();
JTree tree = (JTree) tc.getPopupComponent();
if(tree == null) {
tree = new JTree();
}
tc.setPopupComponent(tree); ta = new JTextArea();
btn = new JButton("Button");
Container c = getContentPane();
JPanel jp = new JPanel(new GridLayout(1, 2));
jp.add(tc);
jp.add(btn);
c.add(jp, "North");
c.add(ta, "Center");
this.setSize(420, 300);
this.setVisible(true);
this.setDefaultCloseOperation(3);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnAction();
}
});
} public void btnAction() {
// ta.append("\nYou got " + tc.getText());
}
}