私は水平な行にいくつかの画像を含む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
私はJScrollPaneのの大きさの変化を検出するためにHierarchyBoundsListener
を使用:
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. MATLABでプッシュボタンの可視性を変更するにはどうすればよいですか?
- 2. アドレスバーのURL変更の可視性を制限するにはどうすればよいですか?
- 3. vh-unitsがスクロールバーを無視しないようにするにはどうすればいいですか?
- 4. アプリケーションがドキュメントベースであるかどうかを検出するにはどうすればよいですか?
- 5. スクリプトマネージャーがページにあるかどうかを検出するにはどうすればよいですか?
- 6. タッチイベントがEditText内にあるかどうかを検出するにはどうすればよいですか?
- 7. ファイルがネットワーク上にあるかどうかを検出するにはどうすればよいですか?
- 8. 検索クエリを変更するにはどうすればよいですか?
- 9. 変数内のシンボルを無視または検出するにはどうすればよいですか?
- 10. テーブルビューでアイテムが変更されたときを検出するにはどうすればよいですか?
- 11. iOSでファイルが変更されているかどうかを検出するにはどうすればよいですか?
- 12. ListBoxにバインドされたTextBlockの可視性を設定するにはどうすればよいですか?
- 13. Windowsからファイルへの変更を検出するにはどうすればよいですか?
- 14. エンティティにバインドされたバインディングソースの変更を検出するにはどうすればよいですか?
- 15. 子アクティビティから戻ったかどうかを検出するにはどうすればよいですか?
- 16. アクションを使用してコントロールの可視性を判断するにはどうすればよいですか?
- 17. プロセスが開始されてからexe名が変更されたかどうかを検出するにはどうすればいいですか?
- 18. Cocoaを使用してファイルの名前が変更されたかどうかを検出するにはどうすればよいですか?
- 19. ListBoxの可視性をApplicationBarボタンにバインドするにはどうすればよいですか?
- 20. 顔検出の矩形をJavacvの楕円に変更するにはどうすればよいですか?
- 21. Javaクラスのフィールドの可視性を制御するにはどうすればよいですか?
- 22. CSSを使用してブラウザのスクロールバーの色を変更するにはどうすればよいですか?
- 23. このポップアップをスクロールバーにするにはどうすればよいですか?
- 24. Androidでファイルやフォルダの変更を検出するにはどうすればよいですか?
- 25. Dateオブジェクトの変更をAngular2で検出するにはどうすればよいですか?
- 26. HTMLの選択コントロールでスクロールバーのスタイルを変更するにはどうすればよいですか?
- 27. ワークシート上のフィルタが変更されたかどうかを検出するにはどうすればよいですか?
- 28. アプリケーションのクローズを検出するにはどうすればよいですか?
- 29. フラッシュのブラウザサポートを検出するにはどうすればよいですか?
- 30. IPropertyBagのプロパティを検出するにはどうすればよいですか?
オーケー、奇妙な。早速のお返事ありがとうございます。私はそれを試して、それは実際に動作します。悲しいかな、私のアプリケーションの内部では、変更リスナーを追加しても機能しません。私はここから作業します。 – xmjx
stdoutとstderrの両方に対するいくつかの奇妙な理由で、リスナーに表示されませんでした。基本的にはデバッグの問題でした。再度、感謝します。 – xmjx