वर्णित लाइन चार्ट बनाने के लिए जावाफ़ैक्स 15 मिनट लेता है जो मेरे कार्य के लिए काम नहीं करता है।65000 डेटा पॉइंट्स के साथ JavaFX LineChart के साथ प्रदर्शन समस्या
अच्छे पुराने स्विंग और जेएफरी चार्ट का उपयोग करके समान कार्यान्वयन चार्ट बनाने के लिए 1.5 सेकंड लगते हैं।
लेकिन मैं अभी भी एक जावाएफएक्स को लागू करना चाहता हूं।
public class FXMLController implements Initializable {
@FXML
private Label statusbar;
@FXML
public LineChart lineChart;
@FXML
public Button connect;
@FXML
public MenuItem options;
@FXML
public NumberAxis xAxis;
@FXML
NumberAxis yAxis;
@FXML
private void connect(ActionEvent event) {
}
public static FileChooser fileChooser = new FileChooser();
public static String path;
public static XYChart.Series<Integer, Integer> dataSeries = new XYChart.Series<Integer, Integer>();
public static int y = 0;
public static XYChart.Data<Integer, Integer> data;
@FXML
private void open(ActionEvent event) {
fileChooser.setTitle("Open Resource File");
fileChooser.getExtensionFilters().addAll(
new ExtensionFilter("Text Files", "*.txt"),
new ExtensionFilter("Image Files", "*.png", "*.jpg", "*.gif"),
new ExtensionFilter("Audio Files", "*.wav", "*.mp3", "*.aac"),
new ExtensionFilter("All Files", "*.*"));
File selectedFile = fileChooser.showOpenDialog(new Stage());
if (selectedFile != null) {
path = selectedFile.getAbsolutePath();
System.out.println(path);
try {
ReadingFromFile.readFile(path);
} catch (IOException ex) {
Logger.getLogger(FXMLController.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@FXML
private void close(ActionEvent event) {
}
@FXML
private void getconnect(ActionEvent event) {
}
@Override
public void initialize(URL url, ResourceBundle rb) {
xAxis.setLabel("Tick");
xAxis.setTickUnit(100);
yAxis.setLabel("Signal");
xAxis.setForceZeroInRange(false);
lineChart.setLegendVisible(false);
lineChart.setCreateSymbols(false);
lineChart.setAnimated(false);
lineChart.getData().add(dataSeries);
}
}
और फ़ाइल से पढ़ने:
public class ReadingFromFile extends FXMLController {
public static String s = null;
public static String[] str;
public static int parseInt;
public static void readFile(String filename)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(filename));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
System.out.println(line);
try {
str = line.split(" ");
for (int i = 0; i < str.length; i = i + 2) {
s = str[i + 1] + str[i];
parseInt = Integer.parseInt(s, 16);
javafx.application.Platform.runLater(new Runnable() {
@Override
public void run() {
data = new XYChart.Data<Integer, Integer>(y, parseInt);
//data.setNode(new HoveredThresholdNode(0, second, ""));
dataSeries.getData().add(data);
y++;
}
});
}
} catch (java.lang.NullPointerException ex) {
System.out.println("тут ноль!!!");
}
}
} finally {
br.close();
}
}
}
पहला अनुकूलन श्रृंखला में सभी डेटा बिंदुओं को एक समय में जोड़ना होगा। तो 'सूची>' बनाएं, अपने लूप में उस सूची में सभी डेटा पॉइंट जोड़ें, और फिर जब आप पूरा कर लें, तो केवल एक 'Platform.runLater (...) ' 'dataSeries.getData() के साथ। addAll (...) 'और सूची में पास करें। आप अभी भी यह काम करने में सक्षम नहीं हो सकते हैं, हालांकि; जावाएफएक्स चार्ट एपीआई एक अत्यधिक दृश्य घटक है, सीएसएस के साथ प्रत्येक डेटा बिंदु से जुड़े नोड (ओं) पर लागू होता है। यह वास्तव में वास्तव में देखे जा सकने वाले डेटा से काफी अधिक डेटा के लिए डिज़ाइन नहीं किया गया है। –
@James_D ठीक है, यह थोड़ा सा मदद करता है। अब 1 मिनट और 25 सेकंड। लेकिन यह अभी भी बहुत लंबा है (( – sabracadabra
ठीक है, पहले अनुकूलन पर प्रदर्शन में 10 गुना वृद्धि एक बहुत अच्छी शुरुआत है। यदि आप अपना प्रश्न संपादित करने के लिए एक [पूर्ण उदाहरण] शामिल करने के लिए शायद यहां उपयोगी सहायता प्राप्त करने की अधिक संभावना है। (http://stackoverflow.com/help/mcve) (जिसे आपको शायद स्क्रैच से बनाने की आवश्यकता है)। आप कोड के केवल कुछ दर्जन लाइनों के साथ एक बड़े 'लाइन चार्ट' के साथ निष्पादन योग्य उदाहरण बनाने में सक्षम होना चाहिए, अधिकतर –