Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоковая отрисовка на canvas в приложении JavaFX, Потоковая отрисовка на canvas в приложен 
:(
    Опции темы
solo700
Дата 7.7.2017, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 7.7.2017

Репутация: нет
Всего: нет



Простое приложение. Каркас 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++;
            }
        }
    }
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1237 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.