【问题标题】:Swing: How could I use JTree with JTextPanes as nodes?Swing:如何将 JTree 与 JTextPanes 一起用作节点?
【发布时间】:2009-07-06 20:34:24
【问题描述】:

JTree 使用DefaultTreeCellRenderer 作为单元格渲染器。
这个类是JLabel的子类。

我想将JTree 与比JLabel 更复杂的元素一起使用,例如 JTextPane.

问题是:我不能继承DefaultTreeCellRenderer,因为它 仍然是JLabel。

编写自己的TreeCellRenderer 太复杂了。
为什么?因为:DefaultTreeCellRenderer 有 17 个字段, 并且不仅仅是实现TreeCellRenderer's getTreeCellRendererComponent(...).

你能想出什么简单的解决方案?

我需要树元素为JTextPanes 才能执行复杂的格式化。

【问题讨论】:

  • 你需要 JTextPane 做什么?
  • 必须实现接口。应该不会太难。实际上,我觉得弄乱这样的 gui 东西很有趣。

标签: java user-interface swing jtree


【解决方案1】:
public class JTextPaneTreeCellRenderer extends JTextPane implements TreeCellRenderer {

方法:

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {

    // do stuff to this instance of JTextPane
    setEditable(selected);
    setText(value.toString()); //Assumes whatever you stuck in the tree has pretty toString

    if (leaf)
        setBackgroundColor(Color.RED);
    return this;
}

您不需要像默认实现那样复杂。将 Renedere 设为 JTextPane 的子类将使该方法的实现更加容易。

【讨论】:

【解决方案2】:

您仍然可以继承 DefaultTreeCellRenderer 并仅覆盖 getTreeCellRendererComponent 方法以返回您希望格式化的 JTextPane 组件。您仍然需要做很多 DefaultTreeCellRenderer 在其实现中所做的事情,但您不必为这 17 个左右字段的维护方面烦恼。

edit在阅读cmets后去掉了JTextField编辑器的解决方案

【讨论】:

  • 不,那是单元格编辑器。为此,有一个很好的抽象类 AbstractCellEditor
猜你喜欢
  • 1970-01-01
  • 2020-09-08
  • 2012-02-08
  • 2011-01-19
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2018-10-20
相关资源
最近更新 更多