Java:如何在特定时间后“中断”开关柜?

时间:2019-02-11 17:27:27

标签: java libgdx switch-statement break

我有一个渲染项目的方法。

我遇到的问题是我希望4.1秒钟后开关盒破裂。我不想使用Thread.sleep,因为它会在运行时冻结整个屏幕。

这是我尝试过的方法,但是不起作用:

private void drawItems(){
       itemSelected = randomInt.getValue3();
       switch (itemSelected){
           case 0: if (!Obstacle.case0) {
               doSomething();
           }
               new java.util.Timer().schedule(
                       new java.util.TimerTask() {
                           public void run() {
                                break;
                           }
                       },
                       4100
               );
// other cases

我想破坏它,因为否则会在屏幕上渲染超过1个项目,但是问题是“破坏”必须在开关或循环外部。

3 个答案:

答案 0 :(得分:1)

最简单的形式是:

<Label Content="{Binding DayNumber}">
    <Label.Style>
        <Style TargetType="Label">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected, 
                                               RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" 
                             Value="True">
                    <Setter Property="FontWeight" Value="ExtraBold"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Label.Style>
</Label>

然后在您的主要方法/驱动程序类中:

public class DrawingThread extends Thread {
    private boolean goon = true;

    public void run() { 
        //Drawing routine.. stop if goon is no longer true
    }

    public void requestStop() {
        goon = false;
    }
 }

Some pointers at Jenkov.com,也在Oracle的Java文档中。如果这对您来说很有效,请考虑重用Thread对象,该页面侧栏中第26点下方的内容可能会有用。

答案 1 :(得分:1)

您根本不应该触发线程,只需使用增量时间处理时间,您以后也可以创建包装器:

How can I set timer in LIBGDX

这是我的计时器实现: libgdx Timer countdown implmentation

答案 2 :(得分:1)

没有足够的声誉来发表评论,但是我不会像人们所建议的那样使用本机Java线程来解决此问题。我注意到该帖子被Libgdx标记。 Libgdx在其文档中明确指出不支持线程,因此我会谨慎使用它们。

您应该做的是每隔一段时间调用一次drawItems函数。 Libgdx有自己的计时器类,我相信它们使用与主线程相同的线程(不过请不要在此引用我,可以肯定的是,我将使用Hllink的答案)。从当前代码中删除计时器计划,并将其移至调用drawItems函数的位置,并在每次完成时重新启动计时器,以便在需要时无限循环。我现在正在使用手机,因此稍后会弹出我的桌面并发布代码。