学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その41 表示のための軽量コンテナを利用したプログラム

<<前  [TOP]  次>>


Swingの軽量コンテナは、コンポーネント(コンテナ)を含有出来ますが、今回はそれらコンポーネントを特徴的に表示する以下の軽量コンテナついて説明します。

クラス機能の概要
JScrollPaneスクロールの実現
JTabbedPane複数のコンポーネントをタブ付にして、それから1つを表示
JSplitPane左右(上下)にコンポーネントを配置して、分割線で区切る
JDesktopPane仮想デスクトップを作り、「内部フレーム」を配置


以下のサンプルプログラムを作成してみましょう。


SwingJScrollPaneTest.java 直

/** JScrollPaneの利用 */

import javax.swing.*;

public class SwingJScrollPaneTest {

	private JScrollPane scp;

	/** コンストラクタ */
	public SwingJScrollPaneTest() {

		// イメージを生成後、ラベルに貼り付け 
		ImageIcon image = new ImageIcon("contents01.jpg");
		JLabel label = new JLabel(image);	// ツールチップの設定

		// JscrollPaneにラベルを配置
		scp = new JScrollPane(label);

		// △▽を押したときの移動量の設定(JScrollBarのメソッド)
		scp.getVerticalScrollBar().setUnitIncrement(20);
	}

	/** main() */
	public static void main(String[] args) {

		SwingJScrollPaneTest test = new SwingJScrollPaneTest();

		JFrame frame = new JFrame("JScrolPaneTest");
		frame.setSize(400, 300);

		//[閉じる]ボタンで終了
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

		//コンテンツ・ぺインにパネルとツールバーを設定
		frame.getContentPane().add(test.scp, "Center");
		frame.setVisible(true);
	}
}



なお、このプログラムを実行するには、以下の「contents01.jpg」が必要ですので、プログラムを作成するフォルダに保存しておいてください。
contents01.jpg 直


スクロールを実現するにはJScrollPaneを利用するのが便利です。
ただし、重量コンポーネントには使用できません。


JScrollPaneは基本的にJViewportで実現される「ビュー」とJScrollBarで実現される「スクロールバー」によって構成されています。


「ビュー」は生成されたコンポーネントの一部分を見ることができる窓と考えれぱ良いでしょう。
「ビュー」を上に移動させればコンポーネントの上の風景が、下に移動させれば下の風景が窓から覗けます。


「スクロールバー」は、垂直方向、水平方向に付けられます。(下図◎)
スクロールバーの移動に対応して、自動的に「ビュー」が移動されます。


JScrollPaneの初期設定では、四隅に空のJPanelが入ります。(下図☆)
行列のヘッダーは「setRowHeaderView(コンポーネント)」のように設定ができます。

列ヘッダー

  ヘ
  ッ
  ダ
  |
             
ビュー



スクロールペインは以下のように使用します。

JLabel label = new JLabel("ラベル");
JScrollPane scp = new JScrollPane(label);    //ラベルをスクロールペインに設定



スクロール時の移動量などの設定は、JScrollBarで設定されているメソッドを利用することが多いでしょう。
例えば、垂直スクロールバーの「△▽」が押された場合の移動量を設定するには、以下のようにすれば良いです。

JScrollPane scp = new JScrollPane(label);    //ラベルをスクロールペインに設定
scp.getVerticalScrollBar().setUnitlncrement(20);



通常スクロールを利用する場合は、このようにJScrollPaneを利用すれば良いです。
ただし、完全に構築された物に対してビューを調整しながら表示するので、大量のデータを持つような例では不向きな場合があります。


また、軽量コンテナの中(JList, JTable, JTextComponent, JTree)には、ScrollableインタフェースでJScrollPaneに情報を提供するものもあります。


ではサンプルプログラムを実行してみましょう。
「contents01.jpg」の画像が表示され、スクロールバーが上下に付きます。








以下のサンプルプログラムを作成してみましょう。


SwingJTabbedPaneTest1.java 直

/**JTabbedPaneの利用*/

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

public class SwingJTabbedPaneTest1 {

	private JTabbedPane tp;

	/**コンストラクタ*/
	public SwingJTabbedPaneTest1() {

		//ボタンを2つ生成
		JButton b1 = new JButton("Button1");
		JButton b2 = new JButton("Button2");

		//JTabbedPaneを生成
		tp = new JTabbedPane();

		//TabbedPaneにボタンを付加
		tp.addTab("Button1", b1);
		tp.addTab("Button2", b2);

		//Button2のタブに色を設定
		tp.setForegroundAt(1, Color.red);
		tp.setBackgroundAt(1, Color.yellow);
	}


	/**main()*/
	public static void main(String[] args) {
		SwingJTabbedPaneTest1 test = new SwingJTabbedPaneTest1();

		JFrame frame = new JFrame("JTabbedPaneTest1");
		frame.setSize(400, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(test.tp, "Center");
		frame.setVisible(true);
	}
}



複数のコンポーネントをタブ付きで表示し、そのタブから1つを選択して、コンポーネントを表示させるには、JTabbedPaneを用います。
下記は上にタブをつけています。

JButton button1 = new JButton("ボタン1");
JButton button2 = new JButton("ボタン2");
JTabbedPane tp = new JTabbedPane();
tp.addTab("Button1", b1);
tp.addTab("Button2", b2);



この他のコンストラクタとしては以下のものがあります。

  • JTabbedPane(int タブ位置):タブ位置を指定します。タブ位置は、JTabbedPane.TOP, JTabbedPane.BOTTOM, JTabbedPane.LEFT, JTabbedPane.RIGHTで表します。
  • JTabbedPane(int タブ位置, int 折り返し処理設定):タブ位置と、コンテナ上にコンポーネントが入りきらなかった場合の折り返しの拠理を指定します。折り返して配置するにはJTabbedPane.SCROLL_TAB_LAYOUTを指定します。


    JTabbedPaneにコンポーネントを配置するには、「add」「addTab」「insertTab」を用います。
    add(Component)追加するコンポーネント
    (Component, int)コンポーネントと、index
    (String, Component)タブの文字列と、コンポーネント
    addTab(String, Component)タブの文字列と、コンポーネント
    (String, Icon, Component)上の他にイメージ
    (String, Icon, Component, String)上の他にツールチップ
    insertTab(String, Icon, Component, String, int)上の他にindex


    タブに色を設定するには、以下のメソッドを使用します。
  • setForegroundAt(int index, Color)--タブの前景色
  • setBackgroundAt(int index, Color)--タブの背景色


    では、サンプルプログラムを実行してみましょう。
    タブ付のボタンが2つ表示されます。








    以下のサンプルプログラムを作成してみましょう。


    SwingJSplitPaneTest1.java 直

    /**JSplitPaneの利用*/
    
    import javax.swing.*;
    
    public class SwingJSplitPaneTest1 {
    
    	private JSplitPane spp;
    
    	/**コンストラクタ*/
    	public SwingJSplitPaneTest1() {
    
    		//ボタンを2つ生成
    		JButton b1 = new JButton("Button1");
    		JButton b2 = new JButton("Button2");
    
    		//JSplitPaneの生成
    		spp = new JSplitPane();
    
    		//左にButton1を、右にButton2を設定
    		spp.setTopComponent(b1);
    		spp.setBottomComponent(b2);
    	}
    
    	/**main() */
    	public static void main(String[] args) {
    
    		SwingJSplitPaneTest1 test = new SwingJSplitPaneTest1();
    	
    		JFrame frame = new JFrame("JSplitPaneTest1");
    		frame.setSize(400, 300);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.getContentPane().add(test.spp, "Center");
    		frame.setVisible(true);
    	}
    }
    



    2つのコンポーネントを分割線によって、分けて表示するには、JSplitPaneを用いれば良いです。
    下記の例では、左と右にボタンを分割します。

    JButton button1 = new JButton("ボタン1");
    JButton button2 = new JButton("ボタン2");
    
    JSplitPane spp = new JSplitPane();
    
    spp.setTopComponent(button1);
    spp.setBottomComponent(button2);
    



    JSplitPaneも複数の形式でコンストラクタを使えます。

  • JSplitPane():自動的にボタンを生成して、左右に分割します。
  • JSplitPane(int 分割方向):JSplitPane.HORIZONTAL_SPLITで左右分割、JSplitPane.VERTICAL_SPLITで上下分割を表します。
  • JSpiltPane(int 分割方向, boolean):上の他に、分割操作の際に分割線を表示しながら移動するか否かを指定します。


    分割線は各コンポーネントの「最小サイズ」まで移動します。
    コンポーネントの最小サイズの設定はJComponentの「setMinimumSize(Dimension)」メソッドです。
    初期設定では、左(上)のコンポーネントの最小サイズの位置に分割線が置かれます。
    分割線の位置指定はsetDividerLocation(int)で行えます。
    コンポーネントを左(上)に配置するにはsetTopComponent(), setLeftComponent()のいずれかを指定します。
    また、右(下)に配置するにはsetBottomComponent(), setRightComponent()のいずれかを指定します。


    では、サンプルプログラムを実行してみましょう。
    区切り線で左右に分割されたボタンが2つ表示されます。








    以下のサンプルプログラムを作成してみましょう。


    SwingJDesktopPaneTest.java 直

    /**JDesktopPaneの利用*/
    
    import javax.swing.*;
    
    public class SwingJDesktopPaneTest {
    
    	private JDesktopPane dp;
    
    	/**コンストラクタ*/
    	public SwingJDesktopPaneTest() {
    
    		//ボタンを2つ生成
    		JButton b1 = new JButton("Button1");
    		JButton b2 = new JButton("Button2");
    
    		//内部フレームを2つ生成
    		
    		//f1は、サイズ変更、クローズ処理、最大化処理、アイコン化が不可
    		JInternalFrame f1 = new JInternalFrame("Frame1");
    		f1.setSize(200, 100);	//内部フレームのサイズ設定
    		f1.setIconifiable(true);	//後からアイコン化設定する場合の例
    		f1.getContentPane().add(b1, "Center");	//ボタンを配置
    		f1.setVisible(true);	//内部フレームを可視にする
    		
    		//f2は、サイズ変更、クローズ処理、最大化処理、アイコン化が不可
    		JInternalFrame f2 = new JInternalFrame("Frame2",true,true,true,true);
    		f2.setSize(200,100);
    		f2.getContentPane().add(b2, "Center");
    		f2.setLocation(150,150);	//位置の指定(java.awt.Componentのメソッド)
    
    		f2.setVisible(true);
    
    		//JDesktopPaneの生成
    		dp = new JDesktopPane();
    
    		//仮想デスクトップに配置
    		dp.add(f1);
    		dp.add(f2);
    	}
    
    	/**main()*/
    	public static void main(String[] args) {
    	
    		SwingJDesktopPaneTest test = new SwingJDesktopPaneTest();
    
    		JFrame frame = new JFrame("JDesktopPaneTest");
                    frame.setSize(400, 300);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(test.dp, "Center");
                    frame.setVisible(true);
            }
    }
    



    JDesktopPaneを使用することで、仮想的なデスクトップ環境を構築できます。
    仮想デスクトップに配置するのは、JInternalFrameで生成された内部フレームです。
    下の例は、「サイズ変更」「クローズ処理」「最大化」「アイコン化」を、不可とした内部フレームと、可とした内部フレームを仮想デスクトップに配置しています。

    JDesktopPane dp = new JDesktopPane();
    JInternalFrame f1 = new JInternalFrame("Frame1");
    JInternalFrame f2 = new JInternalFrame("Frame2", true, true, true, true);
    dp.add(f1);
    dp.add(f2);
    



    JInternalFrameのコンストラクタは、単に「()」から、「("タイトル", true)」、「("タイトル", false, true)」のように順に「タイトル」「サイズ変更」「クローズ処理」「最大化」「アイコン化」で指定できます。


    また上記の要素は内部フレームヘ、setResizable(boolean), setClosable(boolean), setMaximizable(boolean), setIconifiable(boolean)などと指定することも可能です。
    JInternalFrameは、JFrameと詞様にコンポーネントの追加などをすることができます。


    では、サンプルプログラムを実行してみましょう。
    フレームの中に2つのフレームボタンが表示されます。
    フレームボタンは、それぞれ最小化が可能です。
    「Frame2」のみ最大化と終了も可能です。








    以下のサンプルプログラムを作成してみましょう。


    SwingBoxPanel.java 直

    /**Boxのテスト*/
    
    import java.awt.*;
    import javax.swing.*;
    
    public class SwingBoxPanel extends JPanel {
    
    	private final int MAX_NUM = 5;	//ボタンの個数
    
    	/**コンストラクタ*/
    	public SwingBoxPanel() {
    
    		setPreferredSize(new Dimension(400, 150));
    		setBackground(Color.white);
    
    		JButton[] buttons = new JButton[MAX_NUM];
    
    		for(int i=0; i<MAX_NUM; i++) {
    			buttons[i] = new JButton("button" + i);
    		}
    
    		//垂直に配置するBoxを生成
    		Box vBox = Box.createVerticalBox();
    
    		//vboxにボタンを張り付け
    		vBox.add(buttons[0]);
    		vBox.add(buttons[1]);
    
    		//20ピクセルの不可視コンポーネントを追加
    		vBox.add(vBox.createVerticalStrut(20));
    		vBox.add(buttons[2]);
    
    		//水平に配置するBoxを生成
    		Box hBox = Box.createHorizontalBox();
    
    		//hBoxにボタンを張り付け
    		hBox.add(buttons[3]);
    
    		//50ピクセルの不可視コンポーネントを追加
    		hBox.add(hBox.createHorizontalStrut(50));
    		hBox.add(buttons[4]);
    
    		//元になるボックスを作成(水平方向に並べる)
    		Box baseBox = Box.createHorizontalBox();
    
    		//baseBoxにボックスvBoxを重ねる
    		baseBox.add(vBox);
    
    		//baseBoxにボックスhBoxを重ねる
    		baseBox.add(hBox);
    
    		//パネルにBoxを追加
    		add(baseBox);
    	}
    
    	/**main()*/
    	public static void main(String[] args) {
    
    		SwingBoxPanel panel = new SwingBoxPanel();
    
    		JFrame frame = new JFrame("BoxPanel");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.getContentPane().add(panel, "Center");
    		frame.pack();
                    frame.setVisible(true);
            }
    }
    



    Swingのレイアウトマネージャーには以下のようなものがあります。

  • BoxLayout
  • OverlayLayout
  • ScrollPaneLayout
  • SpringLayout
  • ViewPortLayout


    このうち、今回は「BoxLayout」を使用したレイアウトを取り上げました。
    ちなみに、「OverlayLayout」「ScrollPaneLayout」「ViewPortLayout」は、通常内部的に扱われるレイアウトマネージャーです。


    また「SpringLayout」は他のウィンドウマネージャーとは違い、コンポーネントを自動的に配置してくれませんので、プログラムで設定する必要があります


    BoxLayoutは縦(横)にコンポーネントを配した「ボックス」を複数配置することでレイアウトを行います。
    BoxLayoutでコンポーネントを配置する場合、次の4種類の中から選択します。
    X_AXIS左から右へ水平に配置
    Y_AXIS上から下へ垂直に配置
    LINE_AXISComponentOrientationのプロパティ(単語を行に配置する方法。水平方向、
    垂直方向。水平方向の場合は左から右、あるいは右から左)に基づいて配置
    PAGE_AXISComponentOrientationのプロパティ(テキストをページに配置する方法。縦書きなら水平方向、横書きなら垂直方向。水平方向の場合は左から右、あるいは右から左)に基づいて配置


    パネルをBoxLayoutにする方法は、以下の通りです。

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    



    通常、上記のBoxLayoutはBoxコンテナ(javax.swing.Box)によって利用されることが多いです。
    Boxの親クラスは、他のSwingコンポーネントと同様javax.swing.JComponentです。
    Boxクラスは、「glue(接着剤)」「struct(柱)」「rigid area(固定領域)」といった不可視コンポーネントを作成できます。
    ボックスに配置されたコンポーネントに対して、これら不可視コンポーネントを配置することで、位置を制御したり、空間を空けたりといったことが可能になります。

    JButton button1 = new JButton("ボタン1");
    JButton button2 = new JButton("ボタン2");
    
    Box box = Box.createHorizontalBox();    //水平方向に配置
    box.add(button1);
    
    //50ピクセルの不可視コンポーネントを配置
    box.add(box.createHorizontalStruct(50));
    box.add(button2);
    



    ではサンプルプログラムを実行してみましょう。
    いろいろな位置にボタンが5つ表示されます。








    <<前  [TOP]  次>>