◆PROCESSING 逆引きリファレンス
カテゴリー:GUI
GUI部品の色を変更するには(G4P)
【概要】
PROCESSINGにGUI用のライブラリであるG4Pを追加する事で、(種類は多くないですが)簡単にGUI部品を表示する事ができるようになります。
G4Pのインストールについては「GUIを扱う準備をする(G4P)」記事を参照してください。
より詳しく知りたい方は、下記公式サイト様などを参照して下さい。
G4Pでは、各GUIパーツの色を自由にカスタマイズする事が可能です。
カスタマイズ方法には、全ての部品の色を変える方法と特定の部品の色を変える方法の2種類が存在します。
全ての部品の色を変える方法には、さらに「環境設定で色を変える方法」と「プログラムでSchemeを変更する方法」があります。
全ての部品ではなく、指定した部品の色だけを変えたい場合は、「指定した部品の色だけを変更する」説明を参照して下さい。
【詳細】
前提知識
G4Pは各GUIパーツの色を
スケッチブックの場所 ¥ libraries ¥ G4P ¥ src ¥ data
にある default_gui_palette.png 画像を元に決定しています。
(例:C:¥processing-3.3.6¥src¥libraries¥G4P¥src¥data¥default_gui_palette.png)
スケッチブックの場所は、標準エディタの「ファイル」⇒「設定」で開く設定ウィンドウから確認できます。
default_gui_palette.png は 16個の Palette 番号(横方向)と、16個の Scheme 番号(縦方向)から構成されており、各部品の色は、Scheme 番号単位に管理されています。
0から7までの Scheme はシステムで予約されています。8番以降はユーザ領域として開放されています。
デフォルトでは、 6番の Scheme (上図の★)がGUI 部品に割り当てられています。
例えばGButtonであれば
- ラベル色:Scheme 6 の Palette 2番
- ボタンの枠色:Scheme 6 の Palette 3番
- 通常時のボタンフェース色:Scheme 6 の Palette 4番
- フォーカス時のボタンフェース色:Scheme 6 の Palette 6番
- 押下時のボタンフェース色:Scheme 6 の Palette 14番
といった具合です。
(画像URL:illust-AC 様:アルパッカさん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
各GUI部品が Scheme の何番目の Pallet 色を使っているのかについては、下記公式サイトを参照してください。
default_gui_palette.png を、適当な画像加工ツールで直接書き換えても良いのですが、元の色に戻せなくなってしまうので注意が必要です。
元に戻すことも考慮して変更するなら、下記「環境設定で色を変える」に記載した方法を利用して下さい。
環境設定で色を変える
default_gui_palette.png を、スケッチフォルダの data フォルダ配下にuser_gui_palette.png という名前で複写します。
dataフォルダ配下にこの名前の画像があると、G4Pは優先的にこの画像をパレットとして利用します。
プログラムに頼ること無く、全てのGUI部品の色を一括して変更したい場合は、dataフォルダ配下に複写した user_gui_palette.png 画像の6番目の Scheme色を、適当な画像加工ツールで変更します。
例えば下記画像は、ラベルとボタンフェースに該当する色を赤系統に変更した例です。
(画像URL:illust-AC 様:アルパッカさん、SSSSSSS さん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
ただしこの方法では、(ほとんど)すべてのGUI部品の色が影響を受けることに注意してください。
上記例では、画面に GButton、GLabel、GPanel、GImageButtonという4種類の部品が配置されていますが、パレットの影響を受けない GImageButton以外は、全て赤系統の色に変更されています。
プログラムでSchemeを変更する方法
Palette を変更するvoid GCScheme.changePaletteColor( int scm, int pal, color col ) ;
scm : Scheme番号( 0 – 15 )
pal : Palette番号( 0 – 15 )
col : Color値
GCSchemeクラスの changePaletteColor 命令を使うと、指定した Scheme の pal 位置にある Palette 色を、任意の色に変更できます。
例えば多くのGUI部品のラベル色を変更したい場合は、デフォルトで採用されている 6番目の Scheme に対して、ラベルに使われている Palette 2番の色を変更すれば良い事になります。
changePaletteColor 命令による変更は、メモリ内に記憶されます。
例えば
- (1)Scheme 6番の Palette 2番(ラベル色)を濃い青⇒赤色に変更し
- (2)setGlobalColorScheme 命令で GUI の Scheme 番号を6以外に変更
- (3)再び setGlobalColorScheme 命令で GUI の Scheme 番号を6に戻す
という操作を行っても、ラベル色は赤色のままとなります。
現在アクティブになっている Scheme の Palette 色を変更すると、(ほとんど)すべてのGUI部品の色に影響を与えます。
Schemeを指定void G4P.setGlobalColorScheme( int scm ) ;
scm : Scheme番号( 0 – 15 )
画像加工ツールでパレット用の画像を編集するのではなく、プログラムから、GUI部品が使う Scheme 番号を変更する事が可能です。
G4Pクラスの setGlobalColorScheme メソッドに 任意の Scheme 番号を与えると、GUI部品の色が、該当 Scheme の Palette 色に変わります。
Schemeを変更すると、一瞬で全てのGUI部品の色を変更する事ができるので、便利です。
ただしこの命令は、setup() 関数の中でGUI部品を作成する前に使用するか、setup() 関数が終了した後で、draw()関数以外の部分で使用してください。(当然ですが、draw()関数から呼び出された関数内で使うのもNGです)
setup() 関数の中でGUI部品生成後に使用したり、draw()関数の中で使用すると、期待通り動作しません。
なお、この命令を GUI 部品を作成する前に呼び出す場合は、呼び出す前に、この後で説明する makeColorSchemes 命令を使って、変更対象となる Scheme を作成しておく必要があります。
この命令が適切に呼び出されると、(ほとんど)すべてのGUI部品の色に影響を与えます。
Schemeを複写するvoid GCScheme.copyPalette( int orgScm , int tagScm ) ;
orgScm : コピー元 Scheme 番号
tagScm : コピー先 Scheme 番号
コピー元番号で指定された Scheme を、コピー先エリアに複写します。
例えば、GCScheme.copyPalette( 6, 10 ) ; とする事で、6番目の Scheme を 10 番目にコピーします。
ただしこの命令は、setup() 関数の中でGUI部品を作成する前に使用するか、setup() 関数が終了した後で、draw()関数以外の部分で使用してください。
setup() 関数の中でGUI部品生成後に使用したり、draw()関数の中で使用すると、期待通り動作しません。
なお、この命令を GUI 部品を作成する前に呼び出す場合は、呼び出す前に、この後で説明する makeColorSchemes 命令を使って、変更対象となる Scheme を作成しておく必要があります。
Schemeを作成するvoid GCScheme . makeColorSchemes ( PApplet app ) ;
app : アプレット。this を与える
新たに Scheme を作成します。app には this を与えます。
G4Pでは最初の GUI部品を作成した際に、自動的に Scheme が作成され、メモリに展開されます。この命令は G4P で部品を作成するタイミングとは別に、新たに Scheme をメモリ上に作成します。
ただしこの命令は、setup() 関数の中でGUI部品を作成する前に使用するか、setup() 関数が終了した後で、draw()関数以外の部分で使用してください。
setup() 関数の中でGUI部品生成後に使用したり、draw()関数の中で使用すると、期待通り動作しません。
これまで紹介した4つの命令を組み合わせると
(1)makeColorSchemes 命令で、Scheme を作成し
(2)copyPalette 命令で、6番の Scheme を 10 番にコピーし
(3)changePaletteColor 命令で、10番の Scheme に対し、GUI部品が使っている Palette番号の色を変更し
(4) setGlobalColorScheme 命令で、10番の Scheme を全GUIに適用し
(5) GUI部品を生成する
といった使い方ができます。
いうなれば、予め画像加ツールで user_gui_palette.png を編集しておく操作を、プログラムを使ってメモリ内で行うようなものです。
こうする事で、システム領域(0 – 7)の Scheme をベースに、一部だけ色が異なる Scheme をユーザ領域に作成して、GUI部品に適用する事が可能となります。
指定した部品の色だけを変更する方法
限定的な Scheme適用void setLocalColorScheme( int scm ) ;
scm : Scheme番号( 0 – 15 )
これまで紹介した方法は、(ほとんど)全てのGUI部品に影響を与える作業でした。
これに対し 、多くのGUI部品の親となる GAbstractControl クラスが持つsetLocalColorScheme メソッドを使うと、特定のGUI部品だけに指定したSchemeを適用する事ができます。
(画像URL:illust-AC 様:レグロ さん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
例えば上記例では、青信号、黄信号、赤信号の各ボタンは全てGButtonですが、ボタン毎に異なる Scheme をセットする事で、それぞれ違う色にしています。
システムで予約されている Scheme 番号には、以下の定数が利用可能です。
またユーザ領域の Scheme には、それぞれ G4P . SCHEME_8 から G4P . SCHEME_15 までの定数が割り当てられています。
限定的なPalette適用void setLocalColor( int pal, Color col ) ;
pal : Palette番号( 0 – 15 )
col : Color値
同じくGAbstractControl クラスが持つ setLocalColor命令を使うと、特定のGUI部品にだけ、指定した Palette 色を適用できます。
(画像URL:illust-AC 様:アルパッカさん、SSSSSSS さん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
上記例では、一番上のGButtonのラベル色( Palette 2番 )だけ、デフォルトの色から黄色に変更しています。
【関連記事】
サンプルプログラム
プログラムでSchemeを変更する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import g4p_controls.*; import java.awt.Font; /** * PROCESSING G4P GButton表示サンプル * @author MSLABO * @version 1.12 */ GButton btnDog; //犬ボタン GLabel lblDog; //犬ラベル PImage imgDog; //犬画像 boolean changeScmFlg; //Scheme変更FLG void setup(){ size( 300, 220 ); //アイコン用画像を読み込む imgDog = loadImage( "dog.png" ); //G4Pの部品を作成 btnDog = new GButton( this, 10, 10, 280, 100, "GButton" ); lblDog = new GLabel( this, 10, 110, 280, 100, "GLabel" ); //GButtonとGLabelのラベル色を赤色に変更する GCScheme.changePaletteColor( 6, 2, color(255, 0, 0)); //注意 //この位置で G4P.setGlobalColorScheme() //してはいけません。 //アイコンをセットする btnDog.setIcon( imgDog, 1 , GAlign.WEST, null, GAlign.MIDDLE ); lblDog.setIcon( imgDog, 1 , GAlign.WEST, null, GAlign.MIDDLE ); //ボタンに日本語対応フォントをセットする Font font = new Font( "IPAゴシック", Font.PLAIN, 24 ); btnDog.setFont( font ); lblDog.setFont( font ); //「Scheme変更なし」に初期化 changeScmFlg = false; } void draw(){ background( 220 ); //注意 //draw()関数内で G4P.setGlobalColorScheme() //してはいけません。 } //GButton押下イベント void handleButtonEvents( GButton button, GEvent event ){ if( button == btnDog && event == GEvent.CLICKED ){ if( changeScmFlg ){ //Scheme変更済みなら、デフォルトに戻す G4P.setGlobalColorScheme( G4P.BLUE_SCHEME ); changeScmFlg = false; } else { //Scheme未変更なら、シアン系に変える G4P.setGlobalColorScheme( G4P.CYAN_SCHEME ); changeScmFlg = true; } } } |
changePaletteColor 命令で、GUI部品のラベル色を赤色に変更しています。
またボタンを押下するごとに、setGlobalColorScheme 命令で Scheme を切り替えています。
<出力サンプル>
(画像URL:illust-AC 様:アルパッカさん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
ユーザ領域のSchemeを利用する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import g4p_controls.*; import java.awt.Font; /** * PROCESSING G4P GButton表示サンプル * @author MSLABO * @version 1.13 */ GButton btnDog; //犬ボタン GLabel lblDog; //犬ラベル PImage imgDog; //犬画像 void setup(){ size( 300, 220 ); //アイコン用画像を読み込む imgDog = loadImage( "dog.png" ); //Schemeを作成し、デフォルトScheme(6)を8に複写する GCScheme.makeColorSchemes(this); GCScheme.copyPalette( G4P.BLUE_SCHEME , G4P.SCHEME_8 ) ; //Scheme 8 のラベル、フェースの色をオリジナルに変える GCScheme.changePaletteColor( G4P.SCHEME_8, 2, color(255,255,0)) ; GCScheme.changePaletteColor( G4P.SCHEME_8, 4, color(5,5,5)) ; GCScheme.changePaletteColor( G4P.SCHEME_8, 6, color(155,155,155)) ; GCScheme.changePaletteColor( G4P.SCHEME_8,14, color(70,70,70)) ; //Scheme 8 をデフォルト Scheme にする G4P.setGlobalColorScheme( G4P.SCHEME_8 ); //G4Pの部品を作成(ここでは Scheme 8 が採用される) btnDog = new GButton( this, 10, 10, 280, 100, "GButton" ); lblDog = new GLabel( this, 10, 110, 280, 100, "GLabel" ); //注意 //この位置で G4P.makeColorSchemes()やsetGlobalColorScheme() //をしてはいけません。 //アイコンをセットする btnDog.setIcon( imgDog, 1 , GAlign.WEST, null, GAlign.MIDDLE ); lblDog.setIcon( imgDog, 1 , GAlign.WEST, null, GAlign.MIDDLE ); //ボタンに日本語を使うため、日本語対応フォントをセットする Font font = new Font( "IPAゴシック", Font.PLAIN, 24 ); btnDog.setFont( font ); lblDog.setFont( font ); } void draw(){ background( 220 ); //注意 //draw()関数内で G4P.makeColorSchemes()やsetGlobalColorScheme() //をしてはいけません。 } |
GUI部品を作る前に、makeColorSchemes で Scheme を作成し、該当 Scheme の 8 番をオリジナル Scheme としてカスタマイズしています。
説明でも記載しましたが、makeColorSchemesをするタイミングに注意してください。
<出力サンプル>
(画像URL:illust-AC 様:アルパッカさん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
指定した部品のSchemeだけを変更する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import g4p_controls.*; import java.awt.Font; GButton btnBlue; //青信号ボタン GButton btnYellow; //黄色信号ボタン GButton btnRed; //赤信号ボタン PImage img[]; //各ボタン用アイコン /** * PROCESSING G4P GButton表示サンプル * @author MSLABO * @version 1.14 */ void setup(){ size( 320, 330 ); //アイコン画像を読み込む img = new PImage[4]; img[0] = loadImage( "blue.png" ); img[1] = loadImage( "yellow.png" ); img[2] = loadImage( "red.png" ); //GUI部品を生成する btnBlue = new GButton( this,10,10,300,100, "青信号" ); btnYellow = new GButton( this,10,115,300,100, "黄信号" ); btnRed = new GButton( this,10,220,300,100, "赤信号" ); //アイコン画像をセットする btnBlue.setIcon( img[0], 1, GAlign.WEST, GAlign.LEFT, GAlign.MIDDLE ); btnYellow.setIcon( img[1], 1, GAlign.WEST,GAlign.LEFT, GAlign.MIDDLE ); btnRed.setIcon( img[2], 1, GAlign.WEST,GAlign.LEFT, GAlign.MIDDLE ); //各ボタン毎に Scheme を割り当てる btnBlue.setLocalColorScheme( G4P.BLUE_SCHEME ); btnYellow.setLocalColorScheme( G4P.YELLOW_SCHEME ); btnRed.setLocalColorScheme( G4P.RED_SCHEME ); //ボタンに日本語対応フォントをセットする Font font = new Font( "IPAゴシック", Font.PLAIN, 24 ); btnBlue.setFont( font ); btnYellow.setFont( font ); btnRed.setFont( font ); } void draw(){ background( 200 ); } |
setLocalColorScheme で、ボタン毎に別々の Scheme を適用しています。
<出力サンプル>
(画像URL:illust-AC 様:レグロ さん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
指定した部品のPaletteだけを変更する例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import g4p_controls.*; import java.awt.Font; /** * PROCESSING G4P GButton表示サンプル * @author MSLABO * @version 1.15 */ GButton btnDog; //犬ボタン GLabel lblDog; //犬ラベル PImage imgDog; //犬画像 void setup(){ size( 300, 220 ); //アイコン用画像を読み込む imgDog = loadImage( "dog.png" ); //G4Pの部品を作成 btnDog = new GButton( this, 10, 10, 280, 100, "GButton" ); lblDog = new GLabel( this, 10, 110, 280, 100, "GLabel" ); //アイコンをセットする btnDog.setIcon( imgDog, 1 , GAlign.WEST, null, GAlign.MIDDLE ); lblDog.setIcon( imgDog, 1 , GAlign.WEST, null, GAlign.MIDDLE ); //ボタンに日本語を使うため、日本語対応フォントをセットする Font font = new Font( "IPAゴシック", Font.PLAIN, 24 ); btnDog.setFont( font ); lblDog.setFont( font ); //犬ボタンのラベルだけ黄色に変更 btnDog.setLocalColor( 2, color(255,255,0)); } void draw(){ background( 220 ); } |
setLocalColor命令で、犬ボタンのラベル色(Palette2番)だけを、黄色に変更しています。
<出力サンプル>
(画像URL:illust-AC 様:アルパッカさん、文字:IPA 独立行政法人 情報処理推進機構 様:IPAフォント)
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。