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