首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重油漆BorderPane (javaFx)

重油漆BorderPane (javaFx)
EN

Stack Overflow用户
提问于 2018-03-11 10:26:36
回答 1查看 310关注 0票数 0

我有一个应用程序可以创建一个矩形,该矩形的大小可以减小--例如,时间间隔为10秒--但是当我试图缩小矩形时,窗口缺陷(在场景中什么都不会显示)并等待倒计时结束以停止窃听(然后显示矩形没有缩小)。我试图在互联网上找到相当于在Swing中重新绘制的内容,但不是average: / this.requestLayout () -> --我在互联网上找到了这个,但是它不起作用。这是我的倒计时代码:

代码语言:javascript
复制
public class Compteur {

    DemoBorderPane p ;

    public DemoBorderPane getPan() {
        if(p==null) {
            p = new DemoBorderPane();
        }
        return p;
    }

    public Compteur() {

    }

    public void lancerCompteur() throws InterruptedException {


       int leTempsEnMillisecondes=1000;

        for (int i=5;i>=0;i--) {
            try {
                Thread.sleep (leTempsEnMillisecondes);
            } 
            catch (InterruptedException e) {
                System.out.print("erreur");
            }
            System.out.println(i);
            getPan().diminuerRect(35);
        }
    }
}

这是我的Border窗格代码:

代码语言:javascript
复制
public class DemoBorderPane extends BorderPane {

    private Rectangle r;

    public Rectangle getRect() {
        if(r==null) {
            r = new Rectangle();
             r.setWidth(350);
                r.setHeight(100);
                r.setArcWidth(30);
                r.setArcHeight(30);
                r.setFill( //on remplie notre rectangle avec un dégradé
                        new LinearGradient(0f, 0f, 0f, 1f, true, CycleMethod.NO_CYCLE,
                            new Stop[] {
                                new Stop(0, Color.web("#333333")),
                                new Stop(1, Color.web("#000000"))
                            }
                        )
                    );
        }

        return r;
    }

    public void diminuerRect(int a) {
        getRect().setWidth(getRect().getWidth()-a);
        int c= (int) (getRect().getWidth()-a);
        System.out.println(c);
        this.requestLayout();
        //this.requestFocus();
    }


    public DemoBorderPane() {
        this.setBottom(getRect());

    }
}

这是我的主要代码:

代码语言:javascript
复制
public class Main extends Application {
    private DemoBorderPane p;

    public DemoBorderPane getPan() {
        if(p==null) {
            p = new DemoBorderPane();
        }
        return p;
    }

    @Override
    public void start(Stage primaryStage) {
        Compteur c = new Compteur();
        try {

            //Group root = new Group();
            Scene scene = new Scene(getPan(),800,600);
            //scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            //root.getChildren().add(getPan());
            primaryStage.setScene(scene);
            primaryStage.show();



        } catch(Exception e) {
            e.printStackTrace();
        }

        try {
            c.lancerCompteur();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        launch(args);


        /*Son s = null;
        try {
            s = new Son();
        } catch (LineUnavailableException | IOException | UnsupportedAudioFileException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        s.volume(0.1);
        s.jouer();
        c.lancerCompteur();
        s.arreter();*/

    }
}

谢谢;)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-11 10:50:18

只要JavaFX应用程序线程保持忙碌,它就无法执行布局/呈现。因此,确保在应用程序线程上运行的任何方法(例如,输入事件上的Application.start或事件处理程序)返回得很快是很重要的。

然而,lancerCompteur阻塞应用程序线程5秒,所以您看到的唯一结果是方法完成后的最后一个结果。

通常,您可以在不同的线程上运行这样的代码,并使用Platform.runLater更新ui。

在这种情况下,您可以利用Timeline类,它允许在给定延迟后在应用程序线程上触发事件处理程序:

代码语言:javascript
复制
@Override
public void start(Stage primaryStage) {
    Scene scene = new Scene(getPan(), 800, 600);

    Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), event -> {
        getPan().diminuerRect(35);
    }));
    timeline.setCycleCount(5);
    timeline.play();

    primaryStage.setScene(scene);
    primaryStage.show();
}
  • 您还可以在DemoBorderPane类和Compteur类中使用不同的Compteur实例;场景中显示的Rectangle从未被更新过。
  • 没有必要在requestLayout中调用diminuerRect。当修改Rectangle的大小时,就会自动发生这种情况。
  • 如果您确信在对象创建过程中会调用getter,则延迟初始化是没有意义的。DemoBorderPane.getRect是从它的构造函数调用的,因此将初始化移动到构造函数将允许您在不影响功能的情况下消除if检查。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49218960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档