スポンサードリンク

新着記事
2012/01/23スピナー についてAndroid
2011/12/30レーティングバー/Form Stuff についてAndroid
2011/12/23トグルボタン/Form Stuff についてAndroid
2011/12/18ラジオボタン/Form Stuff についてAndroid
2011/12/05チェックボックス/Form Stuff についてAndroid
2011/11/22編集テキスト(入力ボックス)/Form Stuff についてAndroid
2011/11/15カスタムボタン/Form Stuff についてAndroid
2011/09/11Time Picker についてAndroid
2011/08/31Date Picker についてAndroid
2011/08/17List View についてAndroid

java.awt.Dialog クラスの概要

2011 年 1 月 28 日 金曜日  【 カテゴリー: Java_GUI



今回は「java.awt.Dialogクラス」についてみていきます。

Dialogクラスについて

  java.lang.Object
    Ljava.awt.Component
        Ljava.awt.Container
            Ljava.awt.Window
                Ljava.awt.Dialog

Dialogのクラス階層は上記のようになります。では、Dialogクラスの概要を Java Platform SE 6ドキュメントの説明を引用しながらみていきます。

Dialog は、タイトルおよびボーダーを持つトップレベルのウィンドウであり、通常はユーザーからの入力を受け付けるために使用されます。

タイトルとボーダーをもっています。
Frameとほとんど同じですが、見た目では右上の「最小化ボタン」と「最大化」ボタンがないようです。

ダイアログのサイズには、ボーダーのために指定された領域が含まれます。ボーダー領域の寸法は getInsets メソッドを使うことにより取得できます。 ただし、ボーダー領域の寸法はプラットフォームに依存するので、pack または show のどちらかを呼び出すことによりダイアログを表示可能にしないと正確なインセット値は取得できません。

ボーダー領域の寸法はgetInsets メ ソッドで取得できるとうことだが、このメソッドはjava.awt.Componentから継承したものです。インセットを判定するメソッドで、インセットについて調べると上下左右のマージン情報を集めたものらしいです。外枠から内部コンポーネントまでの間隔です。
そのインセット情報を正しく取得するにはpack または showメソッドを呼び出すわけですが、とりあえず非表示のままだと正しく取得できないから注意してくださいと言いたいようです。

ボーダー領域はダイアログ全体のサイズに含まれているため、ダイアログの一部が不明瞭になります。 このため、サブコンポーネントを描画および表示するための領域は、左上隅の位置が (insets.left, insets.top) であり、幅 width - (insets.left + insets.right)、高さ height - (insets.top + insets.bottom) の矩形に制限されます。

ダイアログのデフォルトのレイアウトは BorderLayout です。

フレーム内にコンポーネントを並べていきますが、その並べ方の1つです。レイアウト方法はjava.awt.ContainerクラスのsetLayoutメソッドで行います。このメソッドの説明をみると「コンテナのレイアウトマネージャーを設定します。」と書かれており、引数はLayoutManagerオブジェクトです。LayoutManagerはインターフェースで、これを実装したクラスの1つに「BorderLayout」があります。フレームはこの「BorderLayout」をデフォルトに使います。
BorderLayoutクラスの説明によると、

ボーダーレイアウトは、north (上端)、south (下端)、east (右端)、west (左端)、および center (中央) という 5 つの領域に収まるように、コンポーネントを整列およびサイズ変更して、コンテナに配置します。

とのことです。レイアウトに関するクラスは後々詳しく記事にしたいと思います。

ダイアログはネイティブな装飾 (Frame と Titlebar) を持つことができ、setUndecorated でこれを無効化できます。ダイアログが displayable の状態でないときにだけ無効化できます。

setUndecoratedは、「ダイアログの装飾の有効化と無効化を切り替える」処理をする、Dialogクラスのメソッドです。「ダイアログが displayable の状態でない = 表示されていない」となるので、表示されていないときだけ無効化できます。

ダイアログの作成時には、ダイアログはその所有者として別のウィンドウを持つことができます。表示されているダイアログの所有者ウィンドウが非表示になった場合や最小化された場合、そのダイアログは自動的にユーザーに対して表示されなくなります。オーナウィンドウがまた開かれると、ダイアログは再びユーザーに対して表示されます。

コンストラクタをみると所有者となることができるのは、FrameとDialogそしてWindowクラスのインスタンスです。所有者をnull指定することで所有者なしにすることができるようですが試しにnull引数でインスタンス生成してみるとエラーになりました。調べてみるとアプレットではnull引数でも大丈夫なようです。アプレットについては後々勉強して記事にしたいと思います。

ダイアログは、モードなし (デフォルト) またはモーダルのどちらかになります。モーダルダイアログの場合、そのダイアログを所有者として生成されたウィンドウを除き、アプリケーションのほかの一部のトップレベルウィンドウに対して入力ができなくなります。

モーダルダイアログとは、そのダイアログを閉じるまで表示元のウィンドウなどを操作できなくするダイアログのようです。例えばダイアログ生成時にコンストラクタで所有者を指定しますが、モーダル設定にすると所有者のウィンドウはダイアログを閉じるまで操作できません。
またダイアログ生成時に所有者としてモーダルダイアログを指定しても、そのダイアログは操作できます。


①のフレームを所有者として②のモーダルダイアログを開きます。モーダルなので②が閉じるまで①は操作できません。②のダイアログを所有者として③のダイアログを開きます。所有者がモーダルであっても③のダイアログは操作できます。

今回はjava.awt.Dialog クラスの概要をみました。次回は詳しくクラスメンバについて見ていきたいと思います。


テンプレート内で投稿IDを取得する

2011 年 1 月 17 日 月曜日  【 カテゴリー: wordpress , テーマ編集



wordpressのテンプレートを触っていると現在表示されている投稿IDを取得したくなるときがあります。今回は投稿IDの取得方法を調査してみます。
※wordpress 3.0.2 で解析しています。

投稿を表示するテンプレートの基本構成

  • have_posts関数で投稿があるかどうか調べます。投稿の有無で投稿のある場合の処理と投稿のない場合の処理に分かれます。
  • 投稿は一覧のときは複数表示するので1つとは限りません。よって投稿がある場合、取得した投稿の分だけ繰り返し処理を行います。「while~endwhile」の間が繰り返し処理です。単体ページの場合でも繰り返しが1回であるというだけで記述は同じです。
  • 投稿IDの取得処理の記述場所ですが、まず投稿がないと駄目なので赤い枠の中になり、さらに投稿ごとに投稿IDが違うので図の青枠「各投稿の処理」部分に記述します。

投稿IDを取得する

wordpressには「the_ID」という関数があります。この関数はループ内(※上図の青枠)で使え、記事のIDを出力します。残念ながらこの関数はブラウザにIDを表示する専用で、引数により取得や表示の切り替えができませんでした。「the_ID」関数を解析してみます。

/**
 * Display the ID of the current item in the WordPress Loop.
 *
 * @since 0.71
 * @uses $id
 */
function the_ID() {
    global $id;
    echo $id;
}

the_ID」関数は wp-includes > post-template.php に記述されています。
内容はグローバル変数の$idを出力しているだけです。$idがグローバルってことはテンプレート内でも取得できるのではないかと思い上図の青枠の部分に

<?php echo $id ?>

と記述してみました。なんと取得できました。$id みたいなよく使いそうな変数をグローバルにするのかと少し不満ですが、独自プログラムを記述するときは変数IDを使わないように気をつけようと思います。

では次にこのグローバル変数idに値がどこで代入されているのか解析してみます。

/**
 * Iterate the post index in the loop.
 *
 * @see WP_Query::the_post()
 * @since 1.5.0
 * @uses $wp_query
 */
function the_post() {
    global $wp_query;
    $wp_query->the_post();
}

テンプレートでは投稿の繰り返しごとにthe_post関数が呼ばれています。
「the_post」関数は wp-includes > query.php に記述されています。

グローバルオブジェクトの the_postメソッドを呼び出しているだけなので、このメソッドについてみてきます。

function the_post() {
   global $post;
   $this->in_the_loop = true;

   if ( $this->current_post == -1 ) // loop has just started
   do_action_ref_array('loop_start', array(&$this));

   $post = $this->next_post();
   setup_postdata($post);
 }

「the_post」メソッドも wp-includes > query.php に記述されています。
WP_Queryクラス内のメソッドです。新しい投稿データを取得するメソッドのようです。

さらにsetup_postdata関数に続いているのでみてみます。

function setup_postdata($post) {
   global $id, $authordata, $day, $currentmonth, $page, $pages, $multipage, $more, $numpages;
   $id = (int) $post->ID;

この関数は長いので一部だけ抽出しました。
「the_post」メソッドも wp-includes > query.php に記述されています。
この関数は投稿データをグローバル変数に代入していく処理を行っているようです。3行目では$post->IDの値をグローバル変数idに代入しています。

この$postですが、setup_postdata関数では引数で取得するローカル変数ですが、上記the_postメソッドではグローバルで取得できてます。
ということはテンプレート内でも取得できるのではないかと思い上図の青枠の部分に

<?php echo $post->ID; ?>

と記述してみました。なんと取得できました。

最後に解析しながら気づいたのですが、wordpress関数に「get_the_ID」という関数があることがわかりました。

/**
 * Retrieve the ID of the current item in the WordPress Loop.
 *
 * @since 2.1.0
 * @uses $id
 *
 * @return unknown
 */
function get_the_ID() {
	global $id;
	return $id;
}

まさに投稿IDを取得する関数です。現在の記事のID(数値)を返し、ループのなかでのみ使用することができます。

まとめ

今回の解析結果では投稿IDを取得する方法は3つあることがわかりました。

  1. グローバル変数 $id を使う
  2. グローバル変数 $post->ID を使う
  3. wordpressのget_the_ID関数を使う

グローバル変数はもしかしたらバージョンアップを繰り返している間に仕様が変わるかもしれないので、get_the_ID関数を使うのが良いと思います。変数の仕様変更も関数が吸収してくれるでしょう。


java.awt.Frame フレームの作成

2011 年 1 月 16 日 日曜日  【 カテゴリー: Java_GUI



前回はjava.awt.Frameの概要についてみました。今回は実際にフレームを作成して表示するところまでみていきます。

コンストラクタ

コンストラクタには次のようなものがあります。Java Platform SE 6ドキュメント を参考にしました。

コンストラクタ 説明
Frame() 初期状態で可視ではない Frame の新しいインスタンスを生成します。
Frame(GraphicsConfiguration gc) 指定された GraphicsConfiguration で、初期状態で可視ではない新しい Frame を構築します。
Frame(String title) 指定されたタイトルで、初期状態で可視ではない新しい Frame オブジェクトを構築します。
Frame(String title, GraphicsConfiguration gc) 指定されたタイトルGraphicsConfiguration で、最初は不可視である新しい Frame オブジェクトを構築します。

タイトルの指定の有無とGraphicsConfigurationの指定の有無の組み合わせの4種類です。GraphicsConfigurationはプリンタまたはモニターなどのグラフィックスデスティネーションの特性を記述するクラスのようですが、少し内容が難しそうなのでまた機会があれば記事にしたいと思います。
今回はFrame()とFrame(String title)をみていきます。

フレームの作成と表示

(1)Frame()

import java.awt.*;
import java.awt.event.*;

class Sample extends WindowAdapter {
       public static void main(String args[]) {
       new Sample().start();
   }
   private void start() {
       Frame frame = new Frame();
       frame.setSize(300 , 150);
       frame.setVisible(true);
       frame.addWindowListener(this);
   }
   public void windowClosing(WindowEvent e) {
       System.exit(0);
   }
}
  • 1行目でFrameクラスを使う為に「java.awt」パッケージを読み込んでいます。
  • 9行目でFrameクラスのインスタンスを生成し、フレームを作成しています。
  • 10行目でフレームのサイズを指定しています。setSizeメソッドはスーパークラスであるWindowクラスにあるメソッドで、コンポーネントのサイズを変更します。ここでサイズを指定しておかないとタイトルバーしかないフレームができました。
  • 11行目でフレームを表示しています。インスタンス生成後では非表示の状態になっており見えません。setVisibleメソッドはスーパークラスであるWindowクラスにあるメソッドで、コンポーネントを表示または非表示にします。同クラスには同じ機能のあるshowメソッドもありますが、こちらは現在非奨励でJDK version 1.5以降は、setVisibleメソッドに置き換えられています。
  • 12行目は14行目のwindowClosingメソッドを呼び出しています。ここではフレームを閉じるイベント処理を行っています。イベント処理については後々記事にする予定ですが、これを記述しないとフレームを閉じることができなくなるので書いておきました。
    ※このイベント処理を記述しない場合、コマンドライン実行時は「
    Ctrl + C」で、eclipse実行時はeclipse終了時に閉じます。

サンプルを実行するとタイトルがないフレームができました。イベント処理も記述されているので右上の「閉じるボタン」をクリックすると閉じることができます。

(2)Frame(String title)

import java.awt.*;
import java.awt.event.*;

class Sample extends WindowAdapter {
       public static void main(String args[]) {
       new Sample().start();
   }
   private void start() {
       Frame frame = new Frame("Frame");
       frame.setSize(300 , 150);
       frame.setVisible(true);
       frame.addWindowListener(this);
   }
   public void windowClosing(WindowEvent e) {
       System.exit(0);
   }
}
  • 9行目でFrameクラスのインスタンスを生成し、フレームを作成しています。(1)との違いはタイトル行を指定するかどうかです。引数にStringクラスのインスタンスを渡すとタイトルが指定できます。9行目をマニュアル通り書くと
    Frame frame = new Frame(new String("Frame"));
    となるのですが、文字列はダブルクォーテーションで囲むだけでStringクラスのインスタンスを作ってくれるので今回は省略型をサンプルにしました。

サンプルを実行するとタイトルのあるフレームができました。

(3)Frame() + setTitleメソッド

import java.awt.*;
import java.awt.event.*;

class Sample extends WindowAdapter {
       public static void main(String args[]) {
       new Sample().start();
   }
   private void start() {
       Frame frame = new Frame();
       frame.setTitle("Frame");
       frame.setSize(300 , 150);
       frame.setVisible(true);
       frame.addWindowListener(this);
   }
   public void windowClosing(WindowEvent e) {
       System.exit(0);
   }
}
  • 9行目でFrameクラスのインスタンスを生成し、フレームを作成しています。引数がないのでタイトルのないフレームができています。
  • 10行目でタイトルを指定しています。setTitleメソッドは、フレームのタイトルを、指定された文字列に設定します。

サンプルを実行するとタイトルのあるフレームができました。


java.awt.Frame クラスの概要

2011 年 1 月 15 日 土曜日  【 カテゴリー: Java_GUI



今回はアプリケーションでの一般的はウィンドウである「java.awt.Frame クラス」についてみていきます。

Frameクラスについて

  java.lang.Object
    Ljava.awt.Component
        Ljava.awt.Container
            Ljava.awt.Window
                Ljava.awt.Frame

Frameのクラス階層は上記のようになります。では、Frameクラスの概要を Java Platform SE 6ドキュメントの説明を引用しながらみていきます。

Frame は、タイトルとボーダーを持つトップレベルウィンドウです。

タイトルとボーダーをもっています。
Dialogと見た目は似ていますが、違いとしては右上の「最小化ボタン」と「最大化」ボタンがついています。

フレームのサイズには、ボーダー用として指定された領域が含まれます。ボーダー領域の寸法は getInsets メソッドで取得できます。 ただし、ボーダー領域の寸法はプラットフォームに依存するため、pack または show のどちらかを呼び出すことによりフレームを表示可能にしなければ正確なインセット値は取得できません。

ボーダー領域の寸法はgetInsets メソッドで取得できるとうことだが、このメソッドはjava.awt.Componentから継承したものらしい。メソッド内容はインセットを判定するとそのままなんだが、インセットって何かを調べる上下左右のマージン情報を集めたもの?外枠から内部コンポーネントまでの間隔です。
そのインセット情報を正しく取得するにはpack または showメソッドを呼び出すわけですが、とりあえず非表示のままだと正しく取得できないから注意してくださいと言いたいようです。

ボーダー領域はフレーム全体のサイズに含まれているため、フレームの一部がボーダーに隠れてしまいます。 このため、サブコンポーネントを描画および表示するための領域は、左上隅の位置が (insets.left, insets.top) であり、幅が width - (insets.left + insets.right)、高さが height - (insets.top + insets.bottom) の矩形に制限されます。

とりあえず説明の内容を図にしました。これであってるかな?

フレームのデフォルトレイアウトは、BorderLayout です。

フレーム内にコンポーネントを並べていきますが、その並べ方の1つです。レイアウト方法はjava.awt.ContainerクラスのsetLayoutメソッドで行います。このメソッドの説明をみると「コンテナのレイアウトマネージャーを設定します。」と書かれており、引数はLayoutManagerオブジェクトです。LayoutManagerはインターフェースで、これを実装したクラスの1つに「BorderLayout」があります。フレームはこの「BorderLayout」をデフォルトに使います。
BorderLayoutクラスの説明によると、

ボーダーレイアウトは、north (上端)、south (下端)、east (右端)、west (左端)、および center (中央) という 5 つの領域に収まるように、コンポーネントを整列およびサイズ変更して、コンテナに配置します。

とのことです。レイアウトに関するクラスは後々詳しく記事にしたいと思います。

フレームはネイティブな装飾 (Frame と Titlebar) を持つことができ、setUndecorated でこれを無効化できます。フレームが displayable の状態でないときにだけ無効化できます。

setUndecoratedは、「フレームの装飾の有効化と無効化を切り替える」処理をする、Frameクラスのメソッドです。「フレームが displayable の状態でない = 表示されていない」となるので、表示されていないときだけ無効化できます。

マルチスクリーン環境では、Frame(GraphicsConfiguration) または Frame(String title, GraphicsConfiguration) で Frame を構築し、別々のスクリーンデバイス上に Frame を生成できます。GraphicsConfiguration オブジェクトはターゲットスクリーンデバイスの GraphicsConfiguration オブジェクトの 1 つです。
デスクトップエリアが、物理的に複数のスクリーンデバイスにまたがる仮想デバイスマルチスクリーン環境では、すべての設定の境界は仮想座標体系を基準にしています。仮想座標体系の原点は物理的なプライマリスクリーンの左上隅にあります。仮想デバイスのプライマリスクリーンの位置によっては、負の座標も可能です。

ディスプレイを複数使った場合に座標などがどのようになるかを説明しているようです。少し特殊で初心者向きではないので、ある程度javaを使いこなせたら詳しく勉強したいと思います。今回は軽く流します。
説明によると座標はプライマリスクリーンの左上のの座標が「0 , 0」で基準になるようです。上記の図では「2」の左端の座標は「1」の右端の続きから始まります。「2」がプライマリになれば「1」の横座標はマイナスになります。

今回はjava.awt.Frame クラスの概要をみました。次回は詳しくクラスメンバについて見ていきたいと思います。


java.awt.Containerクラス

2011 年 1 月 11 日 火曜日  【 カテゴリー: Java_GUI



今回はjava.awt.Containerクラスについてと、そのサブクラスにどのようなものがあるかみていきます。

Containerクラスについて

Java Platform SE 6ドキュメントから説明を引用します。

総称 Abstract Window Toolkit (AWT) コンテナオブジェクトは、ほかの AWT コンポーネントを含むことができるコンポーネントです。
コンテナに追加されるコンポーネントはリスト中に入れられます。リストの順番は、コンテナ中の前面から後面へコンポーネントがスタックされる順番を表します。コンテナにコンポーネントを追加するときにインデックスが指定されないと、リストの最後尾に追加され、最後尾にスタックされます。

コンテナとは「入れ物」のことです。この「入れ物」にボタンなどのGUI部品を入れていきます。また「入れ物」の中に「入れ物」を入れることもできます。Containerクラスのメソッドとしては、コンテナにコンポーネントを加えたり(add)、削除したり(remove)、どんなコンポーネントがあるのか調べたり(getComponents)などがあります。

Containerクラスのサブクラス

ではコンテナにはどのようなものがあるかみていきます。「JavaTM Platform, Standard Edition 6 API 仕様 」の「パッケージ java.awt」と「パッケージ java.awt の階層」を参考にしてContainerクラスのサブクラスについて表にしました。


1つ1つ簡単にみていきます。

  1. Panel

    Panel はもっともシンプルなコンテナクラスです。パネルは、ほかのパネルなどのさまざまなコンポーネントを貼り付けるためのスペースをアプリケーションに提供します。
    入れ物というよりスペースを準備したのでそこにGUI部品を置いてくださいみたいなイメージです。

  2. ScrollPane

    1 つの子コンポーネントに対して、自動水平または垂直スクロールあるいはその両方を実装するコンテナクラスです。
    設定によって常にスクロールバーを出したり、必要なときに自動的に出したり、全く出さないということができます。出さない設定にしたら「ScrollPane」コンテナを使う意味がないような気がしますが。

  3. Window

    Window オブジェクトはボーダーおよびメニューバーを持たないトップレベルウィンドウです。ウィンドウの作成時には、フレーム、ダイアログ、またはほかのウィンドウをそのオーナーとして定義しなければいけません。
    Windowと聞けば、ボーダがあってメニューバーがあってと普通のアプリケーションの枠組みのようなイメージを持ちますが、AWTではそれはFrameであってWindowはそれらを持ちません。入れ物でいえば、底部分だけ作られているようなイメージになるのでしょうか。

  4. Dialog

    Dialog は、タイトルおよびボーダーを持つトップレベルのウィンドウであり、通常はユーザーからの入力を受け付けるために使用されます。
    この後説明するFrameとほとんど同じですが、見た目では右上の「最小化ボタン」と「最大化」ボタンがないようです。作成時には、ほかのウィンドウをそのオーナーとして定義します。オーナーといえば所有者のことですが、親子関係の方がイメージつきやすいので、「Dialog」が子だとしたら「Frame」など呼び出し元で親となるオブジェクトが必要となります。

  5. FileDialog

    FileDialog クラスは、ユーザがファイルを選択できるダイアログウィンドウを表示します。
    ダイアログのファイル選択専用です。FileDialogクラスはDialogクラスを継承しており,クラスの使い方はほとんど同じです。

  6. Frame

    Frame は、タイトルとボーダーを持つトップレベルウィンドウです。 一般的なアプリケーションの基本となる枠組みです。Dialogとの基本の見た目の違いは、右上の「最小化ボタン」と「最大化」ボタンがあります。

Containerクラスのメンバ

Containerクラス自体のインスタンスを作成することはあまりないとは思いますが、FrameやDialogなどのサブクラスはContainerクラスのメンバを継承しているので一通りどのようなフィールドやメソッドがあるのか簡単にみておくと良いと思います。
メソッドが多くてまとめるの大変だったのでリンクを貼ります。 Java Platform SE 6ドキュメント>Containerを参考にしてください。
コンテナはボタンなどのGUI部品を入れる「入れ物」みたいな役目なので、コンポーネントの追加や削除、配置の変更やイベントの設定などが多いと思います。

次回から Containerクラスのサブクラスを1つ1つみていきたいと思いますが、GUI部品クラスの主流がSwingなのでAWTは簡単にみていこうと思います。

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ...59 60 61 Next