我有JScrollPane,其中包含一些水平行图像。如果该图像行对于视口太长,则JScrollPane会显示一个滚动条,从而减小视口的高度。我想调整图像大小以适合视图端口。我如何检测视图端口改变了它的大小?不幸的是,注册更改事件处理程序似乎不起作用。如何检测JScrollPane的滚动条是否改变可视性?
8
A
回答
12
在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();
}
}
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);
}
});
}
相关问题
- 1. 如何检测SWT表的滚动条可见性变化
- 2. 如何检测滚动条是否在最底部?
- 3. 是否可以在GWT中检测滚动条发布事件?
- 4. 如何检测是否PHPSESSID改变
- 5. 检测div滚动底部(w/jScrollPane)
- 6. Java JScrollPane检测滚动靠近底部
- 7. 检查滚动条是否可以在WebBrowser中集中/滚动
- 8. 如何检查滚动条是否可见?
- 9. 如何使jScrollPane的滚动条比滚动内容的可见区域更长?
- 10. jscrollpane垂直滚动条
- 11. JScrollPane左侧滚动条
- 12. jScrollPane滚动条问题
- 13. jScrollPane - 超薄滚动条
- 14. jscrollpane,滚动条角度
- 15. jScrollPane - 滚动条doens't显示
- 16. JScrollPane滚动条跳到JEditorPane.setText()
- 17. jscrollpane没有滚动条
- 18. jScrollPane horyzontal滚动条顶部
- 19. 检测UIComponent是否有滚动条活动
- 20. Jscrollpane:使用水平滚动条功能可以滚动200px吗?
- 21. 如何使jScrollPane自定义滚动条始终可见?
- 22. 检测窗体的滚动条是否在mdi子项中可见
- 23. 我有一个div滚动条。如何检测滚动条上是否有人在使用?
- 24. 检测WPF FrameworkElement是否在滚动
- 25. 检测页面是否有垂直滚动条?
- 26. Flex检测滚动条是否显示在数据网格中
- 27. 如何检测(并更正?)各种滚动条可见性跨浏览器?
- 28. 是否可以使用自己的图像更改滚动条?
- 29. QListView检测滚动更改
- 30. 如何检测我的recyclerview是否跳过滚动框架?
好, 奇怪的。感谢您的快速回复。我试过了,确实有效。唉,在我的应用程序中,添加更改侦听器不起作用。我会从这里工作。 – xmjx
对于一些奇怪的原因,输出到stdout和stderr都不会显示在侦听器中。所以它基本上是一个调试问题。再次感谢。 – xmjx