Processingで自動改行ソフトを作る。

#Processing_Auto-line-breaker
自動改行ソフトを作りました。
テキストボックス内ですべての処理を行っているため、ファイルに依存しません。（ファイル制御に挫折しただけ）
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265249/6205d0ef-4042-b9f9-b529-a04aa2da60f1.gif)

##環境と経緯
OS Win10
開発環境 Processing3.5.4

ゴミパソと10年前のイラストレーターを片手に、手動改行で頑張っている新聞部に寄贈した物です。

初投稿のため見るに堪えない点が多いかと思いますが、温かい目で見守ってください。
##コード
```java:ALB_ver1.0
//ALB ver1.0
import javax.swing.*;
import java.awt.*;

JLayeredPane pane;
JTextField fbox1;
JTextField fbox2;
JTextArea abox1;

int textlong;

void setup() {
  size(200, 200);
  // pane
  Canvas canvas = (Canvas) surface.getNative();
  pane = (JLayeredPane) canvas.getParent().getParent();
  // filed
  fbox1 = new JTextField();
  fbox1.setBounds(10, 10, 50, 30);
  pane.add(fbox1);
  // area
  abox1 = new JTextArea();
  abox1.setLineWrap(true);
  abox1.setWrapStyleWord(true);
  JScrollPane scrollPane = new JScrollPane(abox1);
  scrollPane.setBounds(0, 50, width, height-50);
  pane.add(scrollPane);
  //rect
  fill(128);
  rect(70, 10, 120, 30);
}

void draw() {
}

void mousePressed() {
  if ((mouseX>70)&&(mouseX<70+120)&&(mouseY>10)&&(mouseY<10+30)) {
    abox1.setEditable(false);
    fbox1.setEditable(false);
    //set last
    abox1.setCaretPosition(abox1.getText().length());
    //delite newline
    for (int i=0; i<abox1.getSelectionEnd(); i++) {
      try {
        //println(abox1.getText(i, 1));
        if (abox1.getText(i, 1).equals("\n")) {
          //println("change");
          abox1.replaceRange("", i, i+1);
        }
      }
      catch(Exception e) {
        //println("bad");
      }
    }
    //try input fbox1
    try {
      //success
      //insert newline for right pos
      textlong=Integer.parseInt(fbox1.getText());
      for (int i=1, j=0; i<abox1.getSelectionEnd()+j; i++) {
        if (i==textlong) {
          abox1.insert("\n", i);
          j++;
        } else if (i==textlong*(j+1)+j) {
          abox1.insert("\n", i);
          j++;
        }
      }
    }
    catch(Exception e) {
      //fail
      //only delite newline
    }
    abox1.setEditable(true);
    fbox1.setEditable(true);
  }
}
```

##解説
```Java:カーネル的なとこ
    //set last
    abox1.setCaretPosition(abox1.getText().length());
    //delite newline
    for (int i=0; i<abox1.getSelectionEnd(); i++) {
      try {
        //println(abox1.getText(i, 1));
        if (abox1.getText(i, 1).equals("\n")) {
          //println("change");
          abox1.replaceRange("", i, i+1);
        }
      }
      catch(Exception e) {
        //println("bad");
      }
    }
    //try input fbox1
    try {
      //success
      //insert newline for right pos
      textlong=Integer.parseInt(fbox1.getText());
      for (int i=1, j=0; i<abox1.getSelectionEnd()+j; i++) {
        if (i==textlong) {
          abox1.insert("\n", i);
          j++;
        } else if (i==textlong*(j+1)+j) {
          abox1.insert("\n", i);
          j++;
        }
      }
    }
    catch(Exception e) {
      //fail
      //only delite newline
    }
```

アルゴリズムは無理やり改行コードを全削除して、指定字数の場所に改行コードを入れていく仕組みです。
###改行コードの挿入について
![CCF_000098.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265249/2cb144bb-49fa-963e-4e97-56e150a16cfa.jpeg)
例えば、5文字ごとに改行する場合。
最初の改行位置は5文字目
二回目の改行位置は11文字目
三回目の改行位置は17文字目
・・・
と、「指定字数※n=1」と「指定字数*(n-1)+n※n>=2」となっています。

おそらく、もっとスマートな方法があるはずなのですが小さい頭で考えた結果こうなりました。

参考
[あえて言うほどではない 数値 ⇔ 文字列変換 Java編](https://www.techscore.com/blog/2012/11/28/%E6%95%B0%E5%80%A4-%E2%87%94-%E6%96%87%E5%AD%97%E5%88%97%E5%A4%89%E6%8F%9B-java%E7%B7%A8/)
[Processing テキストボックスで日本語入力をする](http://turtley-fms.hatenablog.com/entry/2017/12/02/165458)
[Swingを使ってみよう](https://www.javadrive.jp/tutorial/)