JScrollPane
ユーザーがスクロールしたときからイベントを処理する必要があります。ここでは、Vertical/HorizontalScrollBaraddAdjustmentListener
のいずれかに使用することをお勧めします。JViewport
違いはありますか?どちらの方法を選べばいいですか?
scrollRectToVisible
同じように使用したいのですが、この方法で動作するJScrollPane
ことを期待する必要がありますか?AdjustmentListener
またscrollRectToVisible
、必要な長方形を表示するために最小限のスクロールを実行しようとするのか、それとも途中で表示されるようにするのJViewport
か疑問に思います。
UPD:要件:
1)多くのJLabel(ImageIcon)を持つ1つのJPanelを持つJScrollPaneがあるため、それらの一部は表示されません。
2)ネットワークイベントが発生したら、JLabelの1つをユーザーに表示する(表示する)必要があります。私が最初に表示されていない場合、JScrollPaneは自動的にスクロールするはずです。だから私は言及しscrollRectToVisible
ます。
3)ImageIconを含むJLabelの上に、この要素に何が起こったかを説明するメッセージを表示する必要があります。メッセージは現在、階層がはるかに高いJLayeredPaneのおかげで、floatを使用した別のJLabelとして実装されています。ここでの問題は、ユーザーがJScrollPaneをスクロールすると、それに応じてフローティングJLabelが移動し、対応するJLabel(ImageIcon)の上に移動する必要があることです。
UDP2:SSCCE
フローティングJLabelはまだ実装していませんが、インデックス11のラベルscrollRectToVisible
は半分トリミングされているため、どのように反応するかはわかりません。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class JScrollPaneTest {
protected ArrayList<JLabel> labels = new ArrayList<JLabel>();
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JScrollPaneTest();
}
});
}
public JScrollPaneTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel panel1 = new JPanel ();
panel1.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
for (int i = 0; i < 20; i++) {
JLabel label = new JLabel(" | Label" + i + " | ");
panel1.add(label, gbc);
labels.add(label);
}
panel1.addMouseListener(new MouseAdapter(){
public void mousePressed (MouseEvent me) {
JLabel label = labels.get(11);
label.scrollRectToVisible(label.getBounds());
}
});
JScrollPane pane = new JScrollPane(panel1) {
private static final long serialVersionUID = 1L;
@Override
public Dimension getPreferredSize() {
return new Dimension(600, 400);
}
};
pane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
System.out.println("adjustmentValueChanged: " + e);
}
});
frame.getContentPane().add(pane);
frame.pack();
frame.setVisible(true);
}
});
}
}