我有一个带有JLabel的JPanel,添加到JScrollPane。我有一个调用JLabel.setIcon("file.jpg");
的actionListener。图像正确显示在JScrollPane中,并且是完整大小。滚动条显示完美。我正在尝试将垂直和水平滚动条默认定位在中心,因此默认情况下您正在查看图像的中心。
是否有一个JScrollPane方法将视口定位在图像的中心?或者我可以手动将每个滚动条的位置设置为最大尺寸除以2吗?
我试过了
JScrollPane.getVerticalScrollBar().setValue(JScrollPane.getVerticalScrollBar().getMaximum() / 2);
虽然它编译它不会使滚动条居中。我也尝试将我的JPanel的布局管理器设置为GridBagLayout,但这也不起作用。
答案 0 :(得分:6)
基本上,您需要知道视口可视区域的大小。
Rectangle bounds = scrollPane.getViewport().getViewRect();
然后你需要组件的大小,但是一旦它被添加到滚动窗格,你可以从视图端口获得这个......
Dimension size = scrollPane.getViewport().getViewSize();
现在你需要计算中心位置......
int x = (size.width - bounds.width) / 2;
int y = (size.height - bounds.height) / 2;
然后你只需要调整视口位置......
scrollPane.getViewport().setViewPosition(new Point(x, y));
现在,请记住,只有在屏幕上实现滚动窗格(或至少它已在其父容器中布局)之后,这才会起作用。
答案 1 :(得分:3)
我猜测您在尝试执行代码时尚未读取图像,请尝试以下操作:
label.setIcon( new ImageIcon("...") );
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Rectangle bounds = scrollPane.getViewport().getViewRect();
JScrollBar horizontal = scrollPane.getHorizontalScrollBar();
horizontal.setValue( (horizontal.getMaximum() - bounds.width) / 2 );
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue( (vertical.getMaximum() - bounds.height) / 2 );
}
});
这会将代码添加到Event Dispatch Thread的末尾,所以希望它在完全读入图像并且滚动条值全部更新后执行。
答案 2 :(得分:1)
添加AdjustmentListener
,看看是否有帮助。如果组件的值发生变化,它会通知您。这样,添加图像后,滚动条的属性将发生变化,您将收到通知。然后,您可以尝试将插入位置设置为中间位置。
教程:http://examples.javacodegeeks.com/desktop-java/awt/event/adjustmentlistener-example/