Динамическое изменение размера JTextField в узле JTree

Я использую JPanel с некоторыми JLabels и JTextFields в качестве редактора и средства визуализации в JTree.

Пользователь может щелкнуть любое поле JTextField и изменить текст. Все работает нормально.

Все, что мне не хватает, это то, как я могу динамически изменять размер (увеличивать )JTextField по мере того, как пользователь печатает.

Ниже приведен небольшой пример программы, иллюстрирующий проблему. Нажмите, например, «цвета» и введите несколько дополнительных символов. JTextField сохраняет свой размер, что и ожидается, но я хотел бы, чтобы он увеличивался и уменьшался, чтобы вместить текст.

Я пробовал разные менеджеры компоновки, вычислял предпочтительный размер JTextField и JPanel, вызывал недействительность (), JPanel и Tree и т. д., но безуспешно.

Любые идеи?

import java.awt.Component;
import java.util.EventObject;

import javax.swing.AbstractCellEditor;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;

public class Tree {

    public static void main(final String[] args) {
        new Tree().grow();
    }

    private void grow() {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JTree tree = new JTree();
        tree.setEditable(true);
        tree.setCellRenderer(new SomeTreeCellRenderer());
        tree.setCellEditor(new SomeTreeCellRenderer());

        frame.add(new JScrollPane(tree));

        frame.pack();
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private class SomeTreeCellRenderer extends AbstractCellEditor implements 
            TreeCellRenderer, TreeCellEditor {

        @Override
        public Object getCellEditorValue() {
            return null;
        }

        @Override
        public boolean isCellEditable(final EventObject event) {
            return true;
        }

        @Override
        public Component getTreeCellRendererComponent(
                final JTree tree, final Object value, final boolean selected, final boolean expanded, 
                final boolean leaf, final int row, final boolean hasFocus) {

            final JPanel panel = new JPanel();
            final BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
            panel.setLayout(layout);

            panel.add(new JLabel("Some text: "));
            panel.add(new JTextArea(String.valueOf(value)));

            return panel;
        }

        @Override
        public Component getTreeCellEditorComponent(
                final JTree tree, final Object value, final boolean isSelected,
                final boolean expanded, final boolean leaf, final int row) {

            return getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, false);
        }

    }

}
6
задан mKorbel 2 August 2012 в 15:19
поделиться