- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 JTree
和一个 TreeCellEditor
,其大小可变(当您在编辑器中的一个组件中选择一个值时,会显示其他组件)。当编辑器最初显示时,它的大小是正确的。但是,如果显示其他组件导致其首选尺寸变大,则编辑器将不会放大并且其内容将被剪裁。
我发现,如果我设置编辑器的大小,它会调整大小,但我希望有一种方法可以在其首选大小发生变化时自动调整其大小。
这是一个使用 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 委托(delegate))可以处理与同一节点上的渲染器组件具有不同大小的编辑器组件,尽管它们假设大小在单个节点编辑过程的生命周期内不会改变。用户界面
对于编辑器生命周期内的更改,自定义 Controller 必须监听这些更改(和/或触发这些更改的任何内容),然后监听这两个任务。下面是一个文本字段,其 prefSize 取决于其内容,以及一个监听 documentChanges 并根据需要执行操作的 Controller 。
// 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);
关于java - 如何在显示后调整 TreeCellEditor 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301133/
我想在 CellEditor 消失后执行一个操作。之后调用哪个方法,从哪里开始? 最佳答案 您必须通过向树添加 CellEditorListener 来监听 JTree 的 CellEditor t
我有一个 JTree 和一个 TreeCellEditor,其大小可变(当您在编辑器中的一个组件中选择一个值时,会显示其他组件)。当编辑器最初显示时,它的大小是正确的。但是,如果显示其他组件导致其首选
我有一个自定义对象,它具有描述 (String) 和优先级值 (int)。我在 JTree 中显示这些值,因为这种类型的不同对象之间存在层次关系。我只在 JTree 节点中显示描述,因为优先级对于显示
我使用多行 JTextArea 来编辑我的 JTree 中的值。 通过一些技巧,我能够调整 JTextArea 的大小以适应其中的文本,但编辑器周围的 JTree 节点/行不会移开。 (SCCEE 截
我有一个 JTree ,其中包含自定义 TreeModel 和自定义 TreeCellEditor(目前)显示 JComboBox code> 通过 getTreeCellEditorComponen
我是一名优秀的程序员,十分优秀!