2017-10-08 9 views
-4

どこかでこれに似たものを見たような気がします。
ここで私はpublic static String iron = IronCount + " iron";です。
私は、public int IronCountが変更された場合、文字列のアイロンは変更されますが、TimerでIronCountが変更されている間は、少なくとも変化しないことを確認しました。
私の完全なコードは、(g.fillRect()秒のすべてなし)ここにある:パブリックStringは文字列を変更しないのはなぜですか?

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JComponent; 

public class GeneratorAndGraphics extends JComponent { 

private static final long serialVersionUID = 1L; 

public int IronCount = 0, GoldCount = 0, DiamondCount = 0; 
public String iron = IronCount + " iron"; //$NON-NLS-1$ 

public void paint(Graphics g) { 
    // vertical lines 
    Graphics2D g2d = (Graphics2D) g; 
    // iron generator 
    g.setColor(Color.BLACK); 
    g.drawRect(20, 20, 40, 40); 
    g.drawLine(20, 30, 60, 30); 
    g.setFont(new Font("Arial", Font.PLAIN, 9)); //$NON-NLS-1$ 
    g.drawString("Iron Gen", 22, 30); //$NON-NLS-1$ 
    new java.util.Timer().schedule( 
      new java.util.TimerTask() { 
       @Override 
       public void run() { 
        IronCount++; 
        iron = IronCount + " iron"; // doesn't do anything 
        System.out.println(iron); // doens't print 
       } 
      }, 
      500 
    ); 
    g.drawString(iron, 25, 45); 
} 
} 

私は鉄が変化するであろう、いつでもIronCountが変更されたことを思うだろうが、それはg.drawString(iron, 25, 45);として見ていないいつも言う:私のJFrame上0 ironは、 。
これはTimerのエラーである可能性があります。これはforループの繰り返し速度を遅くするなど、より良い代替方法をご希望です。

+1

あなたは[MCVE]あなたのコードの含まことはできますか?あなたはおそらく 'paint'をオーバーライドしたくないでしょうし、塗料が呼び出されるたびに新しいタイマーの仕事をしたくないと確信しています。 – pvg

答えて

2

提案:

  • は、塗装方法のうち、そのタイマーを取得し、それがそこにあるべきではありません。あなたはそのメソッドを制御できず、何度も呼び出すことができます
  • おそらくクラスのコンストラクタで、タイマーを1回作成して起動します。
  • これまでにも述べたように、paintはpaintComponentメソッドで行う必要があります。
  • あなたの塗装方法内からsuperの塗装方法を呼び出すか、ここではsuper.paintComponent(g)の塗装方法で呼び出します。
  • タイマーでは、フィールドの状態を変更して呼び出しますrepaint()
  • paintComponentメソッドでは、フィールドの状態をチェックし、その値に応じてペイントを変更します。
  • これらのフィールドは、これは安全ではなく、スイングタイマー、例えば、javax.swing.Timerスレッドをスイングされていないようjava.util.Timerを使用しないでください
  • 静的であってはなりません。チュートリアルのためのGoogle。
  • 貴重な時間をあなたに聞いたように、有効なMCVEを投稿してください。あなたのMCVEがなければ、あなたは間違って何をしているのか、それをどうやって結びつけようとしているのか本当に分かりません。
  • あなたに何回も推奨されているようにしてくださいチュートリアルを読んで推測しないよう

THISはMCVEです:

import java.awt.Dimension; 
import java.awt.Graphics; 
import javax.swing.*; 

public class Mcve extends JPanel { 
    private static final int TIMER_DELAY = 1000; 
    private static final String IRON_FORMAT = "%03d iron"; 
    private int ironCount = 0; 

    public Mcve() { 
     setPreferredSize(new Dimension(400, 300)); 
     new Timer(TIMER_DELAY, e -> { 
      ironCount++; 
      repaint(); 
     }).start(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawString(String.format(IRON_FORMAT, ironCount), 25, 45); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Mcve"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Mcve()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

私のペインティングはペイント方法で行われていますが、私はそれが約100行を取ってから取り出しました。ペイント方法からTimerを取り除くことについては、どこに行くことができるのですか?私はTimersの初心者です。ループは私を助けません。 – BlazeDaBlur2

+0

@ BlazeDaBlur2:[mcve]を作成して投稿してください。あなたが間違っていることを推測しないようにしましょう。 –

+0

@ BlazeDaBlur2l:あなたの質問を編集しましたが、まだコンパイルまたは実行できるコードMCVEを投稿していません。上記の私のコードを参照してください**これはあなたが投稿する必要があります、我々は実行とテストをコンパイルできるコードです。 –

関連する問題