2013-12-06 1 views
2

Фон: Я использую пользовательский AWT D & D в моем (сильно) подклассе JTextPane. Другими словами, я отключил Свинг D & D с pane.setDragEnabled(false) и я использую свой собственный DragSource, DragGestureListener и т.д.Как переопределить поведение JTextPane при отключении Swing D & D?

Проблема: поведение выбора по умолчанию в JTextPane когда Свинг D & D отключена следующим образом:

  1. Выберите текст с помощью мыши
  2. мыши нажмите внутри выделения с намерением начать перетаскивание

Желаемый: выбор не потерян. Фактическое: при нажатии мыши выбор сразу теряется, и у меня нет возможности начать операцию перетаскивания, так как теперь нет перетаскивания.

Я частично проследил это обратно к BasicTextUI $ DragListener, так как это класс, вызывающий метод панели getDragEnabled(), но BasicTestUI, похоже, не сильно отличается от выбора текстового компонента. Итак, я все еще не совсем точно, когда выбор очищается, но мне нужно найти его, чтобы я мог устранить поведение.

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

Большое спасибо за любые указатели.

ответ

1

После многих часов просмотра источника JDK я решил, что поведение выбора контролируется Caret, а не что-либо в текстовом компоненте или иерархии пользовательского интерфейса.

Мягко настроенная Карет, похоже, делает трюк. Обратите внимание, что если вы не переопределите mouseDragged(), пользовательское перетаскивание по-прежнему будет работать, но выбор, как правило, будет изменен в панели после начала перетаскивания, что заставит пользователя подумать, что они только перетаскивают часть текста, который они выбрали.

   textPane.setCaret(new DefaultCaret() { 
       @Override 
       public void mousePressed(MouseEvent evt) { 
        int pos = textPane.viewToModel(evt.getPoint()); 
        if (pos > textPane.getSelectionStart() && pos < textPane.getSelectionEnd()) { 
         return; 
        } 
        super.mousePressed(evt); 
       } 

       @Override 
       public void mouseDragged(MouseEvent e) { 
        if (dragItem != null) return; 
        super.mouseDragged(e); 
       } 
      }); 

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

  • Нет связанных вопросов^_^