リスト項目の表示位置の移動

広告

次に指定した項目を見える位置に表示する方法についてです。項目名で選択した場合は自動的に見える位置までリストをスクロールする機能がありましたが、Indexで選択した場合はそのような機能がありませんでした。

JListクラスで用意されている"ensureIndexIsVisible"メソッドを使うことで、指定したIndex番号の項目を表示されるように自動的にスクロールさせることができます。

ビューポートをスクロールし、指定されたセルを完全に可視にします。このメ
ソッドを有効にするには、JViewport 内で JList を表示する必要があります。 

パラメータ:
  index - 可視にするセルのインデックス

選択の際にだけ使うものではないですが、見えない位置にある項目を表示される位置まで自動でスクロールしたい場合に利用します。

ではこれも簡単なサンプルで試してみましょう。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;

public class JListSample extends JFrame implements ActionListener{

  protected JList list;
  protected JTextField selectText;

  public static void main(String[] args){
    JListSample test = new JListSample("JListSample");

    /* 終了処理を変更 */
    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    test.setBounds( 10, 10, 250, 180);
    test.setVisible(true);
  }

  JListSample(String title){
    setTitle(title);

    /* JListの初期データ */
    String[] initData = {"Blue", "Green", "Red", "Whit", "Black"};
    list = new JList(initData);

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(list);
    sp.setPreferredSize(new Dimension(200, 80));

    JPanel p = new JPanel();
    p.add(sp);

    getContentPane().add(p, BorderLayout.CENTER);

    selectText = new JTextField(2);

    JButton selectButton = new JButton("selectButton");
    selectButton.addActionListener(this);
    selectButton.setActionCommand("selectButton");

    JPanel p2 = new JPanel();
    p2.add(selectText);
    p2.add(selectButton);

    getContentPane().add(p2, BorderLayout.SOUTH);
  }

  public void actionPerformed(ActionEvent e){
    String actionCommand = e.getActionCommand();

    int select = Integer.parseInt(selectText.getText().toString());

    if (actionCommand.equals("selectButton")){
      list.setSelectedIndex(select);
      list.ensureIndexIsVisible(select);
    }else{
      return;
    }
  }
}

実行結果は下記のようになります。

リスト項目の表示位置の移動

今度は見えない位置にある項目を選択した場合でも、見える位置まで自動的にスクロールしてくれます。

( Written by Tatsuo Ikura )

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