表示方法の変更(項目の並べ方)

広告

今までは縦に並べるだけでしたが、JDK1.4から並べる方向を指定できるようになりました。

リストのセルの配置方法を定義します。4 つのセルを持つ JList の場合、次
の方法のどれかで配置できます。

これらは次の値に対応します。 

  値                     説明
  ----------------------------------------------------------------------
  JList.VERTICAL         セルは 1 つの列で垂直方向に配置される
  JList.HORIZONTAL_WRAP  セルは水平方向に配置され、必要に応じて次の行へ
                         折り返される。
                         使用する行数は、0 より大きい場合 getVisibleRowCount
                         で定義され、そうでない場合は JList の幅で指定さ
                         れる
  JList.VERTICAL_WRAP    セルは垂直方向に配置され、必要に応じて次の列へ
                         折り返される。
                         使用する行数は、0 より大きい場合 getVisibleRowCount
                         で定義され、そうでない場合は JList の高さで指定
                         される

このプロパティのデフォルト値は JList.VERTICAL です。 

layoutOrientation が JList.HORIZONTAL_WRAP、JList.VERTICAL、または
JList.VERTICAL_WRAP のどれでもない場合は、IllegalArgumentException が
スローされます。

パラメータ:
  layoutOrientation - 新しい orientation。JList.HORIZONTAL_WRAP、
    JList.VERTICAL、または JList.VERTICAL_WRAP のうちの1つ

3つの値から1つ選択します。

"JList.VERTICAL"の場合は今までと同じで単に縦に並べます。"JList.HORIZONTAL_WRAP"の場合は下記のように並べられます。

項目0  項目1  項目2
項目3  項目4  項目5

この値を選んだ場合は、まず横に並べて行きます。横方向に何個並べるかは縦に何個並べるかで自動的に決まります。

"JList.VERTICAL_WRAP"の場合は下記のように並べられます。

項目0  項目2  項目4
項目1  項目3  項目5

この値を選んだ場合は、まず縦に並べて行きます。横方向に何個並べるかは縦に何個並べるかで自動的に決まります。

注意が必要なのは、まず縦方向に何行並べるかを指定しておかないと、デフォルトの値である8行が使われます。その為、幅にどれだけ余裕があっても項目が8個以下の場合には縦に並べられてしまいます。

縦方向に何行並べるかを指定するには"setVisibleRowCount"メソッドを使います。

スクロールバーを使用せずに表示できるリスト内の行の適切な数を設定します。
この値は、もっとも近い JViewport の上位オブジェクト (存在する場合のみ)
によって決定されます。このプロパティ値は、JList の 
preferredScrollableViewportSize の値にのみ影響します。 

このプロパティのデフォルト値は 8 です。

パラメータ:
  visibleRowCount - 可視行の適切な数を指定する整数

では、これらのメソッドをまとめて試してみましょう。ボタンを押すことで表示方法を切り替えます。

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

public class JListSample extends JFrame implements ActionListener{

  protected JList list;

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

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

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

  JListSample(String title){
    setTitle(title);

    /* JListの初期データ */
    Vector<String> initData = new Vector<String>();
    StringBuffer sb;
    for (int i = 0 ; i < 15 ; i++){
      sb = new StringBuffer();
      sb.append("項目");
      sb.append(i);
      initData.add(new String(sb));
    }
    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);

    JButton verticalButton = new JButton("vertical");
    verticalButton.addActionListener(this);
    verticalButton.setActionCommand("verticalButton");

    JButton hwrapButton = new JButton("hwrap");
    hwrapButton.addActionListener(this);
    hwrapButton.setActionCommand("hwrapButton");

    JButton vwarpButton = new JButton("vwarp");
    vwarpButton.addActionListener(this);
    vwarpButton.setActionCommand("vwarpButton");

    JPanel p2 = new JPanel();
    p2.add(verticalButton);
    p2.add(hwrapButton);
    p2.add(vwarpButton);

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

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

    if (actionCommand.equals("verticalButton")){
      list.setVisibleRowCount(8);
      list.setLayoutOrientation(JList.VERTICAL);
    }else if (actionCommand.equals("hwrapButton")){
      list.setVisibleRowCount(2);
      list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    }else if (actionCommand.equals("vwarpButton")){
      list.setVisibleRowCount(2);
      list.setLayoutOrientation(JList.VERTICAL_WRAP);
    }else{
      return;
    }
  }
}

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

デフォルト又はverticalボタンを押した場合:

表示方法の変更(項目の並べ方)

hwrapボタンを押した時:

表示方法の変更(項目の並べ方)

vwarpボタンを押した時:

表示方法の変更(項目の並べ方)

項目が多い場合、"JList.VERTICAL"は縦方向に拡張され、"JList.HORIZONTAL_WRAP"と"JList.VERTICAL_WRAP"の場合は横方向へ拡張されます。

リストの幅や高さに合わせて自動的に縦方向及び横方向にどれだけ表示するかを任せてしまうこともできます。setVisibleRowCountメソッドで0を指定することで可能です。具体的には下記のサンプルを見てください。

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

public class JListSample extends JFrame implements ActionListener{

  protected JList list;

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

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

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

  JListSample(String title){
    setTitle(title);

    /* JListの初期データ */
    Vector<String> initData = new Vector<String>();
    StringBuffer sb;
    for (int i = 0 ; i < 30 ; i++){
      sb = new StringBuffer();
      sb.append("項目");
      sb.append(i);
      initData.add(new String(sb));
    }
    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);

    JButton verticalButton = new JButton("vertical");
    verticalButton.addActionListener(this);
    verticalButton.setActionCommand("verticalButton");

    JButton hwrapButton = new JButton("hwrap");
    hwrapButton.addActionListener(this);
    hwrapButton.setActionCommand("hwrapButton");

    JButton vwarpButton = new JButton("vwarp");
    vwarpButton.addActionListener(this);
    vwarpButton.setActionCommand("vwarpButton");

    JPanel p2 = new JPanel();
    p2.add(verticalButton);
    p2.add(hwrapButton);
    p2.add(vwarpButton);

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

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

    if (actionCommand.equals("verticalButton")){
      list.setVisibleRowCount(8);
      list.setLayoutOrientation(JList.VERTICAL);
    }else if (actionCommand.equals("hwrapButton")){
      list.setVisibleRowCount(0);
      list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    }else if (actionCommand.equals("vwarpButton")){
      list.setVisibleRowCount(0);
      list.setLayoutOrientation(JList.VERTICAL_WRAP);
    }else{
      return;
    }
  }
}

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

hwrapボタンを押した時:

表示方法の変更(項目の並べ方)

vwarpボタンを押した時:

表示方法の変更(項目の並べ方)

"JList.HORIZONTAL_WRAP"の場合は、横幅いっぱいに表示して表示し切れなくなったら次の行に移ります。"JList.VERTICAL_WRAP"の場合は縦に並べるだけ並べて表示し切れなくなったら次の列に移ります。

( Written by Tatsuo Ikura )

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