我使用一些JLabels和JTextFields作为JTree中的编辑器和渲染器。
用户可以点击任何JTextField并修改文本。一切正常。
我所缺少的是如何在用户键入时动态调整(增长)JTextField。
下面是一个说明问题的小示例程序。点击即“颜色”并输入一些额外的字符。JTextField保持其大小,这是预期的,但我希望它能增长和缩小以适应文本。
我尝试了不同的布局管理器,计算JTextField和JPanel的首选大小,调用无效()和JPanel和树等等,但没有成功。
有什么想法吗?
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);
}
}
}
为了方便起见,这里提供了一个使用JTextField而不是JTextArea的解决方案,类似于已接受的解决方案,使用info from:更改按键上JTextField的大小
final JPanel panel = new JPanel();
final BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
panel.setLayout(layout);
panel.add(new JLabel("Some text: "));
final JTextField field = new JTextField(String.valueOf(value));
final DocumentListener documentListener = new DocumentListener() {
private void updatePanel() {
panel.revalidate();
panel.setSize(panel.getPreferredSize());
}
@Override
public void removeUpdate(DocumentEvent e) {
updatePanel();
}
@Override
public void insertUpdate(DocumentEvent e) {
updatePanel();
}
@Override
public void changedUpdate(DocumentEvent e) {
}
};
field.getDocument().addDocumentListener(documentListener);
panel.add(field);
发生的情况是,拥有您的面板
的容器没有分配给它的布局管理器——所以当文本区域调整大小时,面板
不会调整大小。对此的一个简单解决方案是在文本区域调整大小时设置面板的大小。所以不要直接这样做:
panel.add(new JTextArea(String.valueOf(value)));
你可以这样做:
JTextArea ta = new JTextArea(String.valueOf(value));
ta.addComponentListener(new ComponentListener() {
@Override
public void componentResized(ComponentEvent e) {
panel.setSize(panel.getPreferredSize());
}
@Override
public void componentShown(ComponentEvent e) {}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentHidden(ComponentEvent e) {}
});
panel.add(ta);
问题内容: 如何调整JTextField的大小? 问题答案: 如果看一下Javadoc,您会看到JTextField是从Component派生的,并且具有setSize()方法。如果您没有布局管理器,那就很有用。 如果你 这样做 有一个布局管理器,则有必要对setPreferredSize() / / 是要走的路。
我试图在弹出组件和JMenuItem组件的click action事件中向JTree动态添加节点。我右键单击节点组件并添加另一个节点。添加节点适用于叶节点,但不适用于非叶节点。我不知道代码有什么问题。似乎添加了节点,但Gui没有更新。 平台:Windows 7 Java Java版本“1.7.0\u 17”Java(TM)SE运行时环境(build 1.7.0\u 17-b02)Java HotS
从http://mbostock.github.com/d3/talk/20111018/tree.html这个例子中,我构建了一个< code>d3树布局,其中根在浏览器窗口的中间(< code>root.x0 = width/2),节点在向下的方向,而不是面向右边。 是否可以重新调整树的大小,使得树的宽度取决于树的节点数量,如果节点数量较少,则宽度较小,或者如果节点数量较大,则宽度较大? 我还
我想减少GridBagLayout中JTextField和JScrollPane的宽度和高度,但似乎通过设置文本字段列,宽度只能减少到JList中最长内容的长度。我不确定是否需要调整组件的两个或一个尺寸以匹配宽度。 我尝试了setPreferredSize()、setSize()和在文本字段上设置列长度,但它们似乎没有任何作用。
问题内容: 我在创建JTree时遇到困难,该JTree允许通过将节点拖放到JTree中进行重组。看来应该比较简单。我在网上看过示例,但似乎无法在自己的代码中实现它。 例如,sun提供的这种功能允许在不同组件之间拖动到树中,但不能从树本身内部拖动。 而且我也发现了这一点,它允许您将文本拖到JTree中,但不能拖到树中。 任何参考或建议将是巨大的。谢谢 问题答案: 之前没有做过,但是谷歌快速搜索在这里
在tkinter中调整窗口大小时,有没有办法动态调整小部件的大小? 这是代码: 当我调整窗口大小时,窗口小部件的宽度和高度保持不变。 我想要的是根据窗口的大小动态调整窗口小部件的大小。 有没有办法在tkinter中实现这一点? 如果有人能帮我,那就太好了。