ビューポートでコンポーネントが表示されている位置を取得する

広告

ビューポート内でコンポーネントがスクロールされた時に、コンポーネントのどの部分がビューポートに表示されているかの位置を取得する方法を確認します。

ビューポートの左上の位置に表示されているコンポーネントの座標(コンポーネントの左上を原点とした場合の座標)を取得します。取得するにはJViewportクラスで用意されている「getViewPosition」メソッドを使います。

ビューポートの左上隅に表示されるビューの座標を返します。ビューがない場
合は 0,0 を返します。

戻り値:
  左上の座標を示す Point オブジェクト

戻り値としてビューポートの左上に現在表示されているコンポーネントの座標を取得します。値はPointクラスのオブジェクトとして取得できます。Pointクラスについては『Pointクラス』を参照して下さい。

実際の使い方は次のようになります。

JScrollPane scrollpane = new JScrollPane();
JViewport view = scrollpane.getViewport();

ImageIcon icon = new ImageIcon("./img/hana.jpg");
JLabel label = new JLabel(icon);
view.setView(label);

Point point = view.getViewPosition();

サンプルプログラム

では簡単なサンプルを作成して試してみます。今回はビューポートの表示位置が変わったら値を取得して表示するようにしています。イベント処理としてChangeEventを利用していますが、イベント処理については別のページで詳しく見ていきます。

JScrollPaneTest9.java

import javax.swing.*;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Point;
import javax.swing.event.*;

public class JScrollPaneTest9 extends JFrame implements ChangeListener{

  JViewport view;
  JLabel positionLabel;

  public static void main(String[] args){
    JScrollPaneTest9 frame = new JScrollPaneTest9();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 300, 200);
    frame.setTitle("タイトル");
    frame.setVisible(true);
  }

  JScrollPaneTest9(){
    JScrollPane scrollpane = new JScrollPane();
    scrollpane.setPreferredSize(new Dimension(200, 120));

    view = scrollpane.getViewport();

    ImageIcon icon = new ImageIcon("./img/hana.jpg");
    JLabel label = new JLabel(icon);
    view.setView(label);

    view.addChangeListener(this);

    positionLabel = new JLabel("位置を表示");

    JPanel panel = new JPanel();
    panel.add(scrollpane);

    getContentPane().add(panel, BorderLayout.CENTER);
    getContentPane().add(positionLabel, BorderLayout.PAGE_END);
  }

  public void stateChanged(ChangeEvent e){
    Point point = view.getViewPosition();
    positionLabel.setText("x:" + point.x + ", y:" + point.y);
  }
}

上記をコンパイルした後で実行すると次のように表示されます。

コンポーネントが表示されている位置を取得する

スクロールバーを動かしてビューポート内に表示されているコンポーネントの位置を変更すると、その時表示されているコンポーネントの位置をラベルに表示します。

コンポーネントが表示されている位置を取得する

コンポーネントが表示されている位置を取得する

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)