2017-12-04 3 views
0

だから、私はしばらくの間、Swingを使いこなしていました。だから、私は頻繁にリストに "シェイプ"を追加しています。そして、JPanelのpaintComponentメソッドで、リストをループしてシェイプを描いています。私はまた、テスト目的のためにforループの外に形状を描きます。Java Swingを使ったグラフィカルなバグ - リストから描画すると要素がジャンプする

forループの図形がランダムに画面の周りをジャンプします。これは、このループで図形が描画されている場合にのみ発生します。

私はすでに試みているもの:

  • 更新グラフィックドライバを実行可能スレッドを使用する代わりにスイングタイマー
  • のjava.util.Timerを使用して統合されたGPUとディスクリートGPU
  • /両方のために
  • LinkedList、Vector、および通常のArrayなど、ArrayList以外のものを使用する。
  • 基本的なことを除いて、文字通り私のコードからすべてを削除しました。これはここで残したものです。私はそれに気づいた前にもっと複雑なことを描いていました。
  • タイミングを変更しました(PERIOD変数、ミリ秒単位)。それを増減すると悪化します。
  • システム時間をミリ秒単位で、ナノ秒単位のシステム時間に変更し、ミリ秒に変換しました。私はこれが同じでなければならないことを知っているが、私はアイデアが不足していた。

ここでは、(15秒長い)問題のGIFです: image

あなたは小さな正方形をランダムな間隔で周りにジャンプしますことに気づくでしょう。これは発生しません。私はランダムなコードで正方形を「スポーン」しようとしています。 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

ありがとうございます。私は描画呼び出しとGraphics2D呼び出しを除くすべてのものをactionPerformedメソッドに移動しました。しかし、問題は依然として続く。 – Nahr

+0

@Nahr私は問題はありませんが、あなたは 'this.circlesIndex'も提供しないので、私は同じコードを実行していません – MadProgrammer

+0

申し訳ありません。すべてを取り去る前に、私のコードから残されていました。もう何もしません。このコードでは文字通りただの0です。@MadProgrammer – Nahr

関連する問題