一度に1文字ずつデータを送信する外部デバイスがあります。これをJTextPaneのStyledDocumentに書き込んでいます。このデータはAWTスレッドではないスレッドで送信されるため、AWTEventsを作成し、それらをEventQueueにプッシュして、例外が発生しないようにAWTが書き込みを処理するようにする必要があります。
私は今面白い問題を抱えています...
私のテキストはドキュメントに逆方向に印刷されています。
これは明らかに、キャラクターを受け取ったときに一度に1つずつイベントキューにキャラクターをプッシュしているためです。キューは明らかに最後にプッシュされ、最初にポップされます。新しいイベントなどを追加する前にイベントを発生させて、イベントを順番に発生させることができるようにしようとしています。
http://www.kauss.org/Stephan/swing/index.htmlは、私がイベントを作成するために使用した例です。
private class RUMAddTextEvent extends AWTEvent {
public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 1;
private int index;
private String str;
private AttributeSet as;
public RUMAddTextEvent(Component target, int index, String str, AttributeSet as) {
super(target, EVENT_ID);
this.index = index;
this.str = str;
this.as = as;
}
public int getIndex() {
return index;
}
public String getStr() {
return str;
}
public AttributeSet getAs() {
return as;
}
}
private class RUMRemoveTextEvent extends AWTEvent {
public static final int EVENT_ID = AWTEvent.RESERVED_ID_MAX + 1;
int index;
int size;
RUMRemoveTextEvent(Component target, int index, int size) {
super(target, EVENT_ID);
this.index = index;
this.size = size;
}
public int getIndex() {
return index;
}
public int getSize() {
return size;
}
}
/**
* Prints a character at a time to the RUMComm window.
*
* @param c
*/
public void simpleOut(Character c) {
cursor.x++;
if (lines.isEmpty()) {
this.lines.add(c.toString());
} else {
this.lines.add(cursor.y, this.lines.get(cursor.y).concat(c.toString()));
this.lines.remove(cursor.y + 1);
}
try {
//doc.insertString(doc.getLength(), c.toString(), as);
eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.postEvent(new RUMAddTextEvent(this, doc.getLength(), c.toString(), as));
getCaret().setDot(doc.getLength());
} catch (Exception ex) {
//Exceptions.printStackTrace(ex);
}
}
/**
* Creates a new line
*/
public void newLine() {
cursor.y++;
cursor.x = 0;
this.lines.add("");
//doc.insertString(doc.getLength(), "\n", null);
eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.postEvent(new RUMAddTextEvent(this, doc.getLength(), "\n", null));
getCaret().setDot(doc.getLength());
}
/**
* Backspace implementation.
*
*/
public void deleteLast() {
int endPos = doc.getLength();
//doc.remove(endPos - 1, 1);
eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.postEvent(new RUMRemoveTextEvent(this, endPos - 1, 1));
cursor.x--;
}
@Override
protected void processEvent(AWTEvent awte) {
//super.processEvent(awte);
if (awte instanceof RUMAddTextEvent) {
RUMAddTextEvent ev = (RUMAddTextEvent) awte;
try {
doc.insertString(ev.getIndex(), ev.getStr(), ev.getAs());
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
} else if (awte instanceof RUMRemoveTextEvent) {
RUMRemoveTextEvent ev = (RUMRemoveTextEvent) awte;
try {
doc.remove(ev.getIndex(), ev.getSize());
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
} else {
super.processEvent(awte);
}
}