たいていのアプリケーションはテキストやアイコン、フォント定義などの、共通的なリソースを使用します。フレームワークでは、このリソースファイルの管理を統一的に扱う仕組みが用意されています。リソースファイルは、Applicationのサブクラス名に".properties"を付けた名前で、Applicationのサブクラスと同階層のresourcesディレクトリ内のものが使用されます。
リソースの明示的読み込み
リソースファイルはフレームワーク提供のResourceManagerクラスから取得できるResourceMapクラスによって扱うことができます。
@Override protected void initialize(String[] args) { ApplicationContext ctxt = getContext(); ResourceManager mgr = ctxt.getResourceManager(); resource = mgr.getResourceMap(HelloWorld.class); } @Override protected void startup() { label = new JLabel(); String helloText = (String) resource.getObject("helloLabel", String.class); ・・・・ }
resources/HelloWorld.propertiesというプロパティファイルを用意し、以下の記述をしておくと、上記コード中のhelloTextというStringへ値を読み込むことができます。
helloLabel = Hello, world!
リソースインジェクションの利用
フレームワークは使用するコンポーネントに自動的にリソースをインジェクションできます。この処理はアプリケーションのルートウインドウに定義したコンポーネントに対して、再帰的にリソースの埋め込みが行われます。
リソースインジェクションは、コンポーネントのsetNameメソッドにて与えられた名前に基づき行われます。
JButton btnShowTime; JTextField txtShowTime; @Override protected void startup() { timePanel = new JPanel(); btnShowTime = new JButton(); txtShowTime = new JTextField(); btnShowTime.setName("btnShowTime"); txtShowTime.setName("txtShowTime"); }
リソースファイルに以下の記載をしておくことで、対応する名前の属性を自動的に設定してくれます。
btnShowTime.text = Show current time! btnShowTime.icon = refresh.png txtShowTime.text = Press the button to retrieve time. txtShowTime.editable = false
フィールドリソースインジェクションの利用
public class NameEntryPanel extends javax.swing.JPanel { @Resource String greetingMsg; ApplicationContext ctx; ResourceMap resource; public NameEntryPanel(ApplicationContext ctxt) { initComponents(); ResourceMap resource = ctxt.getResourceMap(NameEntryPanel.class); resource.injectFields(this); } }
リソースファイルに以下の記載をしておくことで、@Resourcdアノテーションへ値がインジェクションされます。
# resources/NameEntryPanel.properties NameEntryPanel.greetingMsg = Hello, %s, this string was injected!
ResourceMapクラスの型変換
以下のリソースファイルがあった場合、
# resources/Converter.properties msg1 = This app demos. msg2 = This is %s. color = #BB0000 font = Arial-BOLD-22 icon = next.png
アプリケーションから以下の様に、型を指定してオブジェクトを取得することもできます。
ApplicationContext ctx = getContext(); ResourceMap resource = ctx.getResourceMap(); String msg1 = resource.getString("msg"); String msg2 = resource.getString("msg", "ResourceConverter"); Color color = resource.getColor("color"); Font font = resource.getFont("font"); Icon icon = resource.getIcon("icon");