Используя JTextPane, использованные события мыши по-прежнему распространяются на обновления карет / обновлений выбора - PullRequest
1 голос
/ 09 ноября 2010

У меня, похоже, проблема с JTextPane.Я расширил JTextPane для рендеринга плавающего изображения, потому что функциональность значка JTextPane не соответствует моей цели.Я хочу, чтобы пользователь мог щелкнуть изображение и выполнить определенные события.Однако, когда я нажимаю на изображение, даже когда я использую evt.consume (), курсор и выделение обновляются в JTextPane.Я бы хотел, чтобы щелчки и события мыши в целом взаимодействовали с изображением, чтобы вообще не влиять на положение каретки или выбор.Соответствующий код:

public class JTextPaneImg extends JTextPane {

    public JTextPaneImg(){
        super();
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                formMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                formMouseReleased(evt);
            }
        });
    }

    private void formMousePressed(java.awt.event.MouseEvent evt) {                                  
        if (imgBound.contains(evt.getPoint())) {
             evt.consume();
             //Do some stuff in here to interact with the image
             // but the event still undesirably interacts with selection/caret
        }
    }   


    private void formMouseReleased(java.awt.event.MouseEvent evt) {                                  
        if (imgBound.contains(evt.getPoint())) {
             evt.consume();
             //Do some stuff in here to interact with the image
             // but the event still undesirably interacts with selection/caret
        }
    }   
}

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

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

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

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

Возможно, вы сможете использовать Global Event Dispatcher , чтобы предотвратить отправку события компоненту.Просто помните, что все события проходят через диспетчер, поэтому код должен быть эффективным, чтобы вы не замедлили очередь.

Или вы можете использовать метод, представленный в Контроллер колесика мыши , который удаляетвсе слушатели из компонентов и заменяет его на свой пользовательский слушатель.Затем вы можете решить, когда переслать события другому слушателю.

Или, возможно, ваше изображение должно быть нарисовано в окне просмотра, а не на текстовой панели.

0 голосов
/ 09 ноября 2010

Решено созданием моей собственной кареты. Проблема заключалась в том, что реализация DefaultCaret НЕ проверяет e.isConsumed на события мыши, поэтому необходимо переопределить и добавить проверку isconsumed. Моя текстовая панель работает так, как задумано, теперь, когда у меня есть следующий код в конструкторе:

    this.setCaret(new DefaultCaret() {

        @Override
        protected void positionCaret(MouseEvent e) {
            if (!e.isConsumed()) super.positionCaret(e);
        }

        @Override
        protected void moveCaret(MouseEvent e) {
            if (!e.isConsumed()) super.moveCaret(e);
        }
    });

Это была моя вина, что я не полностью понял роль Карета в модели событий. Но, если вы спросите меня, это несколько глупо. Из документации, которую я прочитал, соглашение гласит, что все слушатели должны действовать только ощутимо, если! E.isConsumed ().

...