Swingを使ったアプリケーションとは

広告

Swingを使用することでGUIを使ったアプリケーションを作成することができます。ここでは簡単にSwingを使ったアプリケーションの特徴について解説します。

1.コマンドラインプログラムとの違い
2.コンテナとコンポーネント
3.レイアウトマネージャーによるコンポーネントの配置
4.イベントを使った処理の実行

コマンドラインで動作するプログラムとは、例えば次のようなプログラムです。

Sample1_1.java

class Sample1_1{
  public static void main(String args[]){
    int sum = 0;

    for (int i = 1; i <= 1000; i++){
      sum += i;
    }

    System.out.println("合計は" + sum + "です");
  }
}

このプログラムでは1から1000までを順に加算した結果を出力します。実際に実行した結果は次のようになります。

p1-1

このようにプログラムを実行すると、定められた手順を順に実行し場合によっては結果を出力した後でプログラムが終了します。つまり実行>結果出力>終了までが一連の流れとして行われます。もちろんこのような単純なものばかりではなく、ユーザーからの入力を待って処理を実行するものもありますし、終了の指示を出すまで繰り返しプログラムを実行するものもありますが、基本的にコマンドラインでのプログラムは先ほどのサンプルのような動作をします。

-- --

SwingはGUIのアプリケーションを作成するために使用されるものです。GUIとはGraphical User Interfaceのことでフレームを持ったアプリケーションでボタンやテキストボックスなどグラフィカルな部品を使って操作を行うものです。

Swingを使ったプログラムとは、例えば次のようなプログラムです。

Sample1_2.java

import javax.swing.JFrame;

class Sample1_2{
  public static void main(String args[]){
    JFrame frame = new JFrame("タイトル");
    frame.setBounds(100, 100, 400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

このプログラムではフレームを1つ作成して表示するだけのプログラムです。実際に実行した結果は次のようになります。

p1-2

このプログラムはフレームを画面上に表示させて終了したわけではありません。現時点でもプログラムは実行されたままです。実際プログラムを実行したコマンドプロンプトでは、まだコマンドプロンプトに制御は戻ってきていません。

利用者はWindows画面に現れたフレームに対して様々な動作を行います。例えばテキストボックスに文字を入力したり、リストから項目を選択したり、ボタンを押したりします。どんな部品をフレームに表示するのか、そして利用者が行った操作に応じて何を行うのかをSwingを使ったプログラムでは記述していくことになります。

Swingを使ったプログラムではベースとなるウィンドウを作成します。そしてウィンドウの中に様々な部品を追加していくことになります。そこでまずはベースとなるウィンドウを作成しなければいけませんが、Swingではフレーム、ダイアログ、アプレットの3種類を大元のウィンドウとして利用することができます。

フレームはJFrameクラス、ダイアログはJDialogクラス、アプレットはJAppletクラスで定義されており、こららのクラスからオブジェクトを作成することで土台が作成されます。これらはContainerクラスのサブクラスとして定義されています。Swingでは他のコンポーネントを追加することできるオブジェクトをコンテナと呼んでおり、特にこの3つのクラスのオブジェクトはトップレベルコンテナと呼ばれます。

下記はトップレベルコンテナの一つであるJFrameクラスのオブジェクトを作成しています。

Sample1_3.java

import javax.swing.JFrame;

class Sample1_3{
  public static void main(String args[]){
    JFrame frame = new JFrame("タイトル");
    frame.setBounds(100, 100, 400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
  }
}

p1-3

トップレベルコンテナを作成したら、次にコンポーネントを作成してトップレベルコンテナに追加していきます。コンポーネントはJComponentクラスのサブクラスとして定義されており、ボタンやラベルなど用途に応じて数多くのクラスが定義されています。

例えばコンポーネントの一つでありボタンを作成するためのクラスであるJButtonクラスのオブジェクトを作成してフレームに追加するには次のように記述します。

Sample1_4.java

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Container;
import java.awt.BorderLayout;

class Sample1_4{
  public static void main(String args[]){
    JFrame frame = new JFrame("タイトル");
    frame.setBounds(100, 100, 400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JButton button = new JButton("Push");

    frame.getContentPane().add(button, BorderLayout.NORTH);
    frame.setVisible(true);
  }
}

実行してみるとボタンがウィンドウの上部に表示されていることが分かります。

p1-4

Swingのアプリケーションではこのようにコンテナを作成し、部品となるコンポーネントを追加していくことになります。

ボタンやラベルなどのコンポーネントをフレームなどの追加していく場合、Swingではレイアウトマネージャーと呼ばれるものを使います。細かいサイズや位置を指定するのではなく、複数用意されたレイアウトマネージャーの中から希望する画面構成にあったものを選び、実際の配置はレイアウトマネージャーに任せます。

例えばフレームの下部にボタンを横一列に並べたい場合にはFlowLayoutと呼ばれるレイアウトマネージャーが適しています。FlowLayoutはコンポーネントを追加した順に右へ右へと追加していくレイアウトマネージャーです。またこのレイアウトマネージャーは追加されるコンポーネントのサイズを自動調整しません。

Sample1_5.java

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

class Sample1_5{
  public static void main(String args[]){
    JFrame frame = new JFrame("タイトル");
    frame.setBounds(100, 100, 400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel p = new JPanel();
    JButton btn1 = new JButton("Save");
    JButton btn2 = new JButton("Cancel");
    JButton btn3 = new JButton("Help");

    p.add(btn1);
    p.add(btn2);
    p.add(btn3);

    frame.getContentPane().add(p, BorderLayout.SOUTH);
    frame.setVisible(true);
  }
}

実行してみると3つのボタンが横に並んで表示されています。

p1-5

また画面全体の大まかなレイアウトを行いたい場合にはBorderLayoutと呼ばれるレイアウトマネージャーが適しています。BorderLayoutは画面全体を5つの領域に分けます。そして各領域にコンポーネントを配置していきます。コンポーネントを追加する時はどの位置に配置したいのかを合わせて指定しなければなりません。このレイアウトマネージャーの場合には追加されるコンポーネントのサイズを自動的に調整します。

Sample1_6.java

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

class Sample1_5{
  public static void main(String args[]){
    JFrame frame = new JFrame("タイトル");
    frame.setBounds(100, 100, 400, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel p = new JPanel();
    JButton btn1 = new JButton("Save");
    JButton btn2 = new JButton("Cancel");
    JButton btn3 = new JButton("Help");

    p.add(btn1);
    p.add(btn2);
    p.add(btn3);

    frame.getContentPane().add(p, BorderLayout.SOUTH);
    frame.setVisible(true);
  }
}

実行してみると5つのボタンが上下左右中央に配置されて表示されています。

p1-6

このようにレイアウトマネージャーをコンテナに設定すると、追加されたコンポーネントがどのように配置されるのか、そして配置されるコンポーネントのサイズをどうするのかが自動的に決まります。

Swingではフレーム上に配置されたボタンが押された時に何らかの処理を実行したい場合、イベントと呼ばれる機能を使います。

アプリケーションは様々なコンポーネントから構成されていますが、コンポーネントの上をマウスが動いたりキーボードから文字が入力されたりと利用者が何らかの操作を行った時に、その操作に応じてイベントと呼ばれるものを発行します。イベントはコンポーネント毎に発行されますし、利用者の様々な操作に応じて別々のイベントが発行されるため数多くのイベントが常に発行されています。

イベントの中で必要なものだけを受け取るようにすることができます。例えばボタンをクリックされたイベントは欲しいけれど、ボタンの上をマウスが移動したイベントは必要ないのであれば、ボタンのクリックのイベントだけを受け取りように設定しておきます。そしてクリックされたイベントを受け取った時に処理を記述しておきます。

次の例ではボタンがクリックされた時のイベントを受け取るように設定し、クリックされたらダイアログを表示しています。

Sample1_7.java

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

class Sample1_7 extends JFrame implements ActionListener{
  public static void main(String args[]){
    Sample1_7 frame = new Sample1_7("タイトル");
    frame.setVisible(true);
  }

  Sample1_7(String title){
    setTitle(title);
    setBounds(100, 100, 400, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel p = new JPanel();
    JButton btn = new JButton("Push");
    btn.addActionListener(this);

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

  public void actionPerformed(ActionEvent e){
    JLabel label = new JLabel("Push A Button");
    JOptionPane.showMessageDialog(this, label);
  }
}

実行してみるとボタンが1つ表示されています。

p1-7

ボタンをクリックすると、クリックされたというイベントをプログラムは受け取り、ダイアログを表示させてメッセージを表示します。

p1-8

-- --

Swingを使って作成するアプリケーションについて簡単に解説しました。

( Written by Tatsuo Ikura )