取得した値を1行毎に処理する

広告

テキストエリアに入力された値を取得した後で、1行毎に順に処理をすることはよく行われます。ここではその手順を確認しておきます。

まずはgetTextメソッドを使い、テキストエリアに入力済みの値を取得します。

JTextArea area = new JTextArea("こんにちは");
String str = area.getText();

取得した値には複数の行が含まれています。テキストエリアでは改行を表す文字は"¥n"となっていますので、区切り文字として"¥n"を指定し取得した値を分割します。

テキストエリアへの値の入力のされかたによっては改行文字として¥nの代わりに¥r¥nを入力してしまっている場合があります。その場合は先に¥r¥nを¥nに変換しておいて下さい。

Stringクラスで定義されているsplitメソッドを使います。Stringクラスで定義されているsplitメソッドを使います。

JTextArea area = new JTextArea("こんにちは");
String str = area.getText();
String[] strs = str.split("¥n");

Stringクラスの配列であるstrsには改行文字で分割された行毎の値が格納されています。

折り返しの設定をしている場合、行に含まれる文字列が長いとテキストエリアの幅で折り返しされている場合があります。この場合、表示上折り返しされているだけで実際には改行されているわけではありません。あくまで改行文字を区切りとして1つの行として扱います。

後は行毎に処理をするだけです。

JTextArea area = new JTextArea("こんにちは");
String str = area.getText();
String[] strs = str.split("¥n");
for (int i = 0 ; i < strs.length ; i++){
  /* ... */
}

入力された値の行数を取得

テキストエリアに入力された値の行数を取得することもできます。JTextAreaクラスで定義されているgetLineCountメソッドを使います。

領域内に収める行数を返します。

戻り値:
  行数 > 0

行数だけを取得したい場合にはgetLineCountメソッドを実行して下さい。現在の行数をint型の値で返してきます。

実際の使い方は次のようになります。

JTextArea area = new JTextArea("初期値");

int linecount = area.getLineCount();

行毎のオフセットを取得

テキストエリアに入力された値の行毎のオフセットを取得します。まず指定した行の開始オフセットを取得するにはJTextAreaクラスで定義されているgetLineStartOffsetメソッドを使います。

指定された行の開始オフセットを返します。

パラメータ:
  line - 変換対象の行番号 >= 0 
戻り値:
  オフセット >= 0 
例外:
  BadLocationException - 行が 0 より小さい場合、またはドキュメントに含まれる行数 
  (getLineCount から報告される) 以上である場合にスローされる

引数にはオフセットを取得したい行数を指定します。戻り値として指定した行の最初の文字の前のオフセットを取得します。

次に指定した行の終了オフセットを取得するにはJTextAreaクラスで定義されているgetLineEndOffsetメソッドを使います。

指定された行の終了オフセットを返します。

パラメータ:
  line - 行 >= 0 
戻り値:
  オフセット >= 0 
例外:
  BadLocationException - 行が 0 より小さい場合、またはドキュメントに含まれる行数 
    (getLineCount から報告される) 以上である場合にスローされる

引数にはオフセットを取得したい行数を指定します。戻り値として指定した行の最後の文字の後のオフセットを取得します。

getLineStartOffsetメソッド及びgetLineEndOffsetメソッドで指定する行数は先頭の行が0となります。

実際の使い方は次のようになります。

JTextArea area = new JTextArea("初期値");

try{
  int start = area.getLineStartOffset(0);
  int end = area.getLineEndOffset(0);
}catch(BadLocationException e){
  System.out.println("Bad Location Error!");
}

上記では先頭行の開始オフセットと終了オフセットを取得しています。行毎のオフセットを取得する場合、行が改行で終わっている場合は改行文字まで含めて1つの行となっていますので注意して下さい。

サンプルプログラム

では実際に試してみます。

SSample12_1.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

class SSample12_1 extends JFrame{

  JTextArea area;
  JTextArea disparea;

  public static void main(String args[]){
    SSample12_1 frame = new SSample12_1("タイトル");
    frame.setVisible(true);
  }

  SSample12_1(String title){
    setTitle(title);
    setBounds(100, 100, 300, 250);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel p = new JPanel();

    area = new JTextArea();
    area.setLineWrap(true);
    JScrollPane scrollpane1 = new JScrollPane(area);
    scrollpane1.setPreferredSize(new Dimension(120, 120));

    disparea = new JTextArea();
    disparea.setLineWrap(true);
    disparea.setEditable(false);
    disparea.setBackground(Color.LIGHT_GRAY);
    JScrollPane scrollpane2 = new JScrollPane(disparea);
    scrollpane2.setPreferredSize(new Dimension(120, 120));

    JButton button1 = new JButton("取得");
    button1.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent event){
          String str = area.getText();
          String[] strs = str.split("¥n");
          StringBuilder sb = new StringBuilder();
          for (int i = 0 ; i < strs.length ; i++){
            sb.append((i + 1) + ":" + strs[i] + "¥n");
          }

          disparea.setText(new String(sb));
        }
      }
    );

    p.add(scrollpane1);
    p.add(scrollpane2);
    p.add(button1);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}

ではコンパイルを行った上で実行してみます。

取得した値を1行毎に処理する

左側のテキストエリアに文字列を入力し「取得」ボタンを押すと、入力された値を全て取得し、1行毎に行番号を先頭に付けた上で右側のテキストエリアに表示します。

取得した値を1行毎に処理する

取得した値を1行毎に処理する

サンプルプログラム

もう一つ試してみます。今度はメソッドを使って行毎のオフセットを取得し、その値から行毎の文字列を取得します。

SSample12_2.java

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.text.BadLocationException;

class SSample12_2 extends JFrame{

  JTextArea area;
  JTextArea disparea;

  public static void main(String args[]){
    SSample12_2 frame = new SSample12_2("タイトル");
    frame.setVisible(true);
  }

  SSample12_2(String title){
    setTitle(title);
    setBounds(100, 100, 300, 250);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel p = new JPanel();

    area = new JTextArea();
    area.setLineWrap(true);
    JScrollPane scrollpane1 = new JScrollPane(area);
    scrollpane1.setPreferredSize(new Dimension(120, 120));

    disparea = new JTextArea();
    disparea.setLineWrap(true);
    disparea.setEditable(false);
    disparea.setBackground(Color.LIGHT_GRAY);
    JScrollPane scrollpane2 = new JScrollPane(disparea);
    scrollpane2.setPreferredSize(new Dimension(120, 120));

    JButton button1 = new JButton("取得");
    button1.addActionListener(
      new ActionListener(){
        public void actionPerformed(ActionEvent event){
          int linecount = area.getLineCount();
          try{
            StringBuilder sb = new StringBuilder();
            for (int i = 0 ; i < linecount ; i++){
              int start = area.getLineStartOffset(i);
              int end = area.getLineEndOffset(i);
              sb.append((i + 1) + ":" + area.getText(start, end - start));
            }
            disparea.setText(new String(sb));
          }catch(BadLocationException e){
            System.out.println("Bad Location Error!");
          }
        }
      }
    );

    p.add(scrollpane1);
    p.add(scrollpane2);
    p.add(button1);

    Container contentPane = getContentPane();
    contentPane.add(p, BorderLayout.CENTER);
  }
}

ではコンパイルを行った上で実行してみます。

取得した値を1行毎に処理する

左側のテキストエリアに文字列を入力し「取得」ボタンを押すと、入力された値を行毎に取得し、1行毎に行番号を先頭に付けた上で右側のテキストエリアに表示します。

取得した値を1行毎に処理する

取得した値を1行毎に処理する

( Written by Tatsuo Ikura )