Код: Выделить всё
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class MouseEventExample
{
public static void main(String\[\] args)
{
new MouseEventExample().go();
}
public void go()
{
JFrame jFrame = new JFrame("MouseEventExample");
JPanel jPanel = new JPanel();
jPanel.setSize(1000,1000);
jPanel.setPreferredSize(new Dimension(1000,1000));
JScrollPane jScrollPane = new JScrollPane(jPanel);
jScrollPane.getVerticalScrollBar().setUnitIncrement(20);
jScrollPane.getHorizontalScrollBar().setUnitIncrement(20);
MouseWheelListener\[\] defaultListeners = jScrollPane.getMouseWheelListeners();
for (MouseWheelListener oneListener:defaultListeners) { jScrollPane.removeMouseWheelListener(oneListener); }
jScrollPane.addMouseWheelListener
(
new MouseAdapter()
{
@Override
public void mouseWheelMoved(MouseWheelEvent mouseWheelEvent)
{
Point eventPoint = mouseWheelEvent.getPoint();
System.out.printf("Event point x,y %d,%d%n", eventPoint.x, eventPoint.y);
Point viewPoint = jScrollPane.getViewport().toViewCoordinates(eventPoint);
System.out.printf(" View point x,y %d,%d%n", viewPoint.x, viewPoint.y);
}
}
);
jFrame.add(jScrollPane);
jFrame.setSize(300,300);
jFrame.setPreferredSize(new Dimension(300,300));
jFrame.pack();
jScrollPane.getViewport().setViewPosition(new Point(300,300));
jFrame.setVisible(true);
}
}
Я ожидал, что MouseWheelEvent.getPoint() сообщит о позиции в JScrollPane, поскольку прослушиватель добавляется в JScrollPane, но я ожидал, что JScrollPane.toViewCoordinates преобразует эту точку в координаты базовой JPanel, а вместо этого он возвращает переданные ему координаты без изменений. (Начало просмотра установлено на 300,300, а положение полос прокрутки указывает, что позиция просмотра не равна 0,0.)
В документации для toViewCoordinates() говорится: «Преобразует точку в пиксельных координатах в координаты просмотра. Подклассы области просмотра, поддерживающие «логические координаты», переопределяют этот метод». Он не определяет «координаты пикселей». Но в документации к «getViewPosition()» говорится, что это координаты «представления», которому порт просмотра дает ограниченное изображение.
Поэтому я ожидал, что «toViewPosition()» вернет координаты изображения, часть которого показывает окно просмотра. Что я в этом не понимаю?
Подробнее здесь: https://stackoverflow.com/questions/798 ... scrollpane
Мобильная версия