↓↓クリックして頂けると励みになります。
【41 | Swingメニュー】 << 【ホーム】 >> 【43 | ダイアログウィンドウ】
Swingの軽量コンテナは、コンポーネント(コンテナ)を含有出来ますが、今回はそれらコンポーネントを特徴的に表示する以下の軽量コンテナついて説明します。
クラス | 機能の概要 |
---|---|
JScrollPane | スクロールの実現 |
JTabbedPane | 複数のコンポーネントをタブ付にして、それから1つを表示 |
JSplitPane | 左右(上下)にコンポーネントを配置して、分割線で区切る |
JDesktopPane | 仮想デスクトップを作り、「内部フレーム」を配置 |
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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」の画像が表示され、スクロールバーが上下に付きます。
~/Desktop/Programming/JP $ javac SwingJScrollPaneTest.java ~/Desktop/Programming/JP $ java SwingJScrollPaneTest
Visual Studio Codeで以下のプログラムを作成ます。
新規作成 【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にコンポーネントを配置するには、「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 |
タブに色を設定するには、以下のメソッドを使用します。
作成したプログラムを実行します。
タブ付のボタンが2つ表示されます。
~/Desktop/Programming/JP $ javac SwingJTabbedPaneTest1.java ~/Desktop/Programming/JP $ java SwingJTabbedPaneTest1
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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も複数の形式でコンストラクタを使えます。
分割線は各コンポーネントの「最小サイズ」まで移動します。
コンポーネントの最小サイズの設定はJComponentの「
setMinimumSize(Dimension)
」メソッドです。初期設定では左(上)のコンポーネントの最小サイズの位置に分割線が置かれます。
分割線の位置指定は
setDividerLocation(int)
で行えます。コンポーネントを左(上)に配置するには
setTopComponent()
, setLeftComponent()
のいずれかを指定します。また、右(下)に配置するには
setBottomComponent()
, setRightComponent()
のいずれかを指定します。作成したプログラムを実行します。
区切り線で左右に分割されたボタンが2つ表示されます。
~/Desktop/Programming/JP $ javac SwingJSplitPaneTest1.java ~/Desktop/Programming/JP $ java SwingJSplitPaneTest1
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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」のみ最大化と終了も可能です。
~/Desktop/Programming/JP $ javac SwingJDesktopPaneTest.java ~/Desktop/Programming/JP $ java SwingJDesktopPaneTest
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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」「ViewPortLayout」は通常内部的に扱われるレイアウトマネージャーです。
「SpringLayout」は他のウィンドウマネージャーとは違いコンポーネントを自動的に配置してくれませんので、プログラムで設定する必要があります
BoxLayoutは縦(横)にコンポーネントを配した「ボックス」を複数配置することでレイアウトを行います。
BoxLayoutでコンポーネントを配置する場合、次の4種類の中から選択します。
X_AXIS | 左から右へ水平に配置 |
Y_AXIS | 上から下へ垂直に配置 |
LINE_AXIS | ComponentOrientationのプロパティ(単語を行に配置する方法。水平方向、 垂直方向。水平方向の場合は左から右、あるいは右から左)に基づいて配置 |
PAGE_AXIS | ComponentOrientationのプロパティ(テキストをページに配置する方法。縦書きなら水平方向、横書きなら垂直方向。水平方向の場合は左から右、あるいは右から左)に基づいて配置 |
パネルを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つ表示されます。
~/Desktop/Programming/JP $ javac SwingBoxPanel.java ~/Desktop/Programming/JP $ java SwingBoxPanel
【41 | Swingメニュー】 << 【ホーム】 >> 【43 | ダイアログウィンドウ】
↓↓クリックして頂けると励みになります。