2017-10-08 90 views
-4

我覺得我看到類似這樣的東西的地方:
這就是我做public static String iron = IronCount + " iron";
我想吃什麼,我看到的是,如果我的public int IronCount改變,字符串鐵會改變,但事實並非如此,至少不改變,而IronCount在一個定時器改變。
我的全代碼是在這裏(沒有所有的g.fillRect() S的):爲什麼我的公共字符串不改變它的字符串?

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);總是說:0 iron在我的JFrame 。
也許這是Timer的錯誤,我想有一個更好的選擇 - 例如減慢for-loop的重複速度。

+1

你可以包括你的代碼[MCVE]您可能不希望重寫'paint',並且您幾乎肯定不希望每次調用paint時都要執行新的計時器任務。 – pvg

回答

2

建議:

  • 把那計時器出了畫法的,它不應該在那裏。你有過這種方法沒有控制權,它可以被調用多次
  • 創建,一旦開始計時,也許在你的類的構造函數。
  • 同樣,正如前面告訴你的,繪畫應該在paintComponent方法中完成。
  • 執行從調用超的繪畫方法,你的畫法中,這裏super.paintComponent(g)你自己的繪畫方法中。
  • 在您的計時器中,您更改字段的狀態並致電repaint()
  • 在paintComponent方法中,檢查字段的狀態並根據其值更改繪畫。
  • 這些領域不應該是靜態
  • 不要使用java.util.Timer,因爲這不是Swing線程安全的,而是一個Swing計時器,例如,javax.swing.Timer。谷歌的教程。
  • 請按照您問過無數次的方式發佈有效的MCVE。沒有你的MCVE,我們真的不知道你做錯了什麼,或者你是如何將它們聯繫在一起的。
  • 務必閱讀教程,並避免在猜測已經建議多次向你

是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不在paint方法中,它可以發展到哪裏,我是Timers的新手,for循環不會幫助我。 – BlazeDaBlur2

+0

@ BlazeDaBlur2:創建併發布你的[mcve]。請讓我們避免猜測你做錯了什麼。 –

+0

@ BlazeDaBlur2l:你已經編輯了你的問題,而**仍然**沒有發佈我們可以編譯或運行的代碼,一個MCVE。請看我上面的代碼,因爲這是你**應該發佈的內容,我們可以編譯運行和測試的代碼。 –

相關問題