簡體   English   中英

以.jar的身份運行會產生不同的視圖

[英]run as .jar results in a different view

我編寫了一個程序,使用Areachart顯示波形。當我編譯並運行它時,它看起來就像下面的樣子。當我執行.jar文件時,我得到了一個完全不同的波形視圖。

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.AnimationTimer;
import javafx.animation.Timeline;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.stage.Stage;


public class AreaChartSample extends Application {

private static final int MAX_DATA_POINTS = 500;

private Series series;
private int xSeriesData = 0;
private ConcurrentLinkedQueue<Number> dataQ = new ConcurrentLinkedQueue<>();
private ExecutorService executor;
private AddToQueue addToQueue;
private Timeline timeline2;
private NumberAxis xAxis;

private int time_counter=0;
private int [] data_array=null;

private void init(Stage primaryStage) {

    String line,full_text="";

    try {
       BufferedReader in = new BufferedReader(new FileReader("C:/testvideo/test.txt")); 

       while((line=in.readLine())!= null)
       {
           full_text+=line;
       }

       data_array=new int[full_text.length()];
        for(int i=0;i<full_text.length();i++)
        {
            data_array[i]=((int)(full_text.charAt(i)))-127;
           // data_array[i]=((int)(full_text.charAt(i)))-300;
        }
    } catch (Exception e) {
    }



    xAxis = new NumberAxis(0,MAX_DATA_POINTS,MAX_DATA_POINTS/10);
    xAxis.setForceZeroInRange(false);
    xAxis.setAutoRanging(false);

    NumberAxis yAxis = new NumberAxis(-127,127,1);

    yAxis.setAutoRanging(false);

    //-- Chart
    final AreaChart<Number, Number> sc = new AreaChart<Number, Number>(xAxis, yAxis) {
        // Override to remove symbols on each data point
        @Override protected void dataItemAdded(Series<Number, Number> series, int itemIndex, Data<Number, Number> item) {}
    };
    sc.setAnimated(false);
    sc.setId("liveAreaChart");
    sc.setTitle("Animated Area Chart");

    //-- Chart Series
    series = new AreaChart.Series<Number, Number>();
    series.setName("Area Chart Series");
    sc.getData().add(series);

    primaryStage.setScene(new Scene(sc));
}

@Override public void start(Stage primaryStage) throws Exception {
    init(primaryStage);
    primaryStage.show();

    //-- Prepare Executor Services
    executor = Executors.newCachedThreadPool();
    addToQueue = new AddToQueue();
    executor.execute(addToQueue);
    //-- Prepare Timeline
    prepareTimeline();

     primaryStage.setOnCloseRequest(e -> {
       executor.shutdown();
    });


}

public static void main(String[] args) {
    launch(args);
}

private class AddToQueue implements Runnable {
    public void run() {
        try {
            // add a item of random data to queue
            dataQ.add(data_array[time_counter]);
            time_counter+=100;
            Thread.sleep(10);
            executor.execute(this);
        } catch (InterruptedException ex) {
            Logger.getLogger(AreaChartSample.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

//-- Timeline gets called in the JavaFX Main thread
private void prepareTimeline() {
    // Every frame to take any data from queue and add to chart
    new AnimationTimer() {
        @Override public void handle(long now) {
            addDataToSeries();
        }
    }.start();
}

private void addDataToSeries() {
    for (int i = 0; i < 20; i++) { //-- add 20 numbers to the plot+
        if (dataQ.isEmpty()) break;
        Number y=dataQ.remove();
        series.getData().add(new AreaChart.Data(xSeriesData++, y));
       // System.out.println(y);
    }
    // remove points to keep us at no more than MAX_DATA_POINTS
    if (series.getData().size() > MAX_DATA_POINTS) {
        series.getData().remove(0, series.getData().size() - MAX_DATA_POINTS);
    }
    // update 
      xAxis.setLowerBound(xSeriesData-MAX_DATA_POINTS);
      xAxis.setUpperBound(xSeriesData-1);
}

}

當我剛運行它=>

在此處輸入圖片說明

當我執行build .jar文件時(Windows 7 64位-> java8)

在此處輸入圖片說明

我完全不知道為什么會發生這種情況。

更新:這是test.txt: http : //expirebox.com/download/bf9be466e23c4c3d8f73f094f261dfbe.html

更新2

好的,它必須與文件的讀取有關。當我更改時

 data_array[i]=((int)(full_text.charAt(i)))-127;

  data_array[i]=data_array[i]=((int)('f'))-127;

在兩個“版本”中都相同。

還有另一種方法可以雙向正確讀取嗎?也許與UTF8有關?

這成功了。 謝謝!

String fileName = "C:/testvideo/test.txt";
FileInputStream is = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader in = new BufferedReader(isr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM