Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示TreeCeleditor后如何调整其大小_Java_Swing_Jtree - Fatal编程技术网

Java 显示TreeCeleditor后如何调整其大小

Java 显示TreeCeleditor后如何调整其大小,java,swing,jtree,Java,Swing,Jtree,我有一个JTree,带有一个大小可变的treeCeleditor(当您在编辑器中的一个组件中选择一个值时,会显示其他组件)。最初显示编辑器时,它的大小是正确的。但是,如果显示的其他组件导致其首选大小变大,则编辑器将不会放大,其内容将被剪裁 我发现,如果我设置编辑器的大小,它将调整大小,但我希望有一种方法,使它在首选大小更改时自动调整大小 下面是一个使用JTextField模拟我的编辑器的示例。单击按钮会使文本字段的首选大小变大,但在我的编辑器中,这将从编辑器组件中触发,我不想在那里显式设置大小,

我有一个
JTree
,带有一个大小可变的
treeCeleditor
(当您在编辑器中的一个组件中选择一个值时,会显示其他组件)。最初显示编辑器时,它的大小是正确的。但是,如果显示的其他组件导致其首选大小变大,则编辑器将不会放大,其内容将被剪裁

我发现,如果我设置编辑器的大小,它将调整大小,但我希望有一种方法,使它在首选大小更改时自动调整大小

下面是一个使用
JTextField
模拟我的编辑器的示例。单击按钮会使文本字段的首选大小变大,但在我的编辑器中,这将从编辑器组件中触发,我不想在那里显式设置大小,因为它用于除树单元编辑器之外的上下文中

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTree;

public class Test extends JFrame {
    @Override
    public void setVisible(boolean b) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTree tree = new JTree();
        tree.setEditable(true);
        final JTextField field = new JTextField();
        tree.setCellEditor(new DefaultCellEditor(field));

        JButton button = new JButton(new AbstractAction("Make CellEditor Wider") {
            @Override
            public void actionPerformed(ActionEvent e) {
                Dimension size = field.getPreferredSize();
                size.width += 50;
                field.setPreferredSize(size);
                field.setSize(size); // This forces the tree to show the correct size
            }
        });

        setLayout(new BorderLayout());
        add(tree, BorderLayout.CENTER);
        add(button, BorderLayout.SOUTH);
        setSize(500, 500);
        super.setVisible(b);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().setVisible(true);
            }
        });
    }
}
基本上,树(或者更准确地说:它的ui委托)可以处理与同一节点上的渲染器组件大小不同的编辑器组件,尽管它们假定在单个节点编辑过程的生命周期内大小不会改变。用户界面

  • 开始编辑时调整编辑器组件的大小/位置
  • 触发编辑器组件下方节点位置的更新(如果需要)
对于编辑器生命周期内的更改,自定义控制器必须侦听这些更改(和/或触发这些更改的任何内容),然后侦听这两个任务。下面是一个文本字段,其prefSize取决于其内容,以及一个侦听文档更改并根据需要执行操作的控制器

// both height and width depend on content
final JTextField field = new JTextField() {

    @Override
    public Dimension getPreferredSize() {
        Dimension dim = super.getPreferredSize();
        int length = getText().length();
        dim.width += length * 10;
        dim.height += length * 2;
        return dim;
    }

};
// controller listens to changes to dynamically takes over the ui's job 
DocumentListener l = new DocumentListener() {

    protected void validateEditor(final JTextField field) {
        // the selectionModel's rowMapper is-a AbstractLayoutCache
        // BEWARE: implementation detail!
        TreeSelectionModel model = tree.getSelectionModel();
        // invalidate all cached node sizes/locations
        ((AbstractLayoutCache) model.getRowMapper()).invalidateSizes();
        // just a fancy cover method for revalidate/repaint
        tree.treeDidChange();
        // manually set the component's size
        field.setSize(field.getPreferredSize());
    }
    @Override
    public void insertUpdate(DocumentEvent e) {
        validateEditor(field);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        validateEditor(field);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
    }

};
field.getDocument().addDocumentListener(l);
基本上,树(或者更准确地说:它的ui委托)可以处理与同一节点上的渲染器组件大小不同的编辑器组件,尽管它们假定在单个节点编辑过程的生命周期内大小不会改变。用户界面

  • 开始编辑时调整编辑器组件的大小/位置
  • 触发编辑器组件下方节点位置的更新(如果需要)
对于编辑器生命周期内的更改,自定义控制器必须侦听这些更改(和/或触发这些更改的任何内容),然后侦听这两个任务。下面是一个文本字段,其prefSize取决于其内容,以及一个侦听文档更改并根据需要执行操作的控制器

// both height and width depend on content
final JTextField field = new JTextField() {

    @Override
    public Dimension getPreferredSize() {
        Dimension dim = super.getPreferredSize();
        int length = getText().length();
        dim.width += length * 10;
        dim.height += length * 2;
        return dim;
    }

};
// controller listens to changes to dynamically takes over the ui's job 
DocumentListener l = new DocumentListener() {

    protected void validateEditor(final JTextField field) {
        // the selectionModel's rowMapper is-a AbstractLayoutCache
        // BEWARE: implementation detail!
        TreeSelectionModel model = tree.getSelectionModel();
        // invalidate all cached node sizes/locations
        ((AbstractLayoutCache) model.getRowMapper()).invalidateSizes();
        // just a fancy cover method for revalidate/repaint
        tree.treeDidChange();
        // manually set the component's size
        field.setSize(field.getPreferredSize());
    }
    @Override
    public void insertUpdate(DocumentEvent e) {
        validateEditor(field);
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        validateEditor(field);
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
    }

};
field.getDocument().addDocumentListener(l);

我最近知道了。谢谢,@trashgood。这适用于行高。我对cell editor width感兴趣。我最近了解到。谢谢,@trashgood。这适用于行高。我对cell editor width感兴趣。谢谢@kleopatra。由于树假设大小不会改变,因此如果不亲自更改编辑器的大小,就无法触发大小更改。如果编辑器组件包含在具有布局管理器的内容中,则重新验证该容器将导致编辑器组件更改大小,但由于树未使用布局管理器,因此不会发生这种情况。@RangiKeen:-)谢谢@kleopatra。由于树假设大小不会改变,因此如果不亲自更改编辑器的大小,就无法触发大小更改。如果编辑器组件包含在具有布局管理器的内容中,则重新验证该容器将导致编辑器组件更改大小,但由于树未使用布局管理器,因此不会发生这种情况。@RangiKeen:-)