重新绘制 BorderPane (javaFx)
Repaint BorderPane (javaFx)
我有一个应用程序可以创建一个缩小的矩形,例如 10 秒的时间流逝,但是当我尝试缩小矩形时,window 错误(没有显示在场景中)并等到倒计时结束以停止窃听(然后显示未缩小的矩形)。
我试图在 Internet 上找到相当于 Swing 中的重绘但不是平均的:/
this.requestLayout () -> 我在互联网上找到了这个,但它不起作用。
这是我的倒计时代码:
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);
}
}
}
这是我的 Borderpane 代码:
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());
}
}
这是我的主要代码:
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();*/
}
}
谢谢 ;)
只要您让 JavaFX 应用程序线程保持忙碌,它就无法执行 layout/rendering。出于这个原因,确保在应用程序线程上 运行 的任何方法很重要,例如Application.start
或输入事件的事件处理程序 return 快速。
lancerCompteur
但是会阻塞应用程序线程 5 秒,因此您看到的唯一结果是方法完成后的最后一个结果。
一般来说,您可以 运行 在不同的线程上编写这样的代码,然后使用 Platform.runLater
来更新 ui。
在这种情况下,您可以利用 Timeline
class,它允许您在给定延迟后触发应用程序线程上的事件处理程序:
@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();
}
- 您还在
Main
class 和 Compteur
class 中使用了 DemoBorderPane
的不同实例;场景中显示的 Rectangle
从未进行过更新。
- 无需在
diminuerRect
中调用 requestLayout
。当 Rectangle
的尺寸被修改时,这会自动发生。
- 惰性初始化是没有意义的,如果您确定 getter 将在对象创建期间被调用。
DemoBorderPane.getRect
是从它的构造函数调用的,因此将初始化移至构造函数将使您可以在不影响功能的情况下摆脱 if
检查。
我有一个应用程序可以创建一个缩小的矩形,例如 10 秒的时间流逝,但是当我尝试缩小矩形时,window 错误(没有显示在场景中)并等到倒计时结束以停止窃听(然后显示未缩小的矩形)。 我试图在 Internet 上找到相当于 Swing 中的重绘但不是平均的:/ this.requestLayout () -> 我在互联网上找到了这个,但它不起作用。 这是我的倒计时代码:
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);
}
}
}
这是我的 Borderpane 代码:
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());
}
}
这是我的主要代码:
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();*/
}
}
谢谢 ;)
只要您让 JavaFX 应用程序线程保持忙碌,它就无法执行 layout/rendering。出于这个原因,确保在应用程序线程上 运行 的任何方法很重要,例如Application.start
或输入事件的事件处理程序 return 快速。
lancerCompteur
但是会阻塞应用程序线程 5 秒,因此您看到的唯一结果是方法完成后的最后一个结果。
一般来说,您可以 运行 在不同的线程上编写这样的代码,然后使用 Platform.runLater
来更新 ui。
在这种情况下,您可以利用 Timeline
class,它允许您在给定延迟后触发应用程序线程上的事件处理程序:
@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();
}
- 您还在
Main
class 和Compteur
class 中使用了DemoBorderPane
的不同实例;场景中显示的Rectangle
从未进行过更新。 - 无需在
diminuerRect
中调用requestLayout
。当Rectangle
的尺寸被修改时,这会自动发生。 - 惰性初始化是没有意义的,如果您确定 getter 将在对象创建期间被调用。
DemoBorderPane.getRect
是从它的构造函数调用的,因此将初始化移至构造函数将使您可以在不影响功能的情况下摆脱if
检查。