1

我正在 SWT 浏览器小部件中查看 HTML。我将日志消息附加到内容的末尾,并希望始终保持底部可见。目前,每当我将文本附加到内容时,我首先设置新文本:

browser.setText(content);

然后我通过 JavaScript 向下滚动浏览器小部件:

browser.execute("window.scrollTo(0,100000);");

这样做的问题是,当我设置文本时,小部件在向下滚动之前再次切换到顶部,所以当我快速附加大量消息时,浏览器小部件大部分时间都显示顶部,切换到时偶尔会闪烁底端。这使得无法跟踪底部记录的内容。

我知道我可以使用树查看器并获得 Eclipse 平台的所有便利,但也有一个 Swing 版本的应用程序,两者都应该使用相同的 HTML 和 CSS 表示。

理想情况下,我想避免嵌入 Swing 组件,但如果有一个允许这样做,我会很高兴听到它。我已经在 J​​ScrollPane 中使用 JEditorPane 进行了尝试,通过编辑器工具包的读取方法附加到内容:

editorPane.getEditorKit().read(/*...*/);

然后像这样向下滚动:

editorPane.setCaretPosition(editorPane.getDocument().getLength());

这对于独立的 Swing 应用程序来说非常顺利,但是嵌入在 Eclipse 中它会闪烁并且跟不上 HTML 内容的快速更新。

现在,我可以在 Eclipse 中顺利完成这项工作的唯一方法是在浏览器小部件的内容之前添加而不是添加,但我真的更喜欢在底部添加新消息,而不是在顶部。

4

2 回答 2

1

每次重写整个 HTML 内容似乎是不必要的忙碌工作,并且可能没有办法阻止某些浏览器在每次重绘整个页面时滚动到顶部。特别是如果您允许您显示的日志变得很长,那么随着日志的变长,这将变得越来越慢。

更好的解决方案可能是使用 JavaScript 附加到页面。你已经在使用

browser.execute()

像这样的东西怎么样(假设“ itemID”是DIV包含内容的ID):

String newContent = newContent.replaceAll("\n", "<br>").replaceAll("'", "\\\\'");
browser.execute("document.getElementById(\"itemID\").innerHTML += '"
                newContent + "'");

您必须这样做,replaceAll()并且您可能需要更多的转换,具体取决于您的日志内容。例如,如果脚本包含换行符,并且需要引用字符串中的单引号,我已经注意到它browser.execute()不喜欢它,如上所示。

于 2009-02-21T00:47:02.183 回答
1

我本来只是将其添加为评论,但它不会让我(没有足够的声誉)。您可以通过设置系统属性将 XUL 发送到 mac 上的非标准位置。

System.setProperty("org.eclipse.swt.browser.XULRunnerPath", "/fubar/xul/Versions/1.9.0.7/");

于 2009-06-16T07:35:20.450 回答