一个JTextArea的重构

package fr.itris.glips.svgeditor.properties.database;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
 

class MyTextArea extends JTextArea {

private JPopupMenu pop = null; // 弹出菜单
JCheckBoxMenuItem lock = null;
private JMenuItem clear = null; // 三个功能菜单
StringBuffer buf = new StringBuffer();
boolean locked = false;
private static final int MAX_LINE_NUM=2000;
public MyTextArea() {
super();
this.setEnabled(false);
this.setEditable(true);
pop = new JPopupMenu();
lock = new JCheckBoxMenuItem("锁定");
lock.setSelected(locked);
lock.setName("锁定");
pop.add(lock);
pop.add(clear = new JMenuItem("清空"));

this.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (MyTextArea.this.getLineCount() >= MAX_LINE_NUM) {
int end = 0;
try {
end = MyTextArea.this.getLineEndOffset(MAX_LINE_NUM);
} catch (Exception e) {
}
MyTextArea.this.replaceRange("", 0, end);
}
MyTextArea.this.setCaretPosition(MyTextArea.this.getText().length());
}
});
}

public void removeUpdate(DocumentEvent evt) {
}

public void changedUpdate(DocumentEvent evt) {
}
});
this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {

pop.show(MyTextArea.this, e.getX(), e.getY());
}
}
});
PopupMenuListener popupMenuListener=new PopupMenuListener();
lock.addChangeListener(new LockedChangeListener());
clear.addActionListener(popupMenuListener);

lock.setAccelerator(KeyStroke.getKeyStroke('L',
InputEvent.CTRL_MASK));
clear.setAccelerator(KeyStroke.getKeyStroke('C',
InputEvent.CTRL_MASK));


}

@Override
public void append(String str) {
synchronized (this) {
// ++lineNo + " 、" 
String line = str + "\r\n";
if (!locked) {
super.append(line);
} else {
buf.append(line);
}
}

}


public synchronized void lock() {
if(!locked){
locked = true;
}
}

public synchronized void unLock() {
if(locked){
locked = false;
if (buf.length() > 0) {
this.append(buf.toString());
buf.delete(0, buf.length());
}
}

}

public synchronized void setLock(boolean locked) {
if (locked) {
lock();
} else {
unLock();
}

}
public synchronized void clear(){
this.setText("");
}

private class LockedChangeListener implements ChangeListener {
public void stateChanged(ChangeEvent event) {
setLock(lock.isSelected());
}
}

private class PopupMenuListener implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str = e.getActionCommand();
if (str.equals(clear.getText())) {  
clear();
}
}
}
 
}

猜你喜欢

转载自tw-wangzhengquan.iteye.com/blog/1233641