【问题标题】:Setting Scroll Bar on a JScrollPane在 JScrollPane 上设置滚动条
【发布时间】:2010-11-13 01:22:55
【问题描述】:

我有这个由HTMLEditorKit 支持的JTextPane(包裹在JScrollPane 中)。 JTextPane 的内容是简单的 HTML,其中包含一些使用 img 标签嵌入的图像(本地文件)。问题是当你加载JTextPane 时,加载需要一瞬间,然后它会在页面底部出现滚动条。如果我这样做:

JTextPane text = new JTextPane();
JScrollPane scroll = new JScrollPane(text);
// do some set up...
scroll.getVerticalScrollBar().setValue(0);

它会暂时设置滚动条,然后另一个头(可能是负责加载图像的)出现并将滚动条撞回底部。我尝试添加:

((AbstractDocument)text.getDocument()).setAsynchronousLoadPriority(-1);

但这并没有解决问题。有什么方法可以从text.getDocument()text 获取事件,当窗格完成加载时会通知我,以便我可以设置滚动条?另一种方法是我设置另一个线程等待一秒钟左右,然后设置滚动条,但这是一个糟糕的 hack。

你的建议?

【问题讨论】:

    标签: java html swing events


    【解决方案1】:

    您的应用是单线程的吗?如果是,您可以请求正在运行的线程列表并在它们完成时收到通知,然后设置滚动条值。这是一个选择吗?

    或者您可以为每个加载的图像提供一个 ImageObserver,并在报告加载所有图像时设置滚动条的位置?

    【讨论】:

    • Swing 应用程序依靠一个称为事件调度线程的线程来控制所有 GUI 操作。如果需要,您可以解决这个问题,但我现在所做的所有工作都在 Event Dispatch Thread 上。这可以被视为一种选择,但可能与我在问题中提出的一样糟糕。不过我会记住的。
    【解决方案2】:

    您是否尝试过使用 invokeLater?

    final JScrollPane scroll = new JScrollPane(text);
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
       public void run() { 
           scroll.getVerticalScrollBar().setValue(0);
       }
    });
    

    如果这不起作用,那么深入研究图像视图非常困难,所以我的下一步是追踪滚动条发生变化的原因:

    scroll.setVerticalScrollbar(new JScrollBar() {
        public void setValue(int value) {
            new Exception().printStackTrace();
            super.setValue(value);
        } 
    });
    

    您还可以在 setValue() 方法中使用调试器,而不仅仅是打印堆栈跟踪。

    【讨论】:

    • 第一个解决方案有效,谢谢。为什么地球上没有无需调用 SwingUtilities 的方法来设置它?
    • 不知道。我认为它的设计方式是您必须创建 JScrollPane,将其添加到屏幕,然后 然后 设置值。对我来说毫无意义。
    【解决方案3】:

    经过 50 分钟的绝望后,以下内容为我解决了问题:

    JTextPane.grabFocus();
    JTextPane.setCaretPosition(20);
    

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2012-07-02
      • 1970-01-01
      • 2011-05-20
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多