Swing 기반 GUI를 설계할 때 개발자는 종종 중첩된 구성 요소 내에서 마우스 이벤트를 처리할 때 문제가 발생합니다. 기본적으로 마우스 이벤트는 구성 요소 계층 구조 위로 전파되어 최상위 컨테이너에서 끝납니다. 이는 중첩된 구조 내의 특정 구성 요소에 대한 이벤트 처리를 방해할 수 있습니다.
제출된 질문에는 그러한 시나리오 중 하나가 예시되어 있습니다. 목표는 마우스 끌기에 응답하는 JScrollPane을 사용하여 스크롤 가능한 보기를 구현하는 것입니다. 그러나 JScrollPane에 추가 구성 요소를 추가하면 마우스 모션 이벤트가 스크롤 창에 도달하는 것이 차단됩니다.
개발자는 처음에 마우스 이벤트를 수동으로 전파하는 방법을 고려했습니다. 모든 중첩 구성 요소에 리스너를 추가하고 이벤트를 상위 구성 요소에 전달합니다. 그러나 이 접근 방식은 시간 투자가 비현실적입니다.
수동 전파 대신 JScrollPane과 관련된 기존 작업을 활용하는 것이 더 효율적인 솔루션입니다. 이러한 작업은 일반적으로 키 바인딩에 사용됩니다.
<code class="java">import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.Action; import javax.swing.JViewport; import javax.swing.JScrollPane; import javax.swing.Timer; class ScrollTimer implements ActionListener { private Timer timer; private Action action; private JScrollPane scrollPane; private int count; public ScrollTimer(JScrollPane scrollPane, String action) { this.action = scrollPane.getActionMap().get(action); this.scrollPane = scrollPane; timer = new Timer(100, this); } @Override public void actionPerformed(ActionEvent e) { if (count++ < 10) { action.actionPerformed(new ActionEvent(scrollPane, 0, action.getValue(Action.NAME))); } else { timer.stop(); } } public void start() { count = 0; timer.start(); } public void stop() { timer.stop(); count = 0; } } class MouseEventHandler extends MouseAdapter { private ScrollTimer left, right, up, down; public MouseEventHandler(JScrollPane scrollPane) { left = new ScrollTimer(scrollPane, "scrollLeft"); right = new ScrollTimer(scrollPane, "scrollRight"); up = new ScrollTimer(scrollPane, "scrollUp"); down = new ScrollTimer(scrollPane, "scrollDown"); JViewport viewPort = scrollPane.getViewport(); viewPort.addMouseMotionListener(this); } @Override public void mouseMoved(MouseEvent e) { left.stop(); if (e.getX() < 16) { left.start(); } right.stop(); if (e.getX() > viewPort.getWidth() - 16) { right.start(); } up.stop(); if (e.getY() < 16) { up.start(); } down.stop(); if (e.getY() > viewPort.getHeight() - 16) { down.start(); } } } // ... (rest of the code)</code>
이 대체 접근 방식은 원래 질문이 직면한 문제를 효과적으로 해결합니다. 개발자는 JScrollPane에 내장된 스크롤 작업을 활용하여 마우스 모션 이벤트를 스크롤 창에 전파하여 중첩된 구성 요소 구조 내에서도 부드럽고 반응성이 뛰어난 스크롤을 가능하게 할 수 있습니다.
위 내용은 Java Swing에서 중첩된 구성 요소를 사용하여 JScrollPane에 대한 마우스 끌기 스크롤을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!