Простое приложение. Каркас JavaFX в рабочей области Canvas и Button. Запускается приложение, создается каркас, запускается поток в котором в цикле с задержкой 10 миллисек. на canvas отрисовывается текст. Рано или поздно текст на canvas встает. На консоль продолжает выводиться. Иногда на canvas отрисовывается 1000 раз, иногда 100 а иногда 300000 раз. Кто знает в чем дело ? Почему в какой то момент текст перестает отрисовываться ? Программа небольшая ... ниже исходники. файл Main.java Код | package drawtext; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Button; import javafx.scene.layout.StackPane;
public class Main extends Application { static int isShutdown = 0; static int isStopDraw = 0; final Canvas canvas = new Canvas(400, 400); final GraphicsContext gc = canvas.getGraphicsContext2D(); Button btn = new Button(); Stage primaryStageMy; StackPane root = new StackPane(); Scene scene = new Scene(root,400,400);
@Override public void start(Stage primaryStage) { try { btn.setText("isStopDraw " + isStopDraw); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { if(0==isStopDraw) { isStopDraw=1; } else { isStopDraw=0; } btn.setText("isStopDraw " + isStopDraw); } }); root.getChildren().add(canvas); root.getChildren().add(btn); StackPane.setAlignment(canvas, Pos.CENTER); primaryStage.setScene(scene); primaryStage.show(); ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(new Draw(this)); exec.shutdown(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); isShutdown = 1; } }
|
файл Draw.java Код | package drawtext;
import javafx.geometry.Bounds; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.text.Font;
public class Draw implements Runnable { private Main main; private GraphicsContext gc; public Draw(Main main) { this.main = main; this.gc = main.gc; } public void run() { Bounds ViewRect; synchronized(gc) { gc.setFont(new Font("Times New Roman", 20)); int i = 0; while(true) { try { Thread.sleep(10); } catch(InterruptedException ignory) { System.out.println("Аварийный выход 1 !" + i); //return; continue; } if(1 == main.isShutdown) { break; } if(1 == main.isStopDraw) { System.out.println("Нажата кнопка Стоп !" + i); Thread.yield(); continue; } try { ViewRect=main.canvas.getBoundsInParent(); gc.setFill(Color.WHITE); gc.fillRect(ViewRect.getMinX(), ViewRect.getMinY(), ViewRect.getWidth(), ViewRect.getHeight()); gc.setFill(Color.BLACK); gc.clearRect(0, 0, 400, 400); gc.fillText(" Тестовая запись на холсте. № " + i, 20, 50); } catch(Exception ignory) { System.out.println("Аварийный выход 2 !" + i); //return; continue; } System.out.println(" Тестовый вывод на консоль № " + i); i++; } } } }
|
|