package lecture.swing;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 * テキスフィールドのサンプル
 * 入力文字数を制限する
 * 注、JTextFieldには、直接的に入力文字数を制限する方法はない
 * イベントを取得して自力でやる必要がある
 *
 * このページは割合と参照が多く、みんな苦労しているようなので、チェック処理の部品を作成した。
 * https://blogs.yahoo.co.jp/artery2020/41540074.html
 */
class TextFieldTest extends JFrame implements KeyListener {
  private static final int MAXLEN = 10;
  public static void main(String[] args) {
    new TextFieldTest();
  }

  private TextFieldTest() {

    super("TextField");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    String string = "テキストフィールド";
    JTextField textField = new JTextField(string);
    textField.addKeyListener(this);

    panel.add(textField);
    add(panel);
    pack();
    setVisible(true);
  }

  @Override
  public void keyPressed(KeyEvent ev) {
    // 処理なし
  }

/**
 * 入力文字数をチェックする
 * 以下は、追記
 * String#length()では文字数が取得される。
 * テーブルに格納するために、バイト数でチェックを行いたい場合は、
 * 目的の文字コードを指定してgetBytesメソッドでbyte[]に変換し、そのサイズでチェックすればよい
 * バイト数を計算するサンプルは以下を参照。
 * Java 文字列のバイト数を計算する.
 * http://blogs.yahoo.co.jp/artery2020/40376366.html
 *
 */
  @Override
  public void keyReleased(KeyEvent ev) {
    JTextField field = (JTextField)ev.getSource();
    String str = field.getText();
    if (str.length() >= MAXLEN) {
      str = str.substring(0,MAXLEN);
      field.setText(str);
    }
  }

  @Override
  public void keyTyped(KeyEvent ev) {
    // 処理なし
  }
}