JFrameクラスを継承したクラスを定義する

広告

Swingを使ったグラフィカルなアプリケーションを作成する場合、JFrameをアプリケーションの土台として利用し様々な部品を追加していくというのが基本的な流れとなります。ここまでに説明したメソッドによって最も基本的なフレームを作成することはできました。

import javax.swing.JFrame;

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

上記ではJFrameクラスのオブジェクトを作成後、オブジェクトに対して様々なメソッドを実行しています。

今度はJFrameクラスを継承したサブクラスを作成し、サブクラスのコンストラクタの中で様々な初期化の処理を行ってみます。

import javax.swing.JFrame;

class Sample{
  public static void main(String args[]){
    MyFrame frame = new MyFrame("タイトル");
    frame.setVisible(true);
  }
}

class MyFrame extends JFrame{
  MyFrame(String title){
    setTitle(title);
    setBounds(100, 100, 200, 160);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

上記ではJFrameクラスのサブクラスを作成しタイトルの設定やサイズの変更などをコンストラクタの中で記述しています。そしてmainメソッドでは定義したサブクラスのオブジェクトを作成した上で表示するいう手順を取っています。

JFrameクラスで用意されているメソッドをそのまま使うだけでプログラムが記述できるケースは少なく、基本的にはJFrameクラスのサブクラスを作成した上でJFrameクラスのメソッドを拡張したり新規のメソッドを追加していくことになります。

ただし、上記のようにした場合、mainメソッドが含まれるSampleクラスは単にmainメソッドが存在するだけのクラスとなってしまいます。その為、通常はmainメソッドが含まれるクラスそのものをJFrameクラスのサブクラスにする方法が取られます。

import javax.swing.JFrame;

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

  Sample(String title){
    setTitle(title);
    setBounds(100, 100, 200, 160);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

慣れていないと少々分かりにくいですが、JFrameクラスを継承したサブクラスを定義し、そのクラスの中にmainメソッドが記述されています。今後はこの形式でプログラムを作成していきます。

サンプル

では実際に試してみます。

SSample5_1.java

import javax.swing.JFrame;

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

  SSample5_1(String title){
    setTitle(title);
    setBounds(100, 100, 200, 160);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

ではコンパイルを行った上で実行してみます。

p5-1

記述方法を変更しただけですので、今までと実行結果は同じです。

( Written by Tatsuo Ikura )