JScrollPane: отключить прокрутку путем перетаскивания

#java #swing #jscrollpane #drag

#java #качать #jscrollpane #перетаскивание

Вопрос:

Я использую некоторые компоненты JGraphX, но этот вопрос может быть применен к общему назначению java.

У меня есть компонент внутри JScrollPane. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть возможность панорамирования в представлении, «захватывая» представление и перемещая его, как карты Google. но если курсор покидает область просмотра, прокрутка меняет направление. Я провел некоторое исследование и обнаружил проблему, вызывающую проблему. Его можно найти частично на этой странице, где начинается рассказ о том, как работает область прокрутки.

http://download.oracle.com/javase/tutorial/uiswing/components/scrollpane.html

Наведите курсор на изображение и нажмите курсор. Продолжая нажимать курсор, перетащите его в точку за пределами изображения и сделайте паузу. Видимая область изображения перемещается по направлению к курсору. Эта функция прокрутки путем перетаскивания включена на панели прокрутки и с помощью API JComponent, но она реализована пользовательским компонентом, который отображает изображение.

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

Таким образом, по умолчанию в области прокрутки реализована прокрутка для перетаскивания, но на самом деле это противоположно тому, как мне нужно прокручивать. Библиотека JGraphX, которую я использую, расширила большинство используемых классов, чтобы каким-то образом извлечь выгоду, но основная идея все еще применима. Мне действительно просто нужно знать о самом простом способе отключить это. На странице указано, что она включена с помощью scrollpane и API JComponent, но что на самом деле включается?

Комментарии:

1. Спасибо вам обоим за вашу помощь. Я буквально просмотрел каждый класс, который мог бы установить для автопрокрутки значение true и установить для него значение false. но, в конце концов, никаких кубиков. Я уже пытался настроить прослушиватели мыши на то, как они мне нужны … тоже без кубиков. я пришел сюда, потому что мне здесь больше нравятся люди, а вы, ребята, гораздо более осведомлены, но, думаю, мне придется подождать ответа там. 🙁 первоначально я думал, что проблема с автопрокруткой тоже была проблемой. но независимо от того, где я установил для него значение false, он все равно это делает

2. Чувак, это звучит довольно раздражающе. Возможно, вам следует получить все прослушиватели мыши (движения) как из области прокрутки, так и из содержащегося компонента и просто распечатать список. Посмотрите, сколько существует каждого типа. Затем попробуйте удалить их и посмотреть, что (если что-нибудь) все еще происходит. Если вы потеряете возможность прокрутки путем перетаскивания за пределы области просмотра, то виновником должен быть один из этих прослушивателей мыши. Не могли бы вы рассказать нам, какой класс компонента у вас есть на панели? И если там есть что-нибудь еще? Может быть, мы сможем смоделировать это локально и немного поэкспериментировать.

3. макет материала Jgraphx довольно запутанный. если вы знакомы с этим, это, вероятно, будет более понятным для вас. но у меня есть класс, который расширяет jpanel, который имеет класс, который расширяет их mxGraphComponent . mxGraphComponent расширяет JScrollPane. пока все хорошо. но вот где это сбивает с толку. на самом деле я не вижу компонента. у него есть класс canvas, который, по-видимому, выполняет весь рендеринг, но я действительно не знаю. он также имеет объект mxGraph, который, по-видимому, просто обрабатывает события. но ни один из них на самом деле не принадлежит классу component . прошло некоторое время с тех пор, как я просмотрел этот код

4. mxGraphComponent имеет класс, который расширяет jcomponent, называемый mxGraphControl . но я установил для его автопрокрутки значение false без каких-либо изменений в конце…

5. я удалил всех слушателей из mxGraphComponent, которые я не создавал, и теперь он работает так, как я хотел! большое вам спасибо!

Ответ №1:

Не уверен, но я думаю, вам нужно использовать:

 component.setAutoscrolls( false );
  

Ответ №2:

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

В качестве альтернативы вы можете получить MouseListener s и / или MouseMotionListener s из области прокрутки и заменить их чем-то, что переопределяет поведение перетаскивания. Поскольку это интерфейсы, вы можете использовать для этого прокси-объекты. Тем не менее, это кажется несколько хакерским.