2013-11-12 2 views
1

У меня есть JTestPane, содержащий некоторый текст (очевидно). При просмотре текста с помощью клавиатуры обычно используется элемент управления + стрелка вправо, чтобы пропустить целые слова. Поведение по умолчанию в JTestPane состоит в том, чтобы поместить каретку прямо перед первым символом следующего слова.Выбор/просмотр управления в JTextPane

Например, рассмотрим предложение «Это предложение». Начиная с postion 0, если я пропущу «Это» и перейду к следующему слову (используя CTRL + RIGHT), каретка будет в позиции 5, то есть прямо перед «есть».

Это нормально для просмотра, но мне не нравится это поведение при выборе текста. В приложении, над которым я работаю, было бы намного лучше, если бы при использовании SHFT + CTRL + RIGHT я выбирал только «Это» (без лишнего пространства), а не «Это», как и по умолчанию. Другими словами, я хочу выбрать символы 0-3 вместо 0-4.

Я не нашел много информации о том, как настроить Swing, чтобы получить такой результат. До сих пор я пробовал регистрировать CaretListener на JTestPane и вручную сокращать выделение, чтобы при необходимости удалить конечное пространство. Однако это было не так хорошо, и это не сработало хорошо, поскольку он не позволял выбирать несколько слов.

Итак, если кто-то может указать мне в правильном направлении, я буду более чем счастлив.

+2

Вам необходимо переопределить привязки клавиш – MadProgrammer

ответ

4

Swing использует привязку клавиш для вызова Action при вызове определенного KeyStroke. См. Key Bindings для списка этих привязок. Как вы можете видеть, в этом случае вызывается действие selection-next-word, поэтому вам нужно будет предоставить собственное действие.

Вы можете посмотреть исходный код DefaultEditorKit - чтобы увидеть, как это реализовано, и просто сделайте выбор 1 меньше.

Возможно, вы можете использовать концепцию Wrapping Actions, чтобы обернуть исходное действие, а затем просто вызвать метод setSelection() JTextPane, чтобы сбросить выделение на 1 меньше, чем вам нужно. Не уверен, какой будет более простой подход.

0

Итак, я следил за советом Камика и сменил Action, связанный с selection-next-word. Для тех, кто заинтересован, вот что я сделал точно.

Во-первых, я получил исходный код внутреннего класса DefaultEditorKit.NextWordAction, который вызывается для пропусков (при просмотре) и выбора слов. Затем я скопировал его, чтобы определить свою собственную версию, и изменил ее метод actionPerformed следующим образом.

Метод содержит инструкцию offs = Utilities.getNextWord(target, offs);, которая соответствует обработке позиции каретки для начала следующего слова. Переменная target считается JTextComponent и offs - текущая позиция каретки. После вызова метода offs содержит положение начала следующего слова.

Итак, я добавил следующий код правильный после эту строку:

 // remove trailing space from selection 
     if(offs>0)   
     { String c = target.getText(offs-1, 1); 
      if(c.equals(" ")) 
       offs = offs - 1; 
     } 
     // remove trailing "'s" from selection 
     if(offs>1) 
     { String c = target.getText(offs-2, 2); 
      if(c.equals("'s")) 
       offs = offs - 2; 
     } 

Как вы можете видеть, это исправляет offs так, что она расположена перед завершающим пробелом. Я также хочу, чтобы это было до любого (как в знаке родительного падежа, например, Vincent * ' *), поэтому вторая часть моего исходного кода (эта дополнительная функция не была указана в моем исходном вопросе).

Однако с этой единственной модификацией появляется новая проблема: теперь невозможно выбрать несколько последовательных слов. При ударе SHFT + CTRL + RIGHT несколько раз, выбор застревает в первом слове.

Таким образом, чтобы избежать этого, я добавил следующий код прямо перед ранее упомянутой линии (getNextWord вызова):

 // check for trailing "'" 
     if(offs<end-2) 
     { String c = target.getText(offs, 2); 
      if(c.equals("'s")) 
       offs = offs + 2; 
     } 
     // check for trailing space 
     if(offs<end-1) 
     { String c = target.getText(offs, 1); 
      if(c.equals(" ")) 
       offs = offs + 1; 
     } 

Теперь, это работает отлично, это именно то, что я хотел. Большое спасибо camickr за его помощь.

Смежные вопросы