2017-12-04 1 views
0

그래서 처음에는 스윙을 망 쳤으 며 이상한 문제가 생겼습니다. 그래서 목록마다 "셰이프"를 자주 추가하고, JPanel의 paintComponent 메서드에서 목록을 반복하고 셰이프를 그립니다. 또한 테스트 목적으로 for 루프 외부에 모양을 그립니다.Java Swing이있는 그래픽 버그 - 목록에서 그리면 요소가 점프합니다.

for 루프의 모양이 화면 주위를 무작위로 점프합니다. 이는 모양이이 루프에서 그려지는 경우에만 발생합니다.

난 이미 시도 무엇 :

  • 업데이트 그래픽 드라이버를 가능한 스레드를 사용하는 대신 스윙 타이머
  • 의 java.util.Timer를 사용하여 통합 된 GPU와 이산 GPU
  • /모두
  • LinkedList, Vector 및 일반 배열과 같은 ArrayList 이외의 것을 사용합니다.
  • 문자 그대로 기본적으로 제외한 모든 것을 제 코드에서 제외했습니다. 이것이 우리가 여기서 남긴 것입니다. 나는 내가 알아 차릴 때까지 더 복잡한 것들을 그렸습니다.
  • 타이밍을 변경했습니다 (PERIOD 변수, 밀리 초 단위). 내가 그것을 늘리거나 줄일 경우 악화 될 것입니다.
  • 시스템 시간 (밀리 초 단위)에서 시스템 시간 (나노초 단위)으로 변경되어 밀리 초 단위로 변환됩니다. 나는 이것이 같은 것이어야한다는 것을 알고 있지만 나는 아이디어가 부족했다. image

    당신은 작은 사각형 무작위 간격으로 주위를 이동합니다 것을 알 수 있습니다 : 여기

은 (15초 긴) 문제의 GIF입니다. 이것은 발생하지 않아야합니다. 나는 무작위 좌표에 사각형을 "산란"시키려고합니다. 인 JPanel 클래스, 기본 클래스 (확장 JFrame의), 및 모양 클래스

있는 경우 :이 순서대로 3 개 클래스를 포함했다 code

: 여기

은 페이스트 빈에있는 코드입니다 링크가 작동하지 않으면 알리고 즉시 다른 링크를 게시 할 것입니다.

감사합니다.

+0

코드 링크가 없습니다. 우리는 자원 봉사자이며, 질문에 대한 대답을 가능한 한 쉽게 만들어야한다는 것을 기억하십시오. –

+1

디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작을 포함해야하며 * 질문 자체에 * 재현하는 데 필요한 * 가장 짧은 코드 *가 있어야합니다. [mcve]를 작성하고 게시하여 작고 편집 가능한 실행 가능한 프로그램으로 게임을 진행할 수 있도록하고 코드를 직접 테스트하고 잘 작동하도록 수정하십시오.** 전체 프로그램을보고 싶지는 않으며 ** 코드 저장소에 대한 링크를 게시해야합니다. 대신 작게 유지하고 단순하게 유지하여 작동하게하십시오. –

+0

별도의 페이지에서 많은 코드를 작성하는 것이 더 쉬울 것이라고 생각했습니다. 나는 또한 문제가 어디에 있는지 확실하지 않았다. 앞으로도 기억할 것입니다. @HovercraftFullOfEels – Nahr

답변

0

이 설정 ...

@Override 
public final void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    if (this.startTime == -1L) { 
     this.startTime = Main.timeMillis(); 
    } 
    final long timeDiff = Main.timeMillis() - this.startTime; 
    if (this.circlesIndex <= 19 && timeDiff > 2000) { 
     final int randX = this.rand.nextInt(this.WIDTH); 
     final int randY = this.rand.nextInt(this.HEIGHT); 
     this.testShapes.add(new TestShape(randX, randY)); 
     this.startTime = Main.timeMillis(); 
    } 
    for (TestShape ts : this.testShapes) { 
     ts.draw(g); 
    } 
    g2.setColor(Color.gray); 
    g2.fill3DRect(350, 400, 100, 60, true); 
} 

@Override 
public final void actionPerformed(final ActionEvent event) { 
    x++; 
    if (x > WIDTH) { 
     x = -50; 
    } 
    repaint(); 
} 

은 잘못된 것입니다.

페인트는 페인트 용입니다. 페인트 방법 내부에서 UI의 상태를 수정해서는 안되며, ActionListener에서 수행하십시오. 문제는 여러 가지 이유로 인해 구성 요소를 그릴 수 있으며 대부분 제어하거나 알지 못하는 것입니다.

+0

감사합니다. draw 호출과 Graphics2D 호출을 제외한 모든 것들을 actionPerformed 메소드로 옮겼습니다. 그러나 문제는 여전히 지속됩니다. – Nahr

+0

@Nahr 문제가 없지만'this.circlesIndex'도 제공하지 않으므로 동일한 코드를 실행하지 않습니다 – MadProgrammer

+0

죄송합니다. 모든 것을 제거하기 전에 내 코드에서 남겨 두었습니다. 더 이상 아무것도하지 않습니다. 이 코드에서는 그대로 0입니다. @MadProgrammer – Nahr