现在有一个问题很疑惑,JTree在JDK1.5下和JDK1.6下显示都不是很满意,如下图:是在1.5下的效果:JTree是放在一个下拉框中的,现在的问题是这个JTree的高度必须要大于界面的高度才能选中,否则的话选中之后,那个JTree就会跑掉。
如下图:是在JDK1.6下的效果:在1.6下,根本就没有树结构了,都变成下拉选项了。我现在都不知道从哪下手,不知道为什么会这样?大家伙给我出出主意。先谢谢大家了。

解决方案 »

  1.   

    就是把JTree放在一个下拉框中,在JDK1.5中JTree的高度要超出界面的界面,才能选中。
    而在JDK1.6中,就不是树形结构了,变成下拉选项了。
      

  2.   

    我弹出的那个框用的是JPopupMenu, 会不会是这个的原因。
      

  3.   

    我把整个类都贴出来吧。
    我写了一个继承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
      

  4.   

    public class MyComboBox extends JComboBox{
        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;
        }
      

  5.   

    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);
                }
            }
        }    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();
                    }
                }
            }
        }
      

  6.   

    private class DraggingHandler implements MouseListener, MouseMotionListener,
            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);
        }
    }
      

  7.   

    汗,终于把MyComboBox 的代码全部贴完了。9楼,10楼, 12楼为MyComboBox 类的代码
    调用的类为: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());
        }
    }
      

  8.   

    gentalguo, 麻烦你帮我看看。