2017-10-16 2 views
0

moving a ball across the screen while changing its color over time과 관련된 질문에 답하려고했는데, 이상한 버그 (내 코드에있는 것 같습니다)를 만났습니다.이 질문을하면서 related question 하지만 그 질문은 Client-Server 아키텍처를 사용하는 반면, 광산은 단순히 실행중인 Swing 앱입니다.스윙 사용자 정의 페인팅 애니메이션이 프레임의 절반 너비에 도달 한 후 중지합니다.

원/공의 이름을 지정하고 싶지만 JPanel 또는 JFrame의 절반 너비에 도달하면 보이지 않거나 멈 춥니 다.

는 처음에 나는 내 JPanel 심하게 배치 될 수 있다고 생각,하지만 난 그것에 Border을 추가, 그래서 나는 그것의 크기를 볼 수 있지만,이 JFrame의 전체 공간의 주위에 모든 경계를 보여주는 것.

다음으로 나는 수학적으로 문제가 될 수 있다고 생각했기 때문에, 원래의 그림보다 큰 공을 작게 만들고, 같은 결과를 얻었으며, 창을 확대하거나 축소 할 때 같은 문제가 발생하기로 결정했습니다. 크기. 내가 10로 변경하는 경우가 눈에 보이지 않는되기 때문에

, 내가 대신 내가 원래 추가 된 109에 의해 증가를 변경하는 데 필요한 다음과 같은 결과를 얻으려면 :

enter image description here

아래의 코드를 생성 위의 출력 :

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Ellipse2D; 
import java.util.Random; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 

public class ChangingColorBall { 
    private JFrame frame; 
    private Timer timer; 
    private BallPane ballPane; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new ChangingColorBall()::createAndShowGui); 
    } 

    private void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 
     ballPane = new BallPane(); 

     timer = new Timer(100, e -> { 
      ballPane.increaseX(); 
     }); 

     ballPane.setBorder(BorderFactory.createLineBorder(Color.RED)); 

     frame.add(ballPane); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     timer.start(); 
    } 

    @SuppressWarnings("serial") 
    class BallPane extends JPanel { 
     private int x; 
     private static final int Y = 50; 
     private static final int SIZE = 20; 
     private Color color; 
     private Random r; 

     public void increaseX() { 
      x += 9; 
      r = new Random(); 
      color = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)); 
      revalidate(); 
      repaint(); 
     } 

     public int getX() { 
      return x; 
     } 

     public void setX(int x) { 
      this.x = x; 
     } 

     public Color getColor() { 
      return color; 
     } 

     public void setColor(Color color) { 
      this.color = color; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g; 

      g2d.setColor(color); 
//   g2d.fill(new Ellipse2D.Double(x, Y, SIZE, SIZE)); 
      g2d.fillOval(x, Y, SIZE, SIZE); 
     } 

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

나는 또한이 Shapes API에 관련된 것일 수 있다고 생각하고, 차에 결정 동일한 결과를 가지고 fillOval으로 이동하십시오. 아직 GIF를 게시 할 수 없지만 필요한 경우 나중에 추가 할 예정입니다. 내가 같이 나중에이 코드를 테스트 할 수 있습니다 컴파일 및 Java 1.8에서

그것을 실행 나는 맥북 프로에 맥 OS 시에라 10.12.6 (16G29)에서 일하고 있어요

(13 ''레티 나 디스플레이를, 2015 년 초) 글쎄 내 자신의 PC에서 내 작품의 맥,하지만,이 버그가 스윙의 API 또는 내 자신의 코드 버그와 관련된 수 있을까? 그렇다면, 내가 뭘 잘못하고 있니? 그것은 나에게 명확하지 않기 때문에

+0

위치 및 색상 개념을 가지고 있으며 자체 페인트, 업데이트 및 패널 페인트 작업을 수행하는 "모양"객체 만들기 – MadProgrammer

답변

4

BallPane 클래스에 JComponent에 정의 된 getX() 메서드를 우회적으로 무시하는 것이 문제입니다.

getX() 지금 어떻게 볼의 움직임을 정의하고, 따라서이 동작의 결과로 당신의 필드 x를 반환으로도 변화 getX()에 액세스 할 때마다 X이 (가) JPanel 좌표 결과. 방법 getX()BallPane에서 제거하거나 이름을 바꿔야합니다.

+0

내 바보 같은 ... 나는 IDE의 녹색 화살표를 보지 못했습니다. 오버라이드를 보여 주며 완전히 잊어 버렸습니다 ... – Frakcool

관련 문제