Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Потоковая отрисовка на canvas в приложении JavaFX


Автор: solo700 7.7.2017, 17:09
Простое приложение. Каркас 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++;
            }
        }
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)