格納するデータをBooleanオブジェクトにしてgetColumnClass()メソッドをオーバライドしたテーブルモデルを作ってあげると良いらしい。
public class FooTableModel extends AbstractTableModel {
// テーブルカラム名。
private String[] columnNames;
// テーブルデータ。
private Object[][] data = new Object[0][];
/**
* コンストラクタ。
* @param columnHadder テーブルのカラムヘッダーに表示する文字列の配列を指定。
*/
public AtmedicTableModel(String[] columnHadder) {
this.columnNames = columnHadder;
}
/**
* カラム数を返す。
* @return カラム数。
*/
public int getColumnCount() {
return columnNames.length;
}
/**
* 行数を返す。
* @return 行数。
*/
public int getRowCount() {
return data.length;
}
/**
* カラムの名称(タイトル)を返す。
* @param int 名前を知りたいカラム位置。
* @return カラム名称(タイトル)。
*/
public String getColumnName(int col) {
return columnNames[col];
}
/**
* 指定されたセルのデータを返す。
* @param int 行位置。
* @param int カラム位置。
* @return 指定されたセルのデータ。
*/
public Object getValueAt(int row, int col) {
return data[row][col];
}
/**
* 指定されたカラムに格納されているデータの型を返す。
* @return 指定されたカラムに格納されているデータの型。
*/
public Class getColumnClass(int c) {
Class cls = null;
try {
cls = getValueAt(0, c).getClass();
} catch (Exception e) {
return String.class;
}
return cls;
}
/**
* 指定された位置のセルを編集可能にするかどうかの判定を行う。
* @param int 行位置。
* @param int カラム位置。
* @return 指定された位置のセルを編集可能にするかどうかの判定結果。
*/
public boolean isCellEditable(int row, int col) {
return false;
}
/**
* 指定されたセルにデータを設定する。
* @param Object 設定したデータ。
* @param int 行位置。
* @param int カラム位置。
*/
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
/**
* テーブルモデルにデータを設定する。
* @param data 設定したいデータ。
*/
public void setData(Object[][] data) {
this.data = data;
fireTableDataChanged();
}
}
コンストラクタでmaxlengthに指定する バイト を指定します。 一応全角文字にも対応しているつもりです。
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
/**
* MaxLength以降の文字を無視するJTextField拡張クラス。
* @version 1.0
* @since 1.0
*/
public class MaxLengthJTextField extends JTextField {
private int maxLength = 0;
/**
* コンストラクタ。
* @param maxLength 入力制限値。
*/
public MaxLengthJTextField(int maxLength) {
this.maxLength = maxLength;
addKeyListener(new MaxLengthKeyListener());
}
/**
* MaxLengthを制御するためのDocumentModelを生成。
* @return MaxLengthを制御するためのDocumentModel。
*/
protected Document createDefaultModel() {
return new MaxLengthDocument();
}
/**
* MaxLengthを制御するDocument
* @version 1.0
* @since 1.0
*/
class MaxLengthDocument extends PlainDocument {
private int added = 0;
/**
* Documentへの文字列の挿入。<br />
* MaxLengthを越えている場合は挿入しない。
*/
public void insertString(int arg0, String arg1, AttributeSet arg2)
throws BadLocationException {
if (arg0 < maxLength) {
super.insertString(arg0, arg1, arg2);
}
}
}
/**
* MaxLengthを制御するKeyListener。
*/
class MaxLengthKeyListener implements KeyListener {
private String oldString;
/**
* KEY押下イベントに対する処理。
*/
public void keyPressed(KeyEvent arg0) {
checkMaxLength();
}
/**
* KEYリリースイベントに対する処理。
*/
public void keyReleased(KeyEvent arg0) {
checkMaxLength();
}
/**
* KEYタイプイベントに対する処理。
*/
public void keyTyped(KeyEvent arg0) {
checkMaxLength();
}
private void checkMaxLength() {
String checkString = getText();
byte[] byteLength = checkString.getBytes();
if (byteLength.length > maxLength) {
setText(oldString);
} else {
oldString = checkString;
}
}
}
}
あなたのご意見・感想をお送りください。
何かの理由でうまく送れない場合にはメール
でお願いします。