Java 绝地武士的奇怪行为

Java 绝地武士的奇怪行为,java,swing,url,jeditorpane,Java,Swing,Url,Jeditorpane,我创建了一个自定义类,它扩展了JEditorPane,并使用了它的setPage()方法。然而,我在使用它时遇到了一个非常奇怪的问题。这就是我实现它的方式 class WebReader extends JEditorPane { WebReader(String addressIn) { setEditable(false); showPage(addressIn) } void showPage(String address) { try {

我创建了一个自定义类,它扩展了JEditorPane,并使用了它的setPage()方法。然而,我在使用它时遇到了一个非常奇怪的问题。这就是我实现它的方式

class WebReader extends JEditorPane {

  WebReader(String addressIn) {
    setEditable(false);
    showPage(addressIn)
  }

  void showPage(String address) {    
    try {
      setPage(address);
    } catch (Exception e) {
      e.printStackTrace();
  }
}
一个电话可能看起来像这样

WebReader fooReader = new WebReader("https://www.google.com");
fooReader.showPage("https://www.google.comxxxx");
这本不应该起作用,但却神秘地起作用

非常奇怪的是,如果我已经输入了一个正确的URL,它就不会捕获错误的URL。例如,如果我输入了“”,它工作正常(应该是这样),输入之后,它仍然会在我的JEditorPane上显示google.com,并且不会引发异常(我希望它这样做)

值得注意的是,如果我输入“起始URL”,它确实会引发异常

编辑:添加了一些代码。

我设法修复了它

我在showPage()中添加了以下内容:


因此,每次更改网页时,它都会创建一个新的EditorKit

如果页面异步加载(在后台),则不会出现IOException。URL是否异步加载取决于EditorKit为您正在加载的内容类型安装的文档。从:

这可以同步或异步加载,具体取决于
EditorKit
返回的文档。如果
文档
的类型为
AbstractDocument
,并且
AbstractDocument.getAsynchronousLoadPriority
返回的值大于或等于零,则将使用该优先级在单独的线程上加载页面

如果同步加载文档,则在将其安装到编辑器之前,将使用流填充文档,并调用
setDocument
,该调用将被绑定并触发属性更改事件。如果抛出
IOException
,将丢弃部分加载的文档,并且不会触发文档或页面属性更改事件。如果文档已成功加载和安装,UI将为其构建一个视图,然后在必要时滚动该视图,然后将触发页面属性更改事件

如果以异步方式加载文档,则将使用调用
setDocument
立即将文档安装到编辑器中,该调用将触发文档属性更改事件,然后将创建一个线程,该线程将开始实际加载。在这种情况下,调用此方法不会直接触发页面属性更改事件,而是在执行加载的线程完成后触发。它还将在事件分派线程上激发。由于调用线程在另一个线程发生故障时不能抛出
IOException
,因此无论加载是否成功,当另一个线程完成时都会触发页面属性更改事件

显然,在本例中,网页的EditorKit是一个HTMLEditorKit。从:

较大的文档需要大量的解析,并且需要一些时间来加载。默认情况下,如果使用
JEditorPane.setPage
加载,此工具包将生成异步加载的文档

解决方法是自己同步加载文档,而不是使用JEditorPane.setPage:

Document doc;

URLConnection connection = new URL(url).openConnection();
try (InputStream stream = connection.getInputStream()) {
    String contentType = connection.getContentType();
    EditorKit editorKit =
        JEditorPane.createEditorKitForContentType(contentType);
    doc = editorKit.createDefaultDocument();
    editorKit.read(stream, doc, 0);
}

pane.setDocument(doc);

请提供答案。你想看什么?因为其余部分只是可视的(我将JEditorPane放在一个滚动窗格中,并附加了一个侦听器),我在上面的方法中得到了“错误”的indata(地址)。所以基本上就是那个片段,我不明白为什么它不起作用。你说你在“扩展JEditorPane”,请向我们展示你自定义实现的代码。我的实现在上面。每当我想更改显示的页面时,我都会调用我的WebReader的showPage()方法。那么,您是用给定的地址创建一个
WebReader
对象,然后用不同的地址调用它的
showPage
?你能把那部分代码加进去吗?我也找到了,很好的朋友!非常感谢。
Document doc;

URLConnection connection = new URL(url).openConnection();
try (InputStream stream = connection.getInputStream()) {
    String contentType = connection.getContentType();
    EditorKit editorKit =
        JEditorPane.createEditorKitForContentType(contentType);
    doc = editorKit.createDefaultDocument();
    editorKit.read(stream, doc, 0);
}

pane.setDocument(doc);