Processing テキストボックスで日本語入力をする
はじめに
Processingでアプリ内で日本語入力をしたいのに、
検索すると「日本語対応フォントの作成方法」ばかりが出てくるので書いておきます。
テキストボックスの作成するために、JavaのGUIライブラリであるSwingを使用します。
とりあえず結論
下記のコードを実行すればテキストボックスを追加できます。
import javax.swing.*; import java.awt.*; JLayeredPane pane; JTextField field; JTextArea area; void setup() { size(200, 200); // SmoothCanvasの親の親にあたるJLayeredPaneを取得 Canvas canvas = (Canvas) surface.getNative(); pane = (JLayeredPane) canvas.getParent().getParent(); // 1行のみのテキストボックスを作成 field = new JTextField(); field.setBounds(10, 10, 150, 30); pane.add(field); // 複数行のテキストボックスを作成 area = new JTextArea(); area.setLineWrap(true); area.setWrapStyleWord(true); JScrollPane scrollPane = new JScrollPane(area); scrollPane.setBounds(10, 50, 150, 100); pane.add(scrollPane); } void draw() { println( field.getText() +","+ area.getText() ); } void keyPressed() { if (keyCode==ENTER) { field.setText(""); area.setText(""); } }
このコードを少しいじれば、十分に他のプログラムに組み込めるかと思います。
Swingには様々なGUIがあり、JTextFiledと同じような要領で使用することができます。
色々試してみるといいと思います。
JTextArea (Java Platform SE 6)
解説
GUIを追加するための準備
Canvas canvas = (Canvas) surface.getNative(); pane = (JLayeredPane) canvas.getParent().getParent();
Processingのウィンドウは下図のような入れ子構造になっています。
SwingのGUIはこの中のJLayeredPaneに追加していかなければいけません。
そのため、ここではJLayeredPaneを取得しています。
まず、surface.getNative()
によって、SmoothCanvasクラスのインスタンス変数を取得します。
次に、これをCanvasクラスにキャストします。
最後に、getParent()
によって親が取得できるので、SmoothCanvasの親の親であるJLayeredPaneを取得します。
1行のみのテキストボックスの作成
// 1行のみのテキストボックスを作成 field = new JTextField(); field.setBounds(10, 10, 150, 30); pane.add(field);
1行のみのテキストボックスは、JTextFieldを利用します。
setBounds(x, y, w, h);
はJTextFieldの表示位置を設定できます。
pane.add(hoge);
はSwingの部品をpaneに追加することができます。
複数行のテキストボックスの作成
// 複数行のテキストボックスを作成 area = new JTextArea(); area.setLineWrap(true); area.setWrapStyleWord(true); JScrollPane scrollPane = new JScrollPane(area); scrollPane.setBounds(10, 50, 150, 100); pane.add(scrollPane);
複数行のテキストボックスは、JTextAreaとJScrollPaneを利用します。
JTextFieldとは異なり、単にJTextAreaをJLayeredPaneに追加するとスクロールできません。
そこで、スクロールを可能にするJScrollPaneにJTextAreaを追加し、
それをJLayeredPaneに追加します。
JLayredPane > JScrollPane > JTextArea
という構造になります。
area.setLineWrap(true);
は入力がテキストボックスの右端に達したときに、
その先を突っ切るか、折り返すかの設定をしています。trueで折り返しです。
area.setWrapStyleWord(true);
は単語を丸ごと折り返すかどうかの設定です。
// trueだと、 hoge fuga piyo // falseだと、 hoge fuga pi yo
みたいな感じになるイメージです。
どちらでも構いませんが、ここではtrueで単語が崩れないように設定しています。
あとのコードは、JTextFieldと同じようなコードですので説明省略です。
テキストの取得とセット
field.getText(); field.setText(); area.getText(); area.setText();
これらで、テキストを取得したり、セットできたりできます。