2011-01-06 21 views
2

JTextAreaに行番号を追加しようとしていますが、いくつかの問題があります。行番号は表示されますが、正しくスクロールしません。Java JTextArea行番号

私は、データ行(ログメッセージ)とそれに関連付けられた行番号を格納するカスタムクラスのリンクリストと、テキスト領域に表示するかどうかの可視性を持っています。だから、私がやったことは、2つのJTextAreasを作成することでした.1つはログを格納し、もう1つは行番号を格納することです。

レイアウトが機能し、行番号がログに正しく入力されます。問題は、上下にスクロールしようとするときです。スクロールするとログが適切に調整されますが、行番号は正しく表示されません。当初表示されていた最初の28行の番号を超えるものはありません。スペースは空白です。

私のコードは以下の通りです:

public class CustomLineNumbers extends JFrame implements ActionListener 
{  
    ... 
    private JTextArea logField; 
    private JTextArea lineField; 

    private List<Log> logs; 

    public CustomLineNumbers() 
    {  
     ... 
     logs = new ArrayList<Log>(); 

     logField = new JTextArea(28, 68); 
     logField.setMargin(new Insets(0, 5, 0, 0)); 
     logField.setEditable(false); 
     logField.setLineWrap(true); 
     logField.setWrapStyleWord(true); 

     lineField = new JTextArea(); 
     lineField.setPreferredSize(new Dimension(25, 0)); 
     lineField.setBackground(this.getForeground()); 
     lineField.setBorder(OUTER); 
     lineField.setEditable(false); 

     initLogs(); 
     updateLogView(); 
     updateLineView(); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.getViewport().add(logField); 
     scrollPane.setRowHeaderView(lineField); 
     scrollPane.setVertical...Policy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

     ... 
    } 

    private void initLogs() 
    { 
     // inits the data in the list 
    } 

    public void updateLogView() 
    { 
     logField.setText(""); // reset log field to nothing 

     for (int i = 0; i < logs.size(); i++) 
     { 
      // Append only if the line is visible 
      if (logs.get(i).getVisibility()) 
      { 
       // if this isn't the first line, 
       // add a line break before appending 
       if (i > 0) 
        logField.append("\n"); 

       logField.append(logs.get(i).getLine()); 
      } 
     }  
    } 

    public void updateLineView() 
    { 
     lineField.setText(""); // reset log field to nothing 

     for (int i = 0; i < logs.size(); i++) 
     { 
      // Append only if the line is visible 
      if (logs.get(i).getVisibility()) 
      { 
       // if this isn't the first line, 
       // add a line break before appending 
       if (i > 0) 
        lineField.append("\n"); 

       lineField.append("" + logs.get(i).getLineNumber()); 
      } 
     }  
    } 

    ... 

    /***** Main Execution *****/ 
    public static void main(String[] args) { ... } 
} 

任意のアイデア?

ありがとう、

答えて

4

viewPortに両方のテキストフィールドを入れてみましたか?ラインナンバーに利用可能な幅の一部を与えるパネル上にあるのでしょうか?

scrollPane.setRowHeaderView(...); 

別のオプションは、両方の列を表示するためのJTableを使用することである。

+1

スクロールペインに複数のビューポートがある可能性はありますか? scrollPaneビューポートに 'scrollPane.getViewport()。add(lineField);'を追加して 'lineField'を追加しようとしましたが、ウィンドウからすべてのテキスト領域が削除されました。それらを作成するいくつかの種類のエラーがあるように見えます。 – linsek

+0

ああ、私はあなたのコメントを誤解しました。私はそれらを今パネルに入れて、それがどのように進むのかを教えてくれます。 – linsek

+0

それは動作します。私は境界線とインセンティブの面でそれを少しきれいにする必要がありますが、スクロールバーが機能し、行番号が正しく設定されます。ありがとう! – linsek

3

行番号を表示するために使用compenentを使用して追加することができます。 2つのテキスト領域を使用することは、実際には最良の解決策ではありません。

+0

私はコードでsetRowHeaderViewを呼び出していましたが、必要な方法では機能しませんでしたので、2つのテキスト領域を提案しました。私はJTableが最良のソリューションかもしれないと思う。 – jzd

+0

私は実際にJTableに移りました。私が今問題としているのは、 'fireTableCellUpdated(0、getRowCount());を呼び出すとテーブルの行が更新されないということです。 – linsek

+0

@njozwiak、私には2つの問題があります。まず、パラメータは(行、列)にする必要があります。あなたは(行、行)を提供しています。次に、パラメーターはゼロに基づいているため、最後のセルは実際にgetRowCount() - 1です。 – camickr