亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaFX 未渲染數組中較早的項目,無法找到問題,相信線程可能是問題所在

JavaFX 未渲染數組中較早的項目,無法找到問題,相信線程可能是問題所在

FFIVE 2023-07-13 14:30:49
我編寫了一個畫線算法,在計算每個點時可以正確運行,但是當它被渲染時,程序會跳過近 20 個點,無法找到問題。我試圖弄亂算法,特別是 for 循環,它將點添加到計算線的位置列表中,因為我在其他版本的代碼中遇到了問題。我只是一輩子都找不到代碼的問題,我對 Java 還很陌生,你可能會從下面混亂的代碼中看出這一點。它說不要發布整個文件,但我無法確定哪里出了問題。我對下面混亂的代碼感到非常抱歉,我只是不知道出了什么問題。package sample;import com.sun.jdi.ArrayReference;import javafx.application.Application;import javafx.application.Platform;import javafx.scene.Group;import javafx.scene.canvas.Canvas;import javafx.scene.canvas.GraphicsContext;import javafx.scene.paint.Color;import javafx.scene.Scene;import javafx.stage.Stage;import java.util.ArrayList;class PositionCounter {    public int position;    public void setPosition(int newPos){        position = newPos;    }}public class Main extends Application {//    public void drawRectangle(int x1, int y1, int x2, int y2, Stage primStage, GraphicsContext gc){//        drawLine(x1, y2, x2, y2 , primStage, gc);//        drawLine(x1, y1, x2, y2, primStage, gc);//        drawLine(x1, y1, x1 , y2, primStage, gc);//        drawLine(x2, y1, x2 , y2, primStage, gc);//        drawLine(x1, y1, x2, y1 , primStage, gc);////    }//    public void fillPosition(ArrayList<Integer[]> points, GraphicsContext gc, int positionInArray ){        gc.fillRect(points.get(positionInArray)[0], points.get(positionInArray)[1], squareWidth / 2, squareWidth / 2);        //System.out.println("(" + points.get(positionInArray)[0] + ", " + points.get(positionInArray)[1]);    }    public void drawLine(int x1, int y1, int x2, int y2, Stage primStage, GraphicsContext gc){        ArrayList<Integer[]> points = calculateLine(x1, y1, x2, y2, gc);        PositionCounter position = new PositionCounter();        Thread thread = new Thread(new Runnable() {            @Override            public void run() {                    Runnable updater = new Runnable() {                        @Override                        public void run() {                            fillPosition(points, gc, position.position);                        }                    };問題是計算線函數返回正確的點,只是沒有正確渲染它們。
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

我建議您使用Timeline而不是Thread.?它可以使用 a 來完成Thread,但Timeline專為此類情況而設計。

畫線方法:

public void drawLine(int x1, int y1, int x2, int y2, Stage primStage, GraphicsContext gc)

{


? ? ArrayList<Integer[]> points = calculateLine(x1, y1, x2, y2, gc);

? ? PositionCounter position = new PositionCounter();


? ? int dy = Math.abs(y2 - y1);

? ? int dx = Math.abs(x2 - x1);

? ? int m = (dy >= dx) ? dy : dx;


? ? AtomicInteger counter = new AtomicInteger();

? ? Timeline animationTimeline = new Timeline(new KeyFrame(Duration.millis(20), (ActionEvent t) -> {

? ? ? ? position.setPosition(counter.getAndIncrement());

? ? ? ? fillPosition(points, gc, position.position);

? ? }));

? ? animationTimeline.setCycleCount(points.size());

? ? animationTimeline.play();


}

完整代碼:


import com.sun.jdi.ArrayReference;

import javafx.application.Application;

import javafx.application.Platform;

import javafx.scene.Group;

import javafx.scene.canvas.Canvas;

import javafx.scene.canvas.GraphicsContext;

import javafx.scene.paint.Color;

import javafx.scene.Scene;

import javafx.stage.Stage;


import java.util.ArrayList;

import java.util.concurrent.atomic.AtomicInteger;

import javafx.animation.KeyFrame;

import javafx.animation.Timeline;

import javafx.event.ActionEvent;

import javafx.event.EventHandler;

import javafx.util.Duration;


class PositionCounter

{


? ? public int position;


? ? public void setPosition(int newPos)

? ? {

? ? ? ? position = newPos;

? ? }

}


public class JavaFXTestingGround extends Application

{


//? ? public void drawRectangle(int x1, int y1, int x2, int y2, Stage primStage, GraphicsContext gc){

//? ? ? ? drawLine(x1, y2, x2, y2 , primStage, gc);

//? ? ? ? drawLine(x1, y1, x2, y2, primStage, gc);

//? ? ? ? drawLine(x1, y1, x1 , y2, primStage, gc);

//? ? ? ? drawLine(x2, y1, x2 , y2, primStage, gc);

//? ? ? ? drawLine(x1, y1, x2, y1 , primStage, gc);

//

//? ? }

//

? ? public void fillPosition(ArrayList<Integer[]> points, GraphicsContext gc, int positionInArray)

? ? {

? ? ? ? gc.fillRect(points.get(positionInArray)[0], points.get(positionInArray)[1], squareWidth / 2, squareWidth / 2);

? ? ? ? //System.out.println("(" + points.get(positionInArray)[0] + ", " + points.get(positionInArray)[1]);

? ? }


? ? public void drawLine(int x1, int y1, int x2, int y2, Stage primStage, GraphicsContext gc)

? ? {


? ? ? ? ArrayList<Integer[]> points = calculateLine(x1, y1, x2, y2, gc);

? ? ? ? PositionCounter position = new PositionCounter();


? ? ? ? int dy = Math.abs(y2 - y1);

? ? ? ? int dx = Math.abs(x2 - x1);

? ? ? ? int m = (dy >= dx) ? dy : dx;


? ? ? ? AtomicInteger counter = new AtomicInteger();

? ? ? ? Timeline animationTimeline = new Timeline(new KeyFrame(Duration.millis(20), (ActionEvent t) -> {

? ? ? ? ? ? position.setPosition(counter.getAndIncrement());

? ? ? ? ? ? fillPosition(points, gc, position.position);

? ? ? ? }));

? ? ? ? animationTimeline.setCycleCount(points.size());

? ? ? ? animationTimeline.play();


? ? }


? ? @Override

? ? public void start(Stage primaryStage) throws Exception

? ? {


? ? ? ? //STUFF

? ? ? ? Group root = new Group();

? ? ? ? Scene scene = new Scene(root, 400, 400);

? ? ? ? scene.setFill(Color.GOLD);


? ? ? ? Canvas canvas = new Canvas(400, 400);

? ? ? ? GraphicsContext gc = canvas.getGraphicsContext2D();


? ? ? ? root.getChildren().add(canvas);

? ? ? ? //////////


? ? ? ? gc.fillRect(0, 200, 400, 1);

? ? ? ? gc.fillRect(0, 100, 400, 1);

? ? ? ? gc.fillRect(0, 300, 400, 1);

? ? ? ? gc.fillRect(200, 0, 1, 400);

? ? ? ? gc.fillRect(100, 0, 1, 400);

? ? ? ? gc.fillRect(300, 0, 1, 400);


? ? ? ? // drawRectangle(50, 50, 350, 250, primaryStage, gc);

? ? ? ? //drawLine(50, 250, 350, 250 , primaryStage, gc);

? ? ? ? //drawLine(50, 50, 350, 250, primaryStage, gc);

? ? ? ? //drawLine(50, 50, 50 , 250, primaryStage, gc);

? ? ? ? //drawLine(350, 50, 350 , 250, primaryStage, gc);

? ? ? ? drawLine(50, 50, 350, 50, primaryStage, gc);


? ? ? ? //////////

? ? ? ? primaryStage.setScene(scene);

? ? ? ? primaryStage.show();

? ? ? ? /////////

? ? }


? ? int squareWidth = 2;


? ? public ArrayList<Integer[]> calculateLine(int x1, int y1, int x2, int y2, GraphicsContext gc)

? ? {


? ? ? ? ArrayList<Integer[]> points = new ArrayList<Integer[]>();


? ? ? ? int dy = Math.abs(y2 - y1);

? ? ? ? int dx = Math.abs(x2 - x1);


? ? ? ? int sx = (x1 < x2) ? 1 : -1;

? ? ? ? int sy = (y1 < y2) ? 1 : -1;


? ? ? ? int err = dx - dy;

? ? ? ? int x = x1;

? ? ? ? int y = y1;

? ? ? ? int e2 = 0;


? ? ? ? Integer[] pos = new Integer[2];

? ? ? ? pos[0] = x;

? ? ? ? pos[1] = y;

? ? ? ? points.add(pos);


? ? ? ? int m = (dy >= dx) ? dy : dx;


? ? ? ? for (int i = 0; i <= m; i++) {


? ? ? ? ? ? e2 = 2 * err;

? ? ? ? ? ? if (e2 > -dy) {

? ? ? ? ? ? ? ? err = err - dy;

? ? ? ? ? ? ? ? x = x + sx;

? ? ? ? ? ? ? ? Integer[] position = new Integer[2];

? ? ? ? ? ? ? ? position[0] = x;

? ? ? ? ? ? ? ? position[1] = y;

? ? ? ? ? ? ? ? points.add(position);

? ? ? ? ? ? }


? ? ? ? ? ? if (e2 < dx) {

? ? ? ? ? ? ? ? err = err + dx;

? ? ? ? ? ? ? ? y = y + sy;

? ? ? ? ? ? ? ? Integer[] position = new Integer[2];

? ? ? ? ? ? ? ? position[0] = x;

? ? ? ? ? ? ? ? position[1] = y;

? ? ? ? ? ? ? ? points.add(position);

? ? ? ? ? ? }


? ? ? ? }


? ? ? ? return points;

? ? }


? ? public static void main(String[] args)

? ? {

? ? ? ? launch(args);

? ? }

}



查看完整回答
反對 回復 2023-07-13
  • 1 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號