Как добавить прослушиватель документов в JTextArea внутри JScrollPane?

Я пытаюсь добавить прослушиватель документов в JTextArea, чтобы, когда пользователь нажимал ввод, он читал последнюю строку/символы с новой строки.

Я попробовал следующий код, но Eclipse не нравится display.getDocument().addDocumentListener(new AL());. Это говорит

Охватывающий экземпляр типа ScrollingTextArea недоступен. Выделение должно быть дополнено включающим экземпляром типа ScrollingTextArea (например, x.new A(), где x — экземпляр ScrollingTextArea).

Как я могу добавить прослушиватель действий в JTextArea?

Код:

package guis;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class ScrollingTextArea {

    public static void main ( String[] args )
    {
        JPanel middlePanel = new JPanel ();
        middlePanel.setBorder(new TitledBorder(new EtchedBorder (), "Display Area" ) );

        // create the middle panel components

        JTextArea display = new JTextArea(16,58 );
        JScrollPane scroll = new JScrollPane(display);

        display.getDocument().addDocumentListener(new AL());
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        //Add Textarea in to middle panel
        middlePanel.add(scroll);

        JFrame frame = new JFrame();
        frame.add( middlePanel );
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    public class AL implements DocumentListener {


        @Override
        public void insertUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub

        }
    }
}

person cubecubed    schedule 05.04.2014    source источник


Ответы (2)


вложенный класс AL должен быть статическим. Если вам по какой-то причине не нужно экспортировать класс, он, вероятно, должен быть private.

private static class AL implements DocumentListener {…}
person trashgod    schedule 05.04.2014
comment
См. также Начальные потоки. - person trashgod; 05.04.2014

Создайте отдельный класс для AL

Or

Определите класс AL вне класса ScrollingTextArea без модификатора public.

person Braj    schedule 05.04.2014
comment
Разве два решения, которые вы указали, не одинаковы? - person cubecubed; 05.04.2014
comment
В первом случае вы можете получить доступ к классу AL из любого места, независимо от пакета, но во втором случае он доступен в том же пакете. - person Braj; 05.04.2014
comment
О, я вижу. Если бы вы создали отдельный класс для AL, он должен был бы быть общедоступным, где, как если бы вы определили AL вне ScrollingTextArea, он не мог бы иметь модификатор public/private/protected. - person cubecubed; 05.04.2014