Processing テキストボックスで日本語入力をする


はじめに

Processingでアプリ内で日本語入力をしたいのに、

検索すると「日本語対応フォントの作成方法」ばかりが出てくるので書いておきます。


テキストボックスの作成するために、JavaGUIライブラリである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のウィンドウは下図のような入れ子構造になっています。

f:id:turtley_fms:20171201035831p:plain
 
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();

これらで、テキストを取得したり、セットできたりできます。

参考

GUIを扱う準備をする(Swing) | 自己啓発。人生について考える

processing3でAWT/swingを使う。 - Qiita