2014-11-14 64 views
1

很長一段時間以來,我一直在光標位於我的JTextArea的底部,名爲txaOutput,在填入JScrollPane之後,儘管我希望它定位於TOP。如何將光標移到JScrollPane中的JTextArea的頂部

我找到的唯一幫助是指將插入位置設置爲0(例如,txaOutput.setCaretPosition(0);),我從未想過如何正確工作。

今天我只是通過各種可能的方法去進行JTextArea終於發現,在此之前填充它,此行似乎做什麼,我需要:

txaOutput.insert(" ", 1);

肯定這是不是最好的或者唯一的辦法。

下面是文本區域類:

package masterwords; 
import gbl.GBConstraints; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.GridBagLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.WindowConstants; 

public class HelpOutput extends JFrame { 

    private JScrollPane scrPnl; 
    private JTextArea txaOutput; 

    public  HelpOutput() /* constructor */ { 

    scrPnl = new JScrollPane(); 

    txaOutput = new JTextArea(); 

    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

    scrPnl.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
    scrPnl.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
    scrPnl.setViewportBorder(BorderFactory.createEtchedBorder()); 
    scrPnl.setAutoscrolls(false); 
    scrPnl.setPreferredSize(new Dimension(500, 555)); 

    txaOutput.setFont(new Font("Courier New", 0, 14)); 
    scrPnl.setViewportView(txaOutput); 

    setLayout(new GridBagLayout()); 

    add(scrPnl, new GBConstraints(0,0).ipad(200, 300).spanX(100).spanY(90)); 

    txaOutput.insert(" ", 1); // ********** WITHOUT THIS CURSOR IS AT BOTTOM 
    setVisible(true); 
    pack(); 
    } 

    public void appendHelp(String s){ 
    txaOutput.append(s); 
    } 
} 

下面是我怎麼總是叫,但它從來沒有工作,直到將符合上述************:

private void btnHelpActionPerformed (ActionEvent evt) {           

    HelpOutput helpOutput = new HelpOutput(); 

    Scanner sc = openHelp(); 
    while(sc.hasNext()) 
     helpOutput.appendHelp(sc.next()); 

    // txaOutput.setCaretPosition(0); // THIS DOES NOTHING so commented out!!! 
    } 

在添加所有************** s的行之前,別無其他我嘗試將光標置於文本區域的頂部 - 始終是底部。

我該做什麼?我所做的似乎是一個混亂。

*編輯,由於JAVANATOR *

重命名變量txaOutputtxaHelpOutput;問題解決了。新的關鍵線路:

private void btnHelpActionPerformed (ActionEvent evt) {           

    HelpOutput helpOutput = new HelpOutput(); 

    Scanner sc = openHelp(); 
    while(sc.hasNext()) 
     helpOutput.appendHelp(sc.next()); 

    txaHelpOutput.setCaretPosition(0); 
    // ^^^^ 
    } 


public class HelpOutput extends JFrame { 

    private JTextArea txaHelpOutput; 
    //     ^^^^ 

    public  HelpOutput() /* constructor */ { 

    txaHelpOutput = new JTextArea(); 
    // ^^^^ 

    scrPnl.setViewportView(txaHelpOutput); 
    //      ^^^^ 

    // LOSE THIS LINE!! txaHelpOutput.insert(" ", 1); 
    } 
+0

請發佈一個可運行的示例。 – 2014-11-14 22:01:11

回答

1

首先,txaOutput.insert(" ", 1);插入空格到您的幫助文本,這可能不是你想要的。

其次,您創建一個HelpOutput對象,向其中追加文本,但是然後您在txaOutput引用的某個其他對象上調用setCaretPosition。您需要致電setCaretPositionHelpOutput對象的JTextArea。這很容易通過在HelpOutput中創建一個方法來完成,該方法調用setCaretPosition(0)

以下代碼將使用setCaretPosition(0)產生一個帶有頂部胡蘿蔔的文本區域。

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.event.ActionEvent; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.ScrollPaneConstants; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 

public class HelpOutput extends JFrame 
{ 
    private static final long serialVersionUID = -1323914827861467580L; 
    private JScrollPane   scrPnl; 
    private JTextArea   txaOutput; 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       btnHelpActionPerformed(null); 
      } 
     }); 
    } 

    public HelpOutput() 
    { 

     scrPnl = new JScrollPane(); 
     txaOutput = new JTextArea(); 

     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 

     scrPnl.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); 
     scrPnl.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
     scrPnl.setViewportBorder(BorderFactory.createEtchedBorder()); 
     scrPnl.setAutoscrolls(false); 
     scrPnl.setPreferredSize(new Dimension(500, 555)); 

     txaOutput.setFont(new Font("Courier New", 0, 14)); 
     scrPnl.setViewportView(txaOutput); 

     setLayout(new BorderLayout()); 

     add(scrPnl, BorderLayout.CENTER); 

     setVisible(true); 
     pack(); 
    } 

    public void appendHelp(String s) 
    { 
     txaOutput.append(s); 
    } 

    public void putCarrotAtTop() 
    { 
     txaOutput.setCaretPosition(0); 
    } 

    private static void btnHelpActionPerformed(ActionEvent evt) 
    { 
     HelpOutput helpOutput = new HelpOutput(); 

     helpOutput 
       .appendHelp("Lots of help\nLots of help\nLots of help\nLots of help\nLots of help\n"); 
     helpOutput.putCarrotAtTop(); 
    } 
} 
+0

那麼,獲得增加的空間比傷害更好 - 它將光標放在滾動頁面上。就像我說的,對於一些應該很容易的事情來說,這是一個令人傷心的解決方法。 – DSlomer64 2014-11-14 22:40:07

+0

那麼你是否說我需要在一個單獨的線程上創建HelpOutput來完成我的任務?......不,你不是這麼說的。 – DSlomer64 2014-11-14 22:48:52

+1

不,那不是你的問題。您最初發布的代碼的問題是,「btnHelpActionPerformed」方法中的「txaOutput」變量與HelpOutput類中聲明的「txaOutput」變量不同。您在OOP概念上遇到問題。 – Javanator 2014-11-14 22:57:15

相關問題