Java 애플리케이션에서 공이 튀는 것을 방지하는 방법은 무엇입니까?
Jan 03, 2025 am 06:51 AMJava 바운싱 볼
이 문제는 경계를 벗어나는 인터페이스에서 여러 공을 렌더링하도록 설계된 Java 애플리케이션과 관련이 있습니다. 사용자가 단일 공 그리기를 성공적으로 구현했지만 두 번째 공을 추가하려고 하면 첫 번째 공을 덮어쓰므로 문제가 발생합니다.
이 문제를 해결하기 위해 공 목록을 만들고 순환할 수 있습니다. 각 공을 그리려고 하는데 콘텐츠 창에 두 공을 모두 추가하는 데 어려움을 겪습니다.
분석 및 솔루션
가장 큰 문제는 두 공을 배치하는 것입니다. 불투명한 구성요소가 서로 겹쳐서 잠재적으로 하나가 다른 하나를 가릴 수 있습니다. 이 문제를 해결하려면:
- 레이아웃 관리자가 공의 레이아웃을 지시하지 않도록 Null 레이아웃 관리자를 사용해야 합니다.
- 공 창의 크기와 위치를 제어해야 합니다. , 효과적으로 레이아웃 관리자의 역할을 맡습니다.
- 공의 속도와 위치는 무작위로 지정되어 동일한 시작 지점과 동일한 가능성을 줄여야 합니다. 움직임.
- EDT(Event Dispatch Thread) 컨텍스트 내에서는 공만 업데이트되어야 합니다.
- 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 클래스로드 메커니즘은 다른 클래스 로더 및 대표 모델을 포함하여 어떻게 작동합니까?

2025 년 상위 4 개의 JavaScript 프레임 워크 : React, Angular, Vue, Svelte

캐싱 및 게으른 하중과 같은 고급 기능을 사용하여 객체 관계 매핑에 JPA (Java Persistence API)를 어떻게 사용하려면 어떻게해야합니까?

고급 Java 프로젝트 관리, 구축 자동화 및 종속성 해상도에 Maven 또는 Gradle을 어떻게 사용합니까?

Spring Boot Snakeyaml 2.0 CVE-2022-1471 문제 고정
