为什么我的public String不会更改其字符串?

时间:2017-10-08 20:17:18

标签: java string swing timer

我觉得我在某处看到了类似的东西:
这是我Details...的所在 我觉得我看到的是,如果我的public static String iron = IronCount + " iron";改变了,那么弦铁会改变,但它不会改变,至少在计时器中改变IronCount时不会改变。
我的完整代码在这里(没有所有public int IronCount s):

g.fillRect()

我认为随着IronCount的改变,铁会改变,但它看不到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); } } 总是说:g.drawString(iron, 25, 45);在我的JFrame上。
也许这是Timer的一个错误,我想有一个更好的替代方案 - 比如减慢for循环的重复速度。

1 个答案:

答案 0 :(得分:2)

建议:

  • 从绘画方法中取出那个计时器,它永远不应该在那里。您无法控制该方法,并且可以多次调用
  • 创建并启动计时器,也许在您班级的构造函数中。
  • 同样,正如之前告诉过你的那样,绘画应该在paintComponent方法中完成。
  • 从你的绘画方法中调用超级绘画方法,在你自己的绘画方法中super.paintComponent(g)
  • 在您的计时器中,您可以更改字段的状态并致电repaint()
  • 在paintComponent方法中,检查字段的状态,并根据其值更改绘制。
  • 那些字段不应该是静态的
  • 不要使用java.util.Timer,因为这不是Swing线程安全,而是Swing Timer,例如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());
    }
}