[TOP] [HOME] [AGILE] [OBJECT] [PROGRAMMING] [JAVA] [LINUX] [OKINAWA] [BBS] [DIARY]

Swing

目次

JTableにJCheckBoxを表示するには

格納するデータを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を制御するJTextField

コンストラクタで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;
			}
		}
	}
}

更新履歴

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。

あなたの名前: メール:
(お名前・メールは、いずれも未記入でかまいません)

今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメール でお願いします。