JTree のエディターおよびレンダラーとして、いくつかの JLabels と JTextFields を持つ JPanel を使用しています。
ユーザーは任意の JTextField をクリックしてテキストを変更できます。すべて正常に動作します。
私が見逃しているのは、ユーザーが入力しているときに JTextField を動的にサイズ変更 (拡大) する方法だけです。
問題を説明する小さなサンプル プログラムの下。「色」をクリックして、追加の文字を入力します。JTextField は予想どおりのサイズを維持しますが、テキストに合わせて拡大縮小したいと考えています。
さまざまなレイアウト マネージャーを試し、JTextField と JPanel の preferredSize を計算し、invalidate() と 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);
}
}
}