DATE : 2006/06/28 (Wed)
javax.swing.JFileChooser を使うと、ファイルを選択するダイアログを開くことができます。
また、JFileChooser に javax.swing.filechooser.FileFilter を登録すると、ダイアログに表示するファイルに制限を加えることができます。例えば、JPEG ファイルのみを選択できるようにするといった具合です。
FileFilter は抽象クラスなので、利用するにはサブクラスを作らなければなりません。
FileFilter には、 FileFilter#accept(java.io.File) と FileFilter#getDescription() と、抽象メソッドが2つ定義されています。前者が引数に渡された File を表示するかどうか真偽値で返し、後者が FileFileter の説明(Windows のファイル選択ダイアログで言うと、「ファイルの種類」の欄に出てくる説明)を文字列で返します。
ここで、先程のように JPEG ファイルのみを表示する FileFilter を作成してみます。ただし、ここでは簡単のため、拡張子が「.jpg」のファイルのみを表示可能にします。
以下に、FileFilter#accept(java.io.File) のコードを示します。
(import 文などは省略)
public boolean accept(File file) {
// ファイル名(全て小文字に変換)
String name = file.getName().toLowerCase();
// 拡張子「.jpg」のファイルなら表示
return name.endsWith(".jpg");
}
しかし、このコードは間違いです。
実際にこの FileFilter を JFileChooser に設定すると、選択欄にほとんど何も表示されず、面食らうことになります。
実は、 FileFilter#accept(java.io.File) にはディレクトリも渡されることになっています。もともと java.io.File は、あくまでもファイルパスの表現でしかないため、中身がファイルを示すことがあれば、ディレクトリを示すこともあります。
つまり上のコードでは、ファイルもディレクトリも「.jpg」で終わっているものでなければ表示しないフィルタになっているのです。
そこで、渡された File がディレクトリの場合はダイアログに表示するように、上のコードを書き換えます。
(import 文などは省略)
public boolean accept(File file) {
// ディレクトリであればダイアログに表示
if (file.isDirectory()) {
return true;
}
// ファイル名(全て小文字に変換)
String name = file.getName().toLowerCase();
// 拡張子「.jpg」のファイルなら表示
return name.endsWith(".jpg");
}
参考文献
DATE : 2006/06/26 (Mon)
「Maven Eclipse Plugin Multiple Module Project with Eclipse」から、 Eclipse でマルチモジュールの Maven プロジェクトを作成する方法をメモします。
Maven プロジェクトの作成
まず、Maven プロジェクトを作成します。
Maven プロジェクトを作成するには、プロジェクトを作成するディレクトリ(例えば、Eclipse のワークスペースに該当するディレクトリ内など)で以下のコマンドを実行します。
mvn archetype:create -DgroupId=<groupId> -DartifactId=<artifactId>
すると、artifactId と同名のディレクトリが生成されます。
ディレクトリの中ある pom.xml を次のように書き換えます。
なお、「...」は中略を表します。
<project ...> ... <packaging>pom</packaging> ... </project>
ここで、この Maven プロジェクトの artifactId を「application」、groupId を「app」と仮定しておきます。
次に、application と同じディレクトリで application のサブプロジェクトを生成します。サブプロジェクトを生成するコマンドは、先程のコマンドと同じです。
ここでは、artifactId が「application-core」と「application-ui」のサブプロジェクトを生成したとします。groupId は、両者とも同じ「app」です。
サブプロジェクトに親プロジェクトを設定
先程生成した application-core と application-ui に、application が親プロジェクトであるという旨を設定します。
ここでは、application-core と application-ui の pom.xml に、次の設定を追加します。
<project ...> ... <parent> <groupId>app</groupId> <artifactId>application</artifactId> <version>1.0-SNAPSHOT</version> </parent> ... </project>
親プロジェクトにサブプロジェクトを設定
application に application-core と application-ui がサブプロジェクトであるという旨を設定します。
application の pom.xml に次の設定を追加します。
<project ...> ... <modules> <module>../application-core</module> <module>../application-ui</module> </modules> ... </project>
本来の Maven では、親プロジェクトのディレクトリ内にサブプロジェクトが配置されるという形がとられています。そのため、親プロジェクトのあるディレクトリにサブプロジェクトを配置する場合は、module 要素の内容として1つ上のディレクトリを指さなければなりません。
プロジェクト間に依存関係がある場合
例えば、application-ui が application-core 内のクラスを使用する場合には、次のように、 application-ui の pom.xml に依存関係の設定を追加します。
<project ...> ... <dependencies> ... <dependency> <groupId>app</groupId> <artifactId>application-core</artifactId> <version>1.0-SNAPSHOT</version> </dependency> ... </dependencies> ... </project>
Eclipse のプロジェクトファイルの生成
以上の設定が完了したら、application のディレクトリ内で次のコマンドを実行します。
mvn install
mvn eclipse:eclipse
これで、application-core と application-core のディレクトリ内に、Eclipse のプロジェクトファイルが生成されます(application のディレクトリ内には何も生成されません)。
あとは、Eclipse から「インポート」で既存のプロジェクトとして application-core と application-ui をインポートすれば作業は終了です。ついでに、 application も新規プロジェクトとして Eclipse に登録しておくと締まりが良いかもしれません。
参考文献
- Maven Eclipse Plugin Multiple Module Project with Eclipse 今回の記事は、このページをまとめたようなものです。
- いつかMavenと呼ばれたい@Wiki
DATE : 2006/06/16 (Fri)
(前回の記事)
他のテーブルを参照する場合
あるテーブルから他のテーブルを参照する(あるプロパティが別の Entity クラスのオブジェクトの)場合には、次のいずれかのアノテーションを使います。
- @ManyToOne
- @OneToOne
- @OneToMany
また、参照する列を細かく指定する場合は上記のアノテーションに加えて JoinColumn アノテーションや JoinColumns アノテーションを使います。
上記3つのアノテーションの使い分けは、関係データモデル同士がどのような対応になっているかによって決まります。
これから数回は、@ManyToOne, @OneToOne, @OneToMany についてメモする予定です。
(つづきます)
DATE : 2006/06/12 (Mon)
(前回の記事)
列名がプロパティ名と異なる場合
これまでの例では、プロパティ名と列名が同じでした。
それでは、列名とプロパティ名が違う場合はどうなるでしょうか。
例えば、以下のプロパティと列名とを関係付けてみます。
列名 | プロパティ名 |
---|---|
ID | id |
NAME | name |
AGE | age |
Column アノテーションを使うと、プロパティに関係付ける列を指定することができます。Column アノテーションは通常、getter の前に付加します。
Column アノテーションの例を以下に示します。「<列名>」の部分を関係付ける列名に置き換えます。
@Column(name="<列名>")
前回と同じように、Person クラスを用いた例を示します。
(import 文は省略)
@Entity
public class Person {
int id;
String name;
int age;
public Person() { }
public void setId(int id) {
this.id = id;
}
@Id
@Column(name="ID")
public int getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
}
@Column(name="NAME")
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
@Column(name="AGE")
public int getAge() {
return this.age;
}
}
(つづきます)
DATE : 2006/06/09 (Fri)
Java で画像を扱うには、BufferedImage クラスを使うと便利です。24ビット RGB 画像はもちろん、アルファ値(不透明度)や8ビットグレイスケール、インデックスカラーを扱うことも出来ます。
ただし、特定の座標のピクセル値を設定、または取得するメソッドである BufferedImage#getRGB(int, int) と BufferedImage#setRGB(int, int, int) には注意が必要です。
これらのメソッドは、ピクセル値としてデフォルト RGB モデルの値を使用します。具体的には、上位8ビットからアルファ値、赤成分、緑成分、青成分の32ビットの値です。例え使用している BufferedImage が扱っている画像が8ビットグレイスケール画像であっても、上記のメソッドのピクセル値はデフォルト RGB モデルの値です。
特に、アルファ値を扱っている場合(イメージの形式を BufferedImage#TYPE_INT_ARGB にしている場合など)には注意が必要です。黒(#000000)のピクセルを書き込もうとして次のようなコードを書いても、うまくいきません。
image.setRGB(x, y, 0x000000);
冒頭のように、アルファ値は不透明度を表します。つまり、上の例では不透明度が0なので、透明なピクセルを設定してしまうことになります。
そのため、アルファ値をきちんと考慮してピクセル値を設定する必要があります。
image.setRGB(x, y, 0xff000000);
BufferedImage#getRGB(int, int) の場合も上記と同様に、アルファ値が含まれています。特に、アルファ値を扱っていない形式の場合には、アルファ値の存在を忘れがちなので注意が必要です。