贴出我写得第一个轻量级组件-单行文本编辑器
//轻量级组建为java.awt.Component或java.awt.Container的子类
public class KTextField extends java.awt.Component
{
//text
private StringBuffer m_text; //文本
//caret position
private int m_cpos = 0; //光标列位置,m_cpos∈[0,N]
//selection
private int m_csel_end = -1; //选择尾,-1代表未选择
private boolean m_isEditable = true; //是否可编辑
private boolean m_cursor_sparkling_light = true; //光标闪烁
private int m_view_x = 20; //视图左界,右界为m_view_x+this.getWidth()
public KTextField()
{
this("");
}
public KTextField(String text0)
{
m_text = new StringBuffer(text0);
this.addMouseListener(new java.awt.event.MouseAdapter()
{
public void mousePressed(java.awt.event.MouseEvent e)
{
requestFocus();
this_mousePressed(e.getX()+1+m_view_x);
}
public void mouseEntered(java.awt.event.MouseEvent e)
{
setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.TEXT_CURSOR));
}
public void mouseExited(java.awt.event.MouseEvent e)
{
setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR));
}
});
this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter()
{
public void mouseDragged(java.awt.event.MouseEvent e)
{
int x = e.getX()+1+m_view_x;
this_mouseDragged(x);
}
});
this.addKeyListener(new java.awt.event.KeyAdapter()
{
public void keyTyped(java.awt.event.KeyEvent e)
{
char c = e.getKeyChar();
if(Character.isDefined(c) && Character.getType(c)!=Character.CONTROL){
this_keyTyped(c);
}
}
public void keyPressed(java.awt.event.KeyEvent e)
{
//光标移动
switch(e.getKeyCode()){
case java.awt.event.KeyEvent.VK_LEFT:
this_keyLeft(e);
break;
case java.awt.event.KeyEvent.VK_RIGHT:
this_keyRight(e);
break;
case java.awt.event.KeyEvent.VK_HOME:
this_keyHome(e);
break;
case java.awt.event.KeyEvent.VK_END:
this_keyEnd(e);
break;
//删除键
case java.awt.event.KeyEvent.VK_BACK_SPACE:
this_keyBackspace();
break;
case java.awt.event.KeyEvent.VK_DELETE:
this_keyDelete();
break;
//修改字体
case java.awt.event.KeyEvent.VK_UP:
setFont(new java.awt.Font(getFont().getName(),getFont().getStyle(),getFont().getSize()+1));
repaint();
break;
case java.awt.event.KeyEvent.VK_DOWN:
setFont(new java.awt.Font(getFont().getName(),getFont().getStyle(),getFont().getSize()-1));
repaint();
break;
}
}
});
new Thread(){ //用于光标闪烁
public void run()
{
while(true){
repaint();
m_cursor_sparkling_light = !m_cursor_sparkling_light;
try {
sleep(200);
}
catch (InterruptedException ex) {
}
}
}
}.start();
}
public String getText()
{
return m_text.toString();
}
public void setText(String text)
{
m_text.delete(0,m_text.length());
m_text.append(text);
m_cpos = 0;
m_csel_end = -1;
onTextChanged();
onCaretChanged();
onSelChanged();
repaint();
}
//光标位置
public int getCaretPosition()
{
return m_cpos;
}
public void setCaretPosition(int cpos)
{
if(cpos<0 && cpos>m_text.length()){
throw new RuntimeException("Exception: Caret position out of range!");
}
m_cpos = cpos;
onCaretChanged();
repaint();
}
//文本选择
public void select(int start,int end)
{
m_cpos = start;
m_csel_end = end;
onCaretChanged();
onSelChanged();
repaint();
}
public void selectAll()
{
select(0,m_text.length());
}
public int getSelectionStart()
{
if(m_csel_end != -1){
return m_cpos;
}else{
return -1;
}
}
public int getSelectionEnd()
{
return m_csel_end;
}
public String getSelectedText()
{
if(m_csel_end != -1){
int csel_start,csel_end;
if(m_cpos<m_csel_end){
csel_start = m_cpos;
csel_end = m_csel_end;
}else{
csel_start = m_csel_end;
csel_end = m_cpos;
}
return m_text.substring(csel_start,csel_end);
}else{
return null;
}
}
public boolean isEditable()
{
return m_isEditable;
}
public void setEditable(boolean b)
{
m_isEditable = b;
}
public void setEnabled(boolean b)
{
this.setEditable(b);
super.setEnabled(b);
}
/**
* TODO:...通知所有的监听者文本改变事件
*/
protected void onTextChanged()
{
}
/**
* TODO:...通知所有的监听者光标位置改变事件
*/
protected void onCaretChanged()
{
}
/**
* TODO:...通知所有的监听者选择改变事件
*/
protected void onSelChanged()
{
}
private java.awt.Image m_offImage = null;
public void invalidate()
{
super.invalidate();
m_offImage = null;
}
public void update(java.awt.Graphics g)
{
paint(g);
}