我有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. 如何檢測滾動條是否在Jscrollpane中被拖動/單擊?
- 2. 如何檢測SWT表的滾動條可見性變化
- 3. JScrollPane滾動條不可滾動
- 4. 如何檢測滾動框(html元素)是否可滾動
- 5. 檢測UIScrollView是否滾動
- 6. 如何檢測是否有水平滾動條?
- 7. 如何檢測滾動條是否在最底部?
- 8. 是否可以在GWT中檢測滾動條發佈事件?
- 9. 如何檢測是否PHPSESSID改變
- 10. 更改JScrollPane滾動條顏色
- 11. 檢測div滾動底部(w/jScrollPane)
- 12. Java JScrollPane檢測滾動靠近底部
- 13. 如何檢查ScrollView是否可滾動
- 14. 檢查滾動條是否可以在WebBrowser中集中/滾動
- 15. Vaadin 7如何檢查滾動條是否可見
- 16. 如何檢查滾動條是否可見?
- 17. 如何使jScrollPane的滾動條比滾動內容的可見區域更長?
- 18. 如何向下滾動JScrollPane上的垂直滾動條?
- 19. 動態檢測滾動條
- 20. jScrollpane滾動條不工作
- 21. JScrollPane左側滾動條
- 22. jScrollPane - 超薄滾動條
- 23. jscrollpane沒有滾動條
- 24. jscrollpane垂直滾動條
- 25. jScrollPane滾動條問題
- 26. JScrollPane滾動條跳到JEditorPane.setText()
- 27. jScrollPane horyzontal滾動條頂部
- 28. jscrollpane,滾動條角度
- 29. jScrollPane - 滾動條doens't顯示
- 30. 事件處理程序中的滾動條可見性檢測
好, 奇怪的。感謝您的快速回復。我試過了,確實有效。唉,在我的應用程序中,添加更改偵聽器不起作用。我會從這裏工作。 – xmjx
對於一些奇怪的原因,輸出到stdout和stderr都不會顯示在偵聽器中。所以它基本上是一個調試問題。再次感謝。 – xmjx