Вопрос

Я пытаюсь добавить номера строк на jtextarea и имею некоторые трудности. Числа строки появляются, но они не прокручиваются должным образом.

У меня есть связанный список пользовательских классов, который хранит строку данных (журнал Move) и номер строки, связанного с ним, а также видимостью, следует ли оно отображаться в области текста или нет. Так что я сделал, было создать два jtextareas ... Один для хранения журналов, а другой, чтобы сохранить номера строк.

Работает макета, а номера строки правильно заполняются с журналами. Проблема в том, когда я пытаюсь прокрутить вверх или вниз. Журналы регулируются правильно, когда вы прокрутите, но номера строки не. Ничто не показывает, кроме первых 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) { ... }
}

Есть идеи?

Спасибо,

Это было полезно?

Решение

Вы пытались положить как текстовые поля в Viewport? Может быть, на панели, которая дает строки номеров доля доступной ширины?

Другие советы

Соответствующий, используемый для отображения номеров строк, может быть добавлен с использованием:

scrollPane.setRowHeaderView(...);

Другой вариант - использовать JTable для отображения обоих столбцов. Использование двух текстовых областей действительно не является лучшим решением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top