Java 使用包含可编辑JTextArea的JPanel渲染JTree叶
我试图渲染一个JTree叶子,使其具有一个包含可编辑JTextArea的JPanel,以便用户可以键入文本并在添加文本时向下滚动 还使用包装器限制文本的宽度,使其向下延伸以允许更多的空间,而不是左右滚动 到目前为止,我已经实现了以下内容,但是当我运行代码时,它看起来很奇怪,好像有两个leaf,默认的和渲染的。任何类型的帮助都是非常感谢的 我只是想知道我想做的事情是否可以实现,如果不能,我可以在哪里修改 我不想改变图标,只是叶子而已Java 使用包含可编辑JTextArea的JPanel渲染JTree叶,java,swing,editor,jtree,jtextarea,Java,Swing,Editor,Jtree,Jtextarea,我试图渲染一个JTree叶子,使其具有一个包含可编辑JTextArea的JPanel,以便用户可以键入文本并在添加文本时向下滚动 还使用包装器限制文本的宽度,使其向下延伸以允许更多的空间,而不是左右滚动 到目前为止,我已经实现了以下内容,但是当我运行代码时,它看起来很奇怪,好像有两个leaf,默认的和渲染的。任何类型的帮助都是非常感谢的 我只是想知道我想做的事情是否可以实现,如果不能,我可以在哪里修改 我不想改变图标,只是叶子而已 import java.awt.Component; impor
import java.awt.Component;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
/**
*
* @author Razaractor
*/
class LeafRenderer extends AbstractCellEditor implements
TreeCellRenderer, TreeCellEditor {
//Text area to be place on JPanel
JTextArea text = new JTextArea();
DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();
@Override
public Object getCellEditorValue() {
return text.getText();
}
@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) {
//Default leaf
Component render = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
if (selected && leaf) {
final JPanel panel = new JPanel();
BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
panel.setLayout(layout);
text.setColumns(20);
text.setLineWrap(true);
text.setRows(5);
text.setWrapStyleWord(true);
text = new JTextArea(String.valueOf(value));
text.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) {
}
});
JScrollPane scroll = new JScrollPane(text);
panel.add(scroll);
render = panel;
return panel;
}
return render;
}
@Override
public Component getTreeCellEditorComponent(
final JTree tree,
final Object value,
final boolean isSelected,
final boolean expanded,
final boolean leaf,
final int row) {
Component editor = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, true, expanded, leaf, row, true);
final JPanel p = new JPanel();
if (editor instanceof JPanel) {
editor = (JPanel) editor;
}
return editor;
}
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
}
我不知道您真正想要实现什么,但请尝试这些更改
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
/**
*
* @author Razaractor
*/
class LeafRenderer extends AbstractCellEditor implements
TreeCellRenderer, TreeCellEditor {
//Text area to be place on JPanel
JTextArea text = new JTextArea();
DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();
@Override
public Object getCellEditorValue() {
return text.getText();
}
@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) {
//Default leaf
Component render = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
if (selected && leaf) {
final JPanel panel = new JPanel();
BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
panel.setLayout(layout);
//Changed code
//moved from
text = new JTextArea(String.valueOf(value));
text.setColumns(20);
text.setLineWrap(true);
text.setRows(5);
text.setWrapStyleWord(true);
//here. You were creating just ordinary JTextArea.
text.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) {
}
});
JScrollPane scroll = new JScrollPane(text);
//changed Code
//if you want to hide scrollbars uncomment one of these
//scroll.getVerticalScrollBar().setPreferredSize(new Dimension(0, 0));
//scroll.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 0));
panel.add(scroll);
render = panel;
return panel;
}
return render;
}
@Override
public Component getTreeCellEditorComponent(
final JTree tree,
final Object value,
final boolean isSelected,
final boolean expanded,
final boolean leaf,
final int row) {
Component editor = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, true, expanded, leaf, row, true);
final JPanel p = new JPanel();
if (editor instanceof JPanel) {
editor = (JPanel) editor;
}
return editor;
}
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
}
我不知道你真正想要实现什么,但是试试这些改变
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.util.EventObject;
import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
/**
*
* @author Razaractor
*/
class LeafRenderer extends AbstractCellEditor implements
TreeCellRenderer, TreeCellEditor {
//Text area to be place on JPanel
JTextArea text = new JTextArea();
DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();
@Override
public Object getCellEditorValue() {
return text.getText();
}
@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) {
//Default leaf
Component render = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
if (selected && leaf) {
final JPanel panel = new JPanel();
BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
panel.setLayout(layout);
//Changed code
//moved from
text = new JTextArea(String.valueOf(value));
text.setColumns(20);
text.setLineWrap(true);
text.setRows(5);
text.setWrapStyleWord(true);
//here. You were creating just ordinary JTextArea.
text.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) {
}
});
JScrollPane scroll = new JScrollPane(text);
//changed Code
//if you want to hide scrollbars uncomment one of these
//scroll.getVerticalScrollBar().setPreferredSize(new Dimension(0, 0));
//scroll.getHorizontalScrollBar().setPreferredSize(new Dimension(0, 0));
panel.add(scroll);
render = panel;
return panel;
}
return render;
}
@Override
public Component getTreeCellEditorComponent(
final JTree tree,
final Object value,
final boolean isSelected,
final boolean expanded,
final boolean leaf,
final int row) {
Component editor = nonLeafRenderer.getTreeCellRendererComponent(tree,
value, true, expanded, leaf, row, true);
final JPanel p = new JPanel();
if (editor instanceof JPanel) {
editor = (JPanel) editor;
}
return editor;
}
public void itemStateChanged(ItemEvent itemEvent) {
if (stopCellEditing()) {
fireEditingStopped();
}
}
}
有三种选择1)发布一个关于JTree的问题,然后你可以继续编辑,2)发布一个演示你的问题3)随它去吧,然后我们也可以,但可能是晴天霹雳:-)@Keppil,thanx作为建议,我刚刚设法发布了它。@mKorbel,我会选择选项2:^DSee也是,它实现了
TreeCellEditor
。有三种选择1)发布一个关于JTree的问题,然后你可以继续编辑,2)发布一个演示你的问题3)随它去吧,然后我们也可以,但可能是晴天霹雳:-)Keppil,thanx作为建议,我刚刚设法发布了它。@mKorbel,我会选择选项2:^DSee也是,它实现了TreeCellEditor
。我的目标是让一个带有JTextArea的JPanel替换JTree的默认可编辑叶。所以我不确定我正在实施的是实现我想要的东西所需要的。对于滚动条的修正,现在已经有了。我想返回一个包含JTextArea的JPanel,允许用户通过结束行上下滚动限制文本,这样它就不会是长的水平行。我刚刚设法摆脱了默认的叶子外观,我删除了所选条件,现在只有叶子。现在我有了我想要的叶子,就像我发布的第二张图片一样,我在JTextArea中输入文本时遇到问题,因此它使用包装器结束行,但它仍然使用默认的编辑器输入样式,即它不结束行。我该怎么做呢?感谢您尝试在面板中将JTree设置为可编辑(JTree.setEditable(true))和JTextArea设置为可聚焦(text.setFocusable(true))我已经将JTree设置为可编辑,我尝试了setFocusable(true),但它仍然没有响应,我可能会尝试requestFocus(),thanx RisoMy的目标是让一个带有JTextArea的JPanel替换JTree的默认可编辑叶。所以我不确定我正在实施的是实现我想要的东西所需要的。对于滚动条的修正,现在已经有了。我想返回一个包含JTextArea的JPanel,允许用户通过结束行上下滚动限制文本,这样它就不会是长的水平行。我刚刚设法摆脱了默认的叶子外观,我删除了所选条件,现在只有叶子。现在我有了我想要的叶子,就像我发布的第二张图片一样,我在JTextArea中输入文本时遇到问题,因此它使用包装器结束行,但它仍然使用默认的编辑器输入样式,即它不结束行。我该怎么做呢?感谢您尝试在面板中将JTree设置为可编辑(JTree.setEditable(true))和JTextArea设置为可聚焦(text.setFocusable(true))我已经将JTree设置为可编辑,我尝试了setFocusable(true),但它仍然没有响应,我可能会尝试requestFocus(),thanx Riso