着急啊各位,问题很长时间了没解决,JTextArea删除字符串时,如何得到删除的内容,在debug窗口中能看到删除的内容,但是我不知道怎么得到?

corn8888 2012-09-06 05:34:17
#java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.undo.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class JTextArea5 extends JFrame implements UndoableEditListener,DocumentListener{

private UndoableEdit edit;
private JTextArea jta;
private JTextArea message;
private JMenuItem undoitem;
private JMenuItem redoitem;

public JTextArea5(){

super("JTextArea5");
jta = new JTextArea();
jta.getDocument().addUndoableEditListener(this);
jta.getDocument().addDocumentListener(this);

message = new JTextArea();
message.setEditable(false);

JPanel p1 = new JPanel();
p1.setLayout(new GridLayout(1,1));
p1.setBorder(BorderFactory.createTitledBorder("Edit Area"));
p1.add(new JScrollPane(jta));

JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(1,1));
p2.setBorder(BorderFactory.createTitledBorder("Message"));
p2.add(new JScrollPane(message));

getContentPane().setLayout(new GridLayout(2,1));
getContentPane().add(p1);
getContentPane().add(p2);

JMenuBar bar = new JMenuBar();
JMenu theMenu = new JMenu("Edit");
undoitem = new JMenuItem("Undo");
redoitem = new JMenuItem("Redo");
theMenu.add(undoitem);
theMenu.add(redoitem);
bar.add(theMenu);
updateMenuItem();

setJMenuBar(bar);
setSize(300,300);

undoitem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
edit.undo();
updateMenuItem();
message.append("- Undo -\n");
}
});

redoitem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
edit.redo();
updateMenuItem();
message.append("- Redo -\n");
}
});
}//end of JTextArea5()

public void undoableEditHappened(UndoableEditEvent ev){
StringBuffer buf = new StringBuffer(50);
edit = ev.getEdit();
buf.append("undoableEdit:");
buf.append(edit.getPresentationName());
buf.append("\n");
message.append(buf.toString());
updateMenuItem();
}//end of undoableEditHappened()

public void updateMenuItem(){

if (edit != null){
undoitem.setEnabled(edit.canUndo());
redoitem.setEnabled(edit.canRedo());
undoitem.setText(edit.getUndoPresentationName());
redoitem.setText(edit.getRedoPresentationName());
}else{
undoitem.setEnabled(false);
redoitem.setEnabled(false);
undoitem.setText("Undo");
redoitem.setText("Redo");
}
}//end of updateMenu()

public void showDE(DocumentEvent de){
StringBuffer debuf = new StringBuffer(100);
debuf.append(de.getType());
debuf.append(" Offset:");
debuf.append(de.getOffset());
debuf.append(" Length:");
debuf.append(de.getLength());

Element Eroot = jta.getDocument().getDefaultRootElement();
DocumentEvent.ElementChange Echange = de.getChange(Eroot);
if (Echange == null){
debuf.append(" (No Element Change)");
}else{
debuf.append(" Element Change: index ");
debuf.append(Echange.getIndex());
/* debuf.append(" ,Added Length:");
debuf.append(Echange.getChildrenAdded().length);
debuf.append(" ,Removed Length:");
debuf.append(Echange.getChildrenRemoved().length);
debuf.append(" ,=> ");
debuf.append(Echange.getElement());
*/
}
debuf.append("\n");
message.append(debuf.toString());
}//end of showDE()

public void changedUpdate(DocumentEvent de){
showDE(de);
}

public void insertUpdate(DocumentEvent de){
showDE(de);
}

public void removeUpdate(DocumentEvent de){
showDE(de);
}

public static void main(String args[]) {

JFrame f = new JTextArea5();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.show();
}//end of main()
}//end of class JTextArea5 ...




输入123,然后删除123

请问谁知道?
...全文
275 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
corn8888 2012-09-07
  • 打赏
  • 举报
回复
感谢哥们ldh911无私的帮助!

我添加了构造函数,调用父类的构造函数,继承HTMLDocument,不抛异常了,

再次感谢
corn8888 2012-09-07
  • 打赏
  • 举报
回复
哥们,不知道有没有时间和兴趣解决这个问题:虽然我得到了删除的内容,但是这样做之后,文字显示有问题
也没有换行
class MyDocument01 extends HTMLDocument
.........
JTextPane text = new JTextPane();
text.setDocument( new HTMLDocument());


corn8888 2012-09-06
  • 打赏
  • 举报
回复
哥们,太厉害了,非常非常感谢你帮我解决这么多的问题!要是咱俩在一个城市,我非请你吃饭不行。

我还有一个问题想麻烦你(老麻烦你,我都不好意思了) 因为需要使用不同字体、颜色的文本,
我把JTextArea text = new JTextArea();改成 JTextPane text = new JTextPane();
...
把class MyDocument extends PlainDocument改成 class MyDocument extends DefaultStyledDocument
但是提示 text.setDocument(new MyDocument());有异常IllegalArgumentException("Model must be StyledDocument");,请问我应怎么解决?
MiceRice 2012-09-06
  • 打赏
  • 举报
回复
供你参考下:

import java.awt.BorderLayout;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class JTextAreaUndo extends JFrame {

JTextArea text = new JTextArea();

public JTextAreaUndo() {
this.setSize(400, 300);
text.setDocument(new MyDocument());
this.add(text, BorderLayout.CENTER);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public static void main(String[] args) {
JTextAreaUndo wnd = new JTextAreaUndo();
wnd.setVisible(true);
}

}

class MyDocument extends PlainDocument {
protected void removeUpdate(AbstractDocument.DefaultDocumentEvent event) {
try {
Document doc = event.getDocument();
String str = doc.getText(event.getOffset(), event.getLength());
System.out.println("DELETE: " + str);
} catch (Exception ex) {
ex.printStackTrace();
}
}

protected void insertUpdate(AbstractDocument.DefaultDocumentEvent event, AttributeSet attr) {
try {
Document doc = event.getDocument();
String str = doc.getText(event.getOffset(), event.getLength());
System.out.println("INSERT: " + str);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
corn8888 2012-09-06
  • 打赏
  • 举报
回复
啊,哈哈,原来楼上哥们还记得这件事,

我添加了键盘监听,Undo、Redo实现起来稍微有点麻烦......

删除字符串的时候,竟然得不到删除的内容,

我看了Java的源码,里面好像有个实时拷贝字符串,通过传过来的UndoableEdit类型的参数...

感觉Java源码实现的有点乱
MiceRice 2012-09-06
  • 打赏
  • 举报
回复
初步看了下结构,基本上除了反射似乎就没有更好的办法了。

楼主还在搞那个如何 Undo 的事情?
corn8888 2012-09-06
  • 打赏
  • 举报
回复
楼上,不行,删除的时候 Echange 为 null
yktd26 2012-09-06
  • 打赏
  • 举报
回复

public String xxxx(DocumentEvent de){
Element Eroot = jta.getDocument().getDefaultRootElement();
DocumentEvent.ElementChange Echange = de.getChange(Eroot);
if (Echange == null){
return null;
}
return Echange.getElement();
}

看着你代码写的,不知可行不可行
corn8888 2012-09-06
  • 打赏
  • 举报
回复
哥们,太令我感动了,等了好久,都没人回复我,感谢!!!!!!!!!!!!


public void removeUpdate(DocumentEvent de){
showDE(de); //断点设置在这一行
}
MiceRice 2012-09-06
  • 打赏
  • 举报
回复
看到这个信息时,断点设值在哪一行?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧