こんにちは。
今回はSwingのJColorChooser、JFileChooserを使ってみました。
JColorChooserはユーザーに色を選択してもらう場合に使います。JFileChooserはユーザーにファイルを選択してもらう場合に使います。
以下のプログラムを雛形として使います。
ソース
import javax.swing.JFrame;
public class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
public Test() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(350, 250);
init();
setVisible(true);
}
private void init() {
// 設置処理
}
}
今回は「setSize(350, 250);」の引数の値を適宜調整しました。
JColorChooser
フレームに追加する
JColorChooserをダイアログとして表示する方式が通常の使い方のようですが、JFrameに追加することが可能です。
以下は、JFrameへの追加例です。
ソース
import java.awt.FlowLayout;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
public class Test2 extends JFrame {
public static void main(String[] args) {
new Test2();
}
public Test2() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(650, 400);
init();
setVisible(true);
}
private void init() {
setLayout(new FlowLayout());
JColorChooser colorChooser = new JColorChooser();
add(colorChooser);
}
}
フレームのサイズについては、何度か試した結果、「setSize(650, 400);」がちょうど良い設定でした。以下は初期表示です。「サンプル」タブが選択されています。
「RGB」タブを選択すると、以下のようにスライダーで色選択ができる画面が表示されます。
ダイアログ表示
ダイアログ表示の場合、staticメソッドが用意されています。showDialogというメソッドで、Colorが戻り値です。引数は順に以下です。
- Component
- ダイアログの親Component
- String
- ダイアログのタイトルを含む文字列
- Color
- カラー・チューザが表示されるときの初期色のセット
例えば、以下のようにボタンが押されたらダイアログを表示するのが一般的だと思います。
ソース
import java.awt.Color;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
public class Test3 extends JFrame {
public static void main(String[] args) {
new Test3();
}
public Test3() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(150, 100);
init();
setVisible(true);
}
private void init() {
setLayout(new FlowLayout());
JButton button = new JButton("button");
add(button);
button.addActionListener(event -> {
Color color = JColorChooser.showDialog(this, "color selection", null);
System.out.println(color);
});
}
}
表示されるダイアログの下の方には、ボタンが3つの追加されています。取消ボタンが押下されると、showDialog()メソッドはnullを返却します。上記サンプルでは返却されたColorオブジェクトを標準出力に表示しているだけです。大抵は、返却されたColorオブジェクトを使って、あるコンポーネントの文字色や背景色を設定するという処理を記述すると思います。
showDialog()メソッドの第3引数はダイアログ表示されたときに選択済みの色を指定します。nullの場合は白(R, G, Bそれぞれの値が255)が選択されました。
RGBそれぞれ20、30、40を初期値にする場合は以下のように指定します。
ソース
Color color = JColorChooser.showDialog(this, "color selection", new Color(20, 30, 40));
JFileChooser
フレームに追加する
JFileChooserは選択ダイアログとして使うのが普通の使い方のようですが、JFrameに追加することが可能です。
以下では表示したフレームにJFileChooserを追加しています。
ソース
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class Test5 extends JFrame {
public static void main(String[] args) {
new Test5();
}
public Test5() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 300);
init();
setVisible(true);
}
private void init() {
JFileChooser jFileChooser = new JFileChooser();
add(jFileChooser);
}
}
このキャプチャをとったタイミングは、フレームが表示された後に、手動で「C:\test」フォルダを選択した後です。表示されるフォルダの初期値はwindowsではログインユーザーのドキュメントフォルダでした。
ダイアログ表示
ダイアログでファイル選択ができるメソッドが用意されています。showOpenDialog(Component parent)を使います。parentは親コンポーネントを指定します。このメソッドの戻り値はint型で、JFileChooserで定義された以下の定数が返却されます。
- JFileChooser.CANCEL_OPTION
- 取り消し
- JFileChooser.APPROVE_OPTION
- ファイルが選択された
- JFileCHooser.ERROR_OPTION
- エラー
ERROR_OPTIONが返却されるパターンはよくわかりませんでした。存在しないファイル名を入力してもAPPROVE_OPTIONが返却されます。
実際に選択されたファイルはgetSelectedFile()メソッドで取得できます。
例えば、次のようにボタンのイベントでダイアログ表示をします。
ソース
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
public class Test6 extends JFrame {
public static void main(String[] args) {
new Test6();
}
public Test6() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(150, 100);
init();
setVisible(true);
}
private void init() {
setLayout(new FlowLayout());
JButton button = new JButton("button");
add(button);
button.addActionListener(event -> {
JFileChooser fileChooser = new JFileChooser();
int value = fileChooser.showOpenDialog(this);
if (value == JFileChooser.APPROVE_OPTION) {
System.out.println(fileChooser.getSelectedFile());
}
});
}
}
以下のキャプチャでは、「C:\test」フォルダを表示して、ファイル名に「abc」を手動で入力した状態です。
上記画面で、「開く」ボタンを押下すると、コンソールに「C:\test\abc」と表示されます。if文の記述から、実際にファイルが存在しなくてもAPPROVE_OPTIONが返却されることがわかりました。そのため、ファイルの存在チェックは別途必要です。
以上、参考になれば幸いです。