我有一個非常有用的自動滾動JTextArea/JScrollPane,不斷追加底部的文本行並向上滾動。我希望能夠雙擊一個單詞並將其複製到剪貼板以進一步處理該單詞。但是我希望自動滾動繼續從底部滾動。如何在鼠標點擊後繼續在JTextArea中自動滾動?
但是,只要我在JTextArea中按下鼠標,滾動停止。新行仍然添加,但滾動凍結。垂直滾動條然後開始向上移動,表明文本正被添加到視圖區域下方。我可以使用滾動條手動向下滾動,但僅限手動。自動滾動功能已被禁用。
我懷疑這個問題是焦點。不知何故,或許自動滾動失去焦點到手動鼠標事件。我嘗試了各種修補程序,但沒有任何工作。
我正在使用非常有用的插入更新策略來啓用從底部滾動。
caret = (DefaultCaret) jTextArea1.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
這裏是一個大大簡化但功能完整的Java代碼,說明了這個問題。
package demoswingworker;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.SwingWorker;
import javax.swing.text.DefaultCaret;
public class ScrollTextArea extends javax.swing.JFrame {
String[] sentences;
Map sentenceMap = new TreeMap();
DefaultCaret caret;
public ScrollTextArea() {
initComponents();
caret = (DefaultCaret) jTextArea1.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
this.setLocation(0, 0);
this.setSize(140, 300);
this.setVisible(true);
for (int i = 0; i < 100; i++) {
sentenceMap.put(i, i + "-abcdef");
}
scroll();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 153, 0));
setFont(new java.awt.Font("Times New Roman", 1, 14)); // NOI18N
jTextArea1.setBackground(new java.awt.Color(255, 153, 0));
jTextArea1.setColumns(20);
jTextArea1.setFont(new java.awt.Font("Times New Roman", 1, 22)); // NOI18N
jTextArea1.setLineWrap(true);
jTextArea1.setRows(5);
jTextArea1.setWrapStyleWord(true);
jScrollPane1.setViewportView(jTextArea1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 974, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>
public static void main(String args[]) {
new ScrollTextArea();
}
protected void scroll() {
SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
jTextArea1.append(sentenceMap.get(i).toString() + "\n");
publish(i);
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
}
@Override
protected void done() {
jTextArea1.append("Done");
}
};
worker.execute();
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration
}
你是一名奇蹟工作者!我嘗試了很多方法將光標放在textarea的末尾,但都沒有工作。手動Ctrl + End工作正常,這可能是我將使用的。但是,我試圖用Robot編程來實現,但我無法實現。我對Robot非常陌生。我將下面的代碼放入鼠標釋放事件中,但這不起作用。 \t robot.keyPress(KeyEvent.VK_CONTROL); \t robot.keyPress(KeyEvent.VK_END); \t robot.keyRelease(KeyEvent.VK_END); \t robot.keyRelease(KeyEvent.VK_CONTROL);感謝有關警告的評論。我最小化了代碼。 – Tommus
是的,奇怪的是,這一系列的事件應該已經奏效。我不知道什麼是錯的。 –
好的。得到它的工作。我把jTextArea1.requestFocus();就在機器人鍵點擊之前。感謝Mike提供了Ctrl + End的寶貴建議。 – Tommus