如何检测JScrollPane滚动条的可见性变化?

10

我有一个包含一些水平行图片的JScrollPane。如果图片行太长,视口将出现滚动条,并减小视口的高度。我想要调整图片大小以适应视口。如何检测视口的尺寸变化?不幸的是,注册变化事件处理程序似乎不起作用。

2个回答

14

在ViewPort上使用更改监听器对我有效。以下是一个小演示:

import java.awt.BorderLayout;
import java.io.UnsupportedEncodingException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Main {

    public static void main(String[] args) throws UnsupportedEncodingException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new BorderLayout());
        final JPanel buttons = new JPanel();
        final JScrollPane pane = new JScrollPane(buttons);
        pane.getViewport().addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {
                System.err.println("Change in " + e.getSource());
                System.err.println("Vertical visible? " + pane.getVerticalScrollBar().isVisible());
                System.err.println("Horizontal visible? " + pane.getHorizontalScrollBar().isVisible());
            }
        });
        panel.add(pane);
        frame.setContentPane(panel);
        frame.setSize(300, 200);
        frame.setVisible(true);
        SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {

            @Override
            protected Void doInBackground() throws Exception {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(800);
                    buttons.add(new JButton("Hello " + i));
                    buttons.revalidate();
                }
                return null;
            }
        };
        worker.execute();
    }
}

好的,有点奇怪。感谢您的快速回复。我尝试过了,它确实起作用。遗憾的是,在我的应用程序中添加更改侦听器不起作用。我将从这里开始工作。 - xmjx
由于某种奇怪的原因,标准输出和错误输出都没有在监听器中显示。所以这基本上是一个调试问题。再次感谢。 - xmjx

1
我使用了 HierarchyBoundsListener 来检测 JScrollPane 大小的变化:
onAncestorResized(scroll, evt -> resizeYourImages());

这里有一个方便的方法来附加监听器:
static void onAncestorResized(JComponent component, Consumer<HierarchyEvent> callback) {
    component.addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
        @Override
        public void ancestorResized(HierarchyEvent e) {
            callback.accept(e);
        }
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接