1

JScrollPaneユーザーがスクロールしたときからイベントを処理する必要があります。ここでは、Vertical/Horizo​​ntalScrollBaraddAdjustmentListenerのいずれかに使用することをお勧めします。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);
            }
        });
    }
}
4

1 に答える 1

6

答えの一部(コメントのコードはただ...そして私がコメントで間違っていたことに気づきました;-)

メソッドscrollRectToVisibleは、呼び出されたコンポーネントの座標系でRectangleを取ります。完全に表示されるように子をスクロールするには、基本的に2つのオプションがあります(そのうちの1つを使用します)。

// either call on child with zero offset
child.scrollRectToVisible(new Rectangle(child.getSize());
// or call on child's parent with child bounds
child.getParent().scrollRectToVisible(child.getBounds());
于 2012-11-29T13:39:06.057 に答える