当前位置: 首页 > 知识库问答 >
问题:

JTextPane-除非我执行setText(getText())并重新绘制,否则无法正确呈现HTMLEditorKit列表的项目符号

越学博
2023-03-14

我有:

JTextPane jtextPane = new JTextPane();
jtextPane.setEditorKit(new HTMLEditorKit());
...

然后,稍后我尝试添加一个无序列表按钮到工具栏,这样操作是:

Action insertBulletAction = 
        HTMLEditorKit.InsertHTMLTextAction ("Bullets", "<ul><li> </li></ul>", 
                                            HTML.Tag.P, HTML.Tag.UL);
JButton insertBulletJButton = new JButton(insertBulletAction);

如果我对生成的html进行转储,这就包含了正确的代码。然而,它将被渲染得非常糟糕,如以下所示,甚至不接近于合理:

jtextPane.setText(jtextPane.getText());
jtextPane.repaint();

PS2:这个链接也很方便,但它也没有显示出一个解决方案。

更新:这里是所要求的完整代码,但没有太多其他...

public static void main(String[] args)
{
    JFrame jframe = new JFrame();
    jframe.setSize(800, 600);
    jframe.setVisible(true);

    JTextPane jtextPane = new JTextPane();
    jtextPane.setEditorKit(new HTMLEditorKit());

    Action insertBulletAction = new HTMLEditorKit.InsertHTMLTextAction ("Bullets", 
                                    "<ul><li> </li></ul>", HTML.Tag.P, HTML.Tag.UL);
    JButton insertBulletJButton = new JButton(insertBulletAction);
    insertBulletJButton.setRequestFocusEnabled(false);

    jframe.setLayout(new BorderLayout());
    jframe.add(new JScrollPane(jtextPane));
    jframe.add(insertBulletJButton, BorderLayout.SOUTH);
}

共有1个答案

颛孙建业
2023-03-14

答案其实相当复杂。基本上,InserthTmlAction本身还不够好。您需要大量的工作和逻辑来完成一个工作列表操作。这需要很大的逻辑!所以您必须重写Action类。基本上,InserthTmlAction参数将根据您在html代码中的位置而改变。

话虽如此,我研究了几个开源解决方案,以便更好地理解所有涉及的内容。很长一段时间之后(以及之前花了很多时间),我终于能够很好地解决我所需要的问题。但它相当复杂。太复杂了,不能在这里写,它需要一本书的一章来解释概念。即使这样,我仍然对一些细节不清楚(我还在继续努力)。

我现在可以理解为什么人们为了这个卖组件了!

我发现大多数开源解决方案并不能很好地处理列表。它们一般都能正常工作,但大多数都有明显的缺陷。或者他们只是不真正处理任何事情,除了最基本的情况的列表。

这里是我查看的系统列表,以了解它们是如何工作的,从而更好地理解一切。不幸的是,我发现文档缺乏或者很难理解,所以看看这些项目对我的帮助比其他任何事情都大。

最有帮助的

  • Shef-最有帮助。
  • eKit-不错,但有很多错误,不是最好的代码组织
  • MetabaseEditor-与eKit类似

适度有用(较复杂、杂乱、相关性较小等)

  • ooobean-尝试过,但对于我需要的内容来说太多(因此太复杂)。不过看起来真的很好,你只需要投入时间。
  • jxhtmledit-似乎有兴趣
    null
    null
 类似资料:
  • 我有一个有很多面板的项目。我有一个方法可以在卡片布局面板中切换卡片(jpanel)(见下文)。当我从IDE(Netbeans)运行它时,以及当我从命令提示符()运行jar时,这一切都很正常。但是,当我双击Jar时,卡片会发生变化,但不会产生不希望的结果(当我将鼠标放在出现的组件上时)。如果我再次通过单击按钮调用该方法,它将应用。我需要帮助,请立即:)谢谢!

  • 我创建了一个程序,只需在屏幕上移动一个球。我以前把它都放在一节课上,但我觉得它看起来太乱了,所以我把它分成了三个不同的课:主课。。。初始化一切,游戏。。。它描绘一切,是一个JPanel,AL是一个KeyListener(这也是问题所在)。问题是,我无法让程序从我的AL类重新绘制,无论我试图传递什么。有人能帮忙吗?以下是我的三门课: - -

  • 我有一个Jfreechart,它正在绘制一些模拟实时数据。当我将域轴设置为自动时,可以看到数据每秒更新一次。然而,我希望在更大范围内(比如说一整天)绘制数据。当我更改范围时,除非放大,否则无法看到绘图。 如何使其连续(显示序列中的每个观测点),以及如何在手动设置范围时使其可见

  • 我只是启动libgdx,这看起来很简单,但我不明白。screen对象中的render方法将调用WorldRenderer中的render方法: //屏幕呈现方法

  • 问题内容: 我已经建立了俄罗斯方块游戏。现在,我已经使用JPanel来显示内容和块(使用paintComponents()方法)。 问题是,当我尝试从另一个JFrame调用tetris程序时,它根本无法绘制。 我的俄罗斯方块主菜单的代码是: 当调用MatrixBoard的构造函数时,俄罗斯方块游戏会在新窗口中开始。但是,这些块在屏幕上不可见。MatrixBoard的代码是: 请帮忙。我怀疑问题出在

  • 问题内容: 我正在使用 JSF 2.1.8 实现Web应用程序,而 ui:include 标记存在问题。我有这个代码 该 navigationManagerSystem bean是JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容。如果我以这样的常量执行此操作,则包括这些工作,但是如果我将其放入变量中则不行,即使我已经看到变量在屏幕打印之前就保持了该值。我不知道它是否可以与包含/sy