import java.awt.BorderLayout;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
* @see http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html
*/
public class JTextTest3 {
private JFrame frame;
private JTextArea txtArea;
private JLabel changeStats;
private CaretListenerLabel caretStats;
private void createUI() {
frame = new JFrame("TextTest3");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
caretStats = new CaretListenerLabel("caret:");
changeStats = new JLabel("change:");
JPanel statusPanel = new JPanel(new BorderLayout());
statusPanel.add(changeStats, BorderLayout.CENTER);
statusPanel.add(caretStats, BorderLayout.SOUTH);
txtArea = new JTextArea(10, 30);
JPanel basePanel = new JPanel(new BorderLayout());
basePanel.add(new JScrollPane(txtArea), BorderLayout.CENTER);
basePanel.add(statusPanel, BorderLayout.SOUTH);
txtArea.getDocument().addDocumentListener(
new MyDocumentListener());
txtArea.addCaretListener(caretStats);
frame.getContentPane().add(basePanel);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(
new Runnable(){
public void run() {
JTextTest3 jft = new JTextTest3();
jft.createUI();
}
}
);
}
/**
* ドキュメントの変更を感知
*/
class MyDocumentListener implements DocumentListener {
public void changedUpdate(DocumentEvent e) {
changeStats.setText("chage:chage");
}
public void insertUpdate(DocumentEvent e) {
changeStats.setText("change:insert");
}
public void removeUpdate(DocumentEvent e) {
changeStats.setText("change:remove");
}
}
/**
* キャレットの状態を感知
*/
@SuppressWarnings("serial")
class CaretListenerLabel extends JLabel
implements CaretListener {
public CaretListenerLabel(String label) {
super(label);
}
public void caretUpdate(CaretEvent e) {
try {
int dot = e.getDot();
// モデル内の指定された位置を、ビュー座標系内の場所に変換
Rectangle rect = txtArea.modelToView(dot);
caretStats.setText("caret: text pos=" + dot
+ " view location [" + rect.x + "," + rect.y + "]");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto
Copyright© 矢木 浩人 All Rights Reserved.