2017-07-31 5 views
1

私は非常に便利な自動スクロールJTextArea/JScrollPaneを持っています。この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

あなたは奇跡の労働者です!私は、テキストエリアの終わりにカーソルを置く方法をたくさん試しましたが、どれもうまくいきませんでした。手動のCtrl + Endはうまく動作しますが、これは私が使用するものです。しかし、私はロボットを使ってプログラムでそれをやろうとしましたが、動かすことはできません。私はロボットにはあまり慣れていません。マウスリリースイベントに次のコードを挿入しましたが、うまくいきませんでした。 \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

OK。それは働くようになった。私はjTextArea1.requestFocus()を入れた。ロボットキーがクリックされる直前です。 Ctrl + Endの貴重な提案に感謝します。 – Tommus

関連する問題