>Java >java지도 시간 >Java 애플리케이션에서 공이 튀는 것을 방지하는 방법은 무엇입니까?

Java 애플리케이션에서 공이 튀는 것을 방지하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-03 06:51:38583검색

How to Prevent Overlapping Bouncing Balls in a Java Application?

Java 바운싱 볼

이 문제는 경계를 벗어나는 인터페이스에서 여러 공을 렌더링하도록 설계된 Java 애플리케이션과 관련이 있습니다. 사용자가 단일 공 그리기를 성공적으로 구현했지만 두 번째 공을 추가하려고 하면 첫 번째 공을 덮어쓰므로 문제가 발생합니다.

이 문제를 해결하기 위해 공 목록을 만들고 순환할 수 있습니다. 각 공을 그리려고 하는데 콘텐츠 창에 두 공을 모두 추가하는 데 어려움을 겪습니다.

분석 및 솔루션

가장 큰 문제는 두 공을 배치하는 것입니다. 불투명한 구성요소가 서로 겹쳐서 잠재적으로 하나가 다른 하나를 가릴 수 있습니다. 이 문제를 해결하려면:

  1. 레이아웃 관리자가 공의 레이아웃을 지시하지 않도록 Null 레이아웃 관리자를 사용해야 합니다.
  2. 공 창의 크기와 위치를 제어해야 합니다. , 효과적으로 레이아웃 관리자의 역할을 맡습니다.
  3. 공의 속도와 위치는 무작위로 지정되어 동일한 시작 지점과 동일한 가능성을 줄여야 합니다. 움직임.
  4. EDT(Event Dispatch Thread) 컨텍스트 내에서는 공만 업데이트되어야 합니다.
  5. X/Y 값의 사용은 중복되며 패널 자체를 활용하여 제거할 수 있습니다. .

코드 예제

이를 통합한 향상된 코드 예제 수정:

public class Balls {

    public Balls() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TheBalls());
                frame.setSize(400, 400);
                frame.setVisible(true);
            }
        });
    }

    public class TheBalls extends JPanel {

        public TheBalls() {
            setLayout(null);
            // Randomize the speed and direction...
            add(new Ball("red", 10 - (int) Math.round((Math.random() * 20)), 10 - (int) Math.round((Math.random() * 20))));
            add(new Ball("blue", 10 - (int) Math.round((Math.random() * 20)), 10 - (int) Math.round((Math.random() * 20))));
        }
    }

    public class Ball extends JPanel implements Runnable {

        Color color;
        int diameter;
        long delay;
        private int vx;
        private int vy;

        public Ball(String ballcolor, int xvelocity, int yvelocity) {
            if (ballcolor == "red") {
                color = Color.red;
            } else if (ballcolor == "blue") {
                color = Color.blue;
            } else if (ballcolor == "black") {
                color = Color.black;
            } else if (ballcolor == "cyan") {
                color = Color.cyan;
            } else if (ballcolor == "darkGray") {
                color = Color.darkGray;
            } else if (ballcolor == "gray") {
                color = Color.gray;
            } else if (ballcolor == "green") {
                color = Color.green;
            } else if (ballcolor == "yellow") {
                color = Color.yellow;
            } else if (ballcolor == "lightGray") {
                color = Color.lightGray;
            } else if (ballcolor == "magenta") {
                color = Color.magenta;
            } else if (ballcolor == "orange") {
                color = Color.orange;
            } else if (ballcolor == "pink") {
                color = Color.pink;
            } else if (ballcolor == "white") {
                color = Color.white;
            }
            diameter = 30;
            delay = 100;

            vx = xvelocity;
            vy = yvelocity;

            new Thread(this).start();

        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;

            int x = getX();
            int y = getY();

            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g.setColor(color);
            g.fillOval(0, 0, 30, 30); //adds color to circle
            g.setColor(Color.black);
            g2.drawOval(0, 0, 30, 30); //draws circle
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(30, 30);
        }

        public void run() {

            try {
                // Randamize the location...
                SwingUtilities.invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        int x = (int) (Math.round(Math.random() * getParent().getWidth()));
                        int y = (int) (Math.round(Math.random() * getParent().getHeight()));

                        setLocation(x, y);
                    }
                });
            } catch (InterruptedException exp) {
                exp.printStackTrace();
            } catch (InvocationTargetException exp) {
                exp.printStackTrace();
            }

            while (isVisible()) {
                try {
                    Thread.sleep(delay);
                } catch (InterruptedException e) {
                    System.out.println("interrupted");
                }

                try {
                    SwingUtilities.invokeAndWait(new Runnable() {
                        @Override
                        public void run() {
                            move();
                            repaint();
                        }
                    });
                } catch (InterruptedException exp) {
                    exp.printStackTrace();
                } catch (InvocationTargetException exp) {
                    exp.printStackTrace();
                }
            }
        }

        public void move() {

            int x = getX();
            int y = getY();

            if (x + vx < 0 || x + diameter + vx > getParent().getWidth()) {
                vx *= -1;
            }
            if (y + vy < 0 || y + diameter + vy > getParent().getHeight()) {
                vy *= -1;
            }
            x += vx;
            y += vy;

            // Update the size and location...
            setSize(getPreferredSize());
            setLocation(x, y);

        }
    }
}

대체 접근 방식

또는 공을 수용하기 위해 컨테이너를 만들 수 있습니다. 여기서 공 자체는 구성 요소가 아니지만 튕겨 나갈 수 있는 충분한 정보가 포함된 가상 개념으로 존재합니다. 표면.

확장성 문제

제공된 코드는 스니펫은 각 공에 대해 별도의 스레드를 사용하므로 공 수가 증가하면 시스템 리소스에 영향을 미칠 수 있습니다. 이러한 확장성 문제를 해결하기 위해 단일 BounceEngine 스레드를 사용하여 모든 공 움직임을 처리할 수 있습니다.

위 내용은 Java 애플리케이션에서 공이 튀는 것을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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