【问题标题】:how does a swing timer work?摆动计时器如何工作?
【发布时间】:2015-04-19 13:28:37
【问题描述】:

您好,我在尝试理解摇摆计时器时遇到了麻烦。为了帮助我,有人可以给我看一个简单的闪烁动画吗?我在互联网上四处寻找,但仍然不完全了解它们是如何工作的。如果有人能给我一个这样的例子,那就太有帮助了:

如果我创建了一个圆圈:

g.setColor(colors.ORANGE);
g.fillOval(160, 70, 50, 50);

然后我如何使用摆动计时器将颜色从橙色更改为灰色,使用带有延迟的摆动计时器?

非常感谢您帮助我理解 :)

【问题讨论】:

  • 检查这是否给你一些想法:stackoverflow.com/questions/9803658/…
  • 您的问题缺少一个重要特征——您尝试解决问题的示例。将来,当您遇到类似的问题时,您会想尽最大努力解决这个问题,然后告诉我们您的代码遇到了什么问题。这将 A)让我们更好地了解您正在尝试做什么,并防止所有这些从您那里提取准确信息的麻烦,并且 B)让我们更好地了解您可能做错了什么,您需要什么帮助与。

标签: java swing timer jframe


【解决方案1】:

首先,您不会像这样对颜色使用进行硬编码:

g.setColor(colors.ORANGE);
g.fillOval(160, 70, 50, 50);

因为这会阻止所有更改颜色状态的能力。而是使用一个类字段来保存所使用的颜色,并将其命名为 ovalColor

private Color ovalColor = SOME_DEFAULT_COLOR; // some starting color

然后使用该颜色进行绘制:

g.setColor(ovalColor);
g.fillOval(160, 70, 50, 50);

然后我会给我的班级一个 Color 数组或 ArrayList<Color> 和一个 int 索引字段:

private static final Color[] COLORS = {Color.black, Color.blue, Color.red, 
       Color.orange, Color.cyan};
private int index = 0;
private Color ovalColor = COLORS[index]; // one way to set starting value

然后在 Swing Timer 的 ActionListener 中,我会增加索引,我会根据数组或 ArrayList 的大小对其进行修改,我会得到索引指示的颜色并调用 repaint();

index++;
index %= COLORS.length;
ovalColor = COLORS[index];
repaint();

还有here's a somewhat similar example.
也请看Swing Timer Tutorial

【讨论】:

    【解决方案2】:

    也许这会有所帮助:

    public class object{
    Color color = Color.GREEN;
    Timer timer;
    public object() {
    
    timer = null;
    timer = new Timer(5000, new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            if (color.equals(Color.GREEN)) {
                color = Color.RED;
                timer.setDelay(2000);
            } else {
                color = Color.GREEN;
                timer.setDelay(8000);
            }
            repaint();
        }
    });
    timer.start();}}
    

    【讨论】:

    • 我猜你会在这之后添加填充?
    • 是的。在这之后你可以调用你的paint方法来绘制或填充。
    • 它的说法是创建一个方法。我想我必须指定要重绘什么?
    【解决方案3】:

    我认为绘画方法会起作用。像这样:

    public void paint(Graphics g){
    super.paint(g);
    
    g.setColor(Color.green);
    g.filloval(30,40,50,50);
     }
    

    【讨论】:

    • 这应该在类对象中的对象 costroctor 之后。
    • yes 添加 paint.repaint() 以便新组件重绘在以前的组件之上。
    • 请不要推荐这个——一个糟糕的推荐。你覆盖了错误的方法——他应该覆盖paintComponent 而不是绘画,而且你在硬编码颜色,我已经建议他不要这样做。并推荐paint.repaint()?怎么回事?这根本没有意义。
    • 你的权利。 paintComponent 确实是一个更好的推荐。那么你对重绘错误的建议是什么?
    • 我的建议是找出它发生的原因。 @ user3077551,原始海报(OP),没有向我们展示他的代码或他的尝试(根据他的问题的评论),这使我们无法知道他做错了什么。据我们所知,他的课程可能没有扩展 JPanel,因此调用 repaint() 毫无意义。他必须改进他的问题。另外,您建议他打电话给paint.repaint(); 是什么意思?这将如何运作?这甚至不是有效的 Java。
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多