moving a ball across the screen while changing its color over time과 관련된 질문에 답하려고했는데, 이상한 버그 (내 코드에있는 것 같습니다)를 만났습니다.이 질문을하면서 related question 하지만 그 질문은 Client-Server 아키텍처를 사용하는 반면, 광산은 단순히 실행중인 Swing 앱입니다.스윙 사용자 정의 페인팅 애니메이션이 프레임의 절반 너비에 도달 한 후 중지합니다.
원/공의 이름을 지정하고 싶지만 JPanel
또는 JFrame
의 절반 너비에 도달하면 보이지 않거나 멈 춥니 다.
JPanel
심하게 배치 될 수 있다고 생각,하지만 난 그것에
Border
을 추가, 그래서 나는 그것의 크기를 볼 수 있지만,이
JFrame
의 전체 공간의 주위에 모든 경계를 보여주는 것.
다음으로 나는 수학적으로 문제가 될 수 있다고 생각했기 때문에, 원래의 그림보다 큰 공을 작게 만들고, 같은 결과를 얻었으며, 창을 확대하거나 축소 할 때 같은 문제가 발생하기로 결정했습니다. 크기. 내가 10
로 변경하는 경우가 눈에 보이지 않는되기 때문에
10
의
9
에 의해 증가를 변경하는 데 필요한 다음과 같은 결과를 얻으려면 :
이
아래의 코드를 생성 위의 출력 :
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 또는 내 자신의 코드 버그와 관련된 수 있을까? 그렇다면, 내가 뭘 잘못하고 있니? 그것은 나에게 명확하지 않기 때문에
위치 및 색상 개념을 가지고 있으며 자체 페인트, 업데이트 및 패널 페인트 작업을 수행하는 "모양"객체 만들기 – MadProgrammer