> Java > java지도 시간 > Java 애플리케이션에서 서로 덮어쓰지 않고 여러 개의 튀는 공을 표시하려면 어떻게 해야 합니까?

Java 애플리케이션에서 서로 덮어쓰지 않고 여러 개의 튀는 공을 표시하려면 어떻게 해야 합니까?

Susan Sarandon
풀어 주다: 2024-12-10 02:00:09
원래의
521명이 탐색했습니다.

How Can I Display Multiple Bouncing Balls in a Java Application Without Overwriting Each Other?

Java에서 공 튕기기>

문제: Java 애플리케이션에 여러 공을 추가하면 초기 공이 생성됩니다. 두 번째 항목을 덮어쓰면 하나만 표시됩니다. ball.

해결책:

이 문제를 해결하고 화면에 여러 개의 튀는 공을 그리려면 다음 접근 방식을 고려하세요.

< h4>1. 불투명하지 않은 레이아웃 관리자 사용 및 크기 재정의:

  • 불투명 레이아웃 관리자를 제거하여 구성 요소 겹침을 방지하고 공의 크기와 위치를 적절하게 제어할 수 있습니다.
  • 공의 크기와 위치를 제어하기 위해 자체 레이아웃 관리자를 구현합니다. 창.

2. 공 속성 무작위화:

  • 각 공의 속도와 시작 위치를 무작위화하여 공이 충돌하거나 동일한 위치에서 시작할 가능성을 줄입니다.

3. EDT(이벤트 디스패치 스레드) 사용:

  • EDT 컨텍스트 내에서 공을 업데이트하여 원활하고 일관된 그래픽 업데이트를 보장하세요.

< ;h4>4. 공에 대한 컨테이너 클래스 사용:

  • 공을 불투명 구성 요소로 처리하는 대신 색상, 속도, 위치 등 각 공의 속성을 나타내는 클래스를 만듭니다. 시각적인 렌더링 없이.

5. 공 이동을 위한 별도의 스레드 생성:

  • 이 접근 방식을 구현하는 것은 리소스 집약적일 수 있으므로 먼저 다른 대안을 찾아보세요.

코드 샘플(컨테이너 클래스 사용) 공):

public class Balls extends JPanel {

    private List<Ball> ballsUp;

    // ... (Constructor and other methods)

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (Ball ball : ballsUp) {
            ball.paint(g2d);
        }
        g2d.dispose();
    }

    public List<Ball> getBalls() {
        return ballsUp;
    }
}

public class Ball {

    private Color color;
    private Point location;
    private Dimension size;
    private Point speed;

    // ... (Constructor and other methods)

    protected void paint(Graphics2D g2d) {

        Point p = getLocation();
        if (p != null) {
            g2d.setColor(getColor());
            Dimension size = getSize();
            g2d.fillOval(p.x, p.y, size.width, size.height);
        }

    }
}

public class BounceEngine implements Runnable {

    private Balls parent;

    // ... (Constructor and other methods)

    public void run() {

        // Randomize ball properties and starting positions
        for (Ball ball : getParent().getBalls()) {
            // ... (Randomization logic)
        }

        while (getParent().isVisible()) {

            // Repaint the balls
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    getParent().repaint();
                }
            });

            // Move each ball
            for (Ball ball : getParent().getBalls()) {
                move(ball);
            }

            // Delay between updates
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
            }

        }

    }

    // ... (Remaining code)

}
로그인 후 복사

컨테이너 클래스와 공 이동을 위한 별도의 스레드를 사용하는 이 접근 방식은 공의 동작을 더 효과적으로 제어하고 더 복잡한 공 애니메이션을 허용합니다.

위 내용은 Java 애플리케이션에서 서로 덮어쓰지 않고 여러 개의 튀는 공을 표시하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿