Получение первого и последнего значений индекса выделенного текста в JTextArea - PullRequest
0 голосов
/ 06 июля 2010

Я пишу текстовый редактор (в Java), где я использую JTextArea для основного редактирования текста, и я помещаю текст в string Builder.

Когда я выделяю текст и делаю что-то вроде удаления этого блока текста, я хочу, чтобы он обновлялся в строителе строк.

Итак, мой вопрос: есть ли способ получить первый и последний индекс выделенного текста в строителе строк?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Вы можете синхронизировать их, используя DocumentListener, как показано ниже.Тем не менее, я настоятельно рекомендую переосмыслить любой подход, который вы пытаетесь использовать здесь.Кажется, вы пытаетесь использовать внешний StringBuilder в качестве «модели» для JTextArea, но Document - это модель.Поэтому я не вижу, когда это будет хорошей идеей.

public static void main(String[] args) {
    JTextArea area = new JTextArea();
    final StringBuilder builder = new StringBuilder();
    area.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void removeUpdate(DocumentEvent e) {
            builder.delete(e.getOffset(), e.getOffset() + e.getLength());
            System.out.println("Removed " + e.getLength() + " chars from SB");
        }

        @Override
        public void insertUpdate(DocumentEvent e) {
            try {
                builder.insert(e.getOffset(), 
                        e.getDocument().getText(e.getOffset(), e.getLength()));
                System.out.println("Inserted " + e.getLength() + " chars into SB.");
            } catch ( BadLocationException ble ) {
                ble.printStackTrace();
            }
        }

        @Override public void changedUpdate(DocumentEvent e) { /* no-op */ }
    });

    final JFrame frame = new JFrame("DocumentListener Test");
    frame.add(area);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.addWindowListener(new WindowAdapter() {
        @Override
        public void windowClosing(WindowEvent e) {
            System.out.println("Final SB contents:");
            System.out.println(builder.toString());
        }
    });
    frame.pack(); frame.setVisible(true);
}
1 голос
/ 06 июля 2010

Если вы удаляете текст в JTextArea, вы не можете просто позвонить getText(); на JTextArea, чтобы получить обновленный текст?

Я предполагаю, что (в вашем строителе строк) вы сохраняетезапись строки, которая не была удалена.Если вы хотите сохранить записи об удаленном материале, вы можете сравнить то, что было в JTextArea первоначально, с обновленным, чтобы узнать, что было удалено.Вы можете сделать это, выяснив, по какому индексу отличаются исходная и обновленная версии и где они совпадают впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...