1

我创建了一个自定义 JComponent,它在paintComponent 中绘制文本。将它放在 ScrollPane 中我想在附加文本超出视口时自动显示 scollbars。当我调整整个框架的大小时,滚动条会正确更新。但我想以编程方式进行。我尝试了几个#validate() 和#invalidate() 调用,但无济于事。

如何使用自定义组件作为客户端更新滚动窗格的滚动条?

我创建了一个简化的可运行示例来说明我的意思:

package swingscroll;

import java.awt.Color;
import java.awt.Dimension;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class SwingScroll {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI() {
        final JFrame frame = new JFrame(SwingScroll.class.getSimpleName());
        final JComponent myComponent = new JComponent() {
            private Dimension preferredSize;

            @Override
            public void setPreferredSize(Dimension preferredSize) {
                super.setPreferredSize(preferredSize);
                this.preferredSize = preferredSize;
            }


            @Override
            public Dimension getPreferredSize() {
                return this.preferredSize;
            }

        };
        myComponent.setPreferredSize(new Dimension(380, 50));

        final JScrollPane scrollPane = new JScrollPane(myComponent);
        frame.getContentPane().add(scrollPane);

        frame.setSize(400, 100);
        frame.setVisible(true);

        // simulate the internal change of preferredSize in myComponent
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(SwingScroll.class.getName()).log(Level.SEVERE, null, ex);
                }
                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // this should trigger the scrollbar right?
                        myComponent.setPreferredSize(new Dimension(380, 1000));
                        // TODO insert code to update scrollbars
                    }
                });
            }
        }).start();
    }
}
4

1 回答 1

5
// TODO insert code to update scrollbars
myComponent.revalidate();

刚看到你的评论:

当我在我的简单示例中添加重新验证和重新绘制时,滚动条仍然没有更新。

Worksforme - 虽然您的示例的问题是滚动条总是显示,所以看起来什么都没有发生。调整大小以便最初没有垂直滚动条,然后更新到必须显示条的高度就可以了。

顺便说一句:我假设示例中的 setPref 仅用于演示,而不是在生产代码中。

于 2012-09-02T12:56:29.377 回答