>Java >java지도 시간 >Java Swing에서 중첩된 구성 요소를 사용하여 JScrollPane에 대한 마우스 끌기 스크롤을 구현하는 방법은 무엇입니까?

Java Swing에서 중첩된 구성 요소를 사용하여 JScrollPane에 대한 마우스 끌기 스크롤을 구현하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-26 11:19:291014검색

How to Implement Mouse Drag Scrolling for a JScrollPane with Nested Components in Java Swing?

Java Swing의 MouseMotionEvent: 중첩된 구성 요소와 상호 작용하는 방법

구성 요소 계층 구조의 과제

Swing 기반 GUI를 설계할 때 개발자는 종종 중첩된 구성 요소 내에서 마우스 이벤트를 처리할 때 문제가 발생합니다. 기본적으로 마우스 이벤트는 구성 요소 계층 구조 위로 전파되어 최상위 컨테이너에서 끝납니다. 이는 중첩된 구조 내의 특정 구성 요소에 대한 이벤트 처리를 방해할 수 있습니다.

문제: 마우스 이벤트가 내부 구성 요소에 도달하지 않음

제출된 질문에는 그러한 시나리오 중 하나가 예시되어 있습니다. 목표는 마우스 끌기에 응답하는 JScrollPane을 사용하여 스크롤 가능한 보기를 구현하는 것입니다. 그러나 JScrollPane에 추가 구성 요소를 추가하면 마우스 모션 이벤트가 스크롤 창에 도달하는 것이 차단됩니다.

마우스 이벤트 수동 전파: 비효율적인 접근 방식

개발자는 처음에 마우스 이벤트를 수동으로 전파하는 방법을 고려했습니다. 모든 중첩 구성 요소에 리스너를 추가하고 이벤트를 상위 구성 요소에 전달합니다. 그러나 이 접근 방식은 시간 투자가 비현실적입니다.

대체 솔루션: JScrollPane 작업 활용

수동 전파 대신 JScrollPane과 관련된 기존 작업을 활용하는 것이 더 효율적인 솔루션입니다. 이러한 작업은 일반적으로 키 바인딩에 사용됩니다.

솔루션 구현:

  1. 스크롤 작업을 모방하는 사용자 정의 키 바인딩 작업을 만듭니다.
  2. 이러한 작업을 JScrollPane 인스턴스.
  3. 타이머를 사용하여 뷰포트 내 마우스 움직임에 따라 왼쪽, 오른쪽, 위, 아래 등 원하는 스크롤 작업을 지속적으로 트리거합니다.

Java 코드 :

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.