2017-07-31 69 views
1

我有一個非常有用的自動滾動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     
} 

回答

0

這種自動滾動機制依賴於光標始終位於文本區域內容的最後。只要光標在最後,您就可以自動滾動。光標到達其他地方但結束時,自動滾動停止。

因此,爲了恢復自動滾動,您唯一需要做的就是將光標移動到最後。您可以通過編程的方式尋找一種方法,但在此之前,您可以在想要恢復自動滾動時點擊Ctrl+End

另請注意,我在您的代碼中發現了幾條警告,這意味着您在編程時沒有啓用許多有用的警告,這往往是非常容易出錯的業務。

+0

你是一名奇蹟工作者!我嘗試了很多方法將光標放在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

+0

是的,奇怪的是,這一系列的事件應該已經奏效。我不知道什麼是錯的。 –

+1

好的。得到它的工作。我把jTextArea1.requestFocus();就在機器人鍵點擊之前。感謝Mike提供了Ctrl + End的寶貴建議。 – Tommus

相關問題