2017-10-08 89 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。请看我上面的代码,因为这是你**应该发布的内容,我们可以编译运行和测试的代码。 –

相关问题