Prośba o sprawdzenie kodu JavaFX FXML

0

Cześć,

Jestem początkujący w języku Java. Staram się korzystać z JavaFX, bardzo podoba mi się idea oddzielenia kodu od wyglądu (pliki FXML). Jednak jest mało przykładów z wykorzystaniem tego podejścia. Proszę o pomoc i wyjaśnienie czemu wykres f(x) po naciśnieciu przycisku się nie wypełnia...

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.chart.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="412.0" prefWidth="779.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="javafxapplication5.FXMLDocumentController">
    <children>
        <Button fx:id="button" layoutX="216.0" layoutY="361.0" onAction="#handleButtonAction" prefHeight="25.0" prefWidth="69.0" text="Rysuj" />
      <LineChart fx:id="chart1" layoutX="299.0" layoutY="18.0" prefHeight="194.0" prefWidth="466.0" title="f(x)">
        <xAxis>
          <CategoryAxis side="BOTTOM" fx:id="x" />
        </xAxis>
        <yAxis>
          <NumberAxis fx:id="y" side="LEFT" />
        </yAxis>
      </LineChart>
      <LineChart fx:id="chart2" layoutX="299.0" layoutY="212.0" prefHeight="194.0" prefWidth="466.0" title="pochodna f(x)">
         <xAxis>
            <CategoryAxis side="BOTTOM" />
         </xAxis>
         <yAxis>
            <NumberAxis side="LEFT" />
         </yAxis>
      </LineChart>
      <Separator layoutX="299.0" layoutY="29.0" orientation="VERTICAL" prefHeight="357.0" prefWidth="5.0" />
      <Label layoutX="25.0" layoutY="29.0" prefHeight="17.0" prefWidth="253.0" text="f(x) = A4x4 + A3x3 + A2x2 + A1x1 + A0" />
      <Label layoutX="25.0" layoutY="71.0" text="A4" />
      <TextField fx:id="a4" layoutX="52.0" layoutY="67.0" prefHeight="25.0" prefWidth="48.0" />
      <TextField fx:id="a3" layoutX="52.0" layoutY="99.0" prefHeight="25.0" prefWidth="48.0" />
      <Label layoutX="25.0" layoutY="103.0" text="A3" />
      <TextField fx:id="a2" layoutX="52.0" layoutY="132.0" prefHeight="25.0" prefWidth="48.0" />
      <Label layoutX="25.0" layoutY="136.0" text="A2" />
      <TextField fx:id="a1" layoutX="52.0" layoutY="165.0" prefHeight="25.0" prefWidth="48.0" />
      <Label layoutX="25.0" layoutY="169.0" text="A1" />
      <TextField fx:id="delta" layoutX="173.0" layoutY="67.0" prefHeight="25.0" prefWidth="98.0" />
      <Label layoutX="121.0" layoutY="71.0" text="delta X" />
      <Label text="Label" />
      <Label layoutX="121.0" layoutY="103.0" text="Zakres" />
      <TextField fx:id="zakres" layoutX="173.0" layoutY="99.0" prefHeight="25.0" prefWidth="98.0" />
      <Label layoutX="25.0" layoutY="199.0" text="A0" />
      <TextField fx:id="a0" layoutX="52.0" layoutY="195.0" prefHeight="25.0" prefWidth="48.0" />
    </children>
</AnchorPane>

Controler

 
package javafxapplication5;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class FXMLDocumentController implements Initializable {
    
    @FXML
    private Label label;
    public TextField a4;
    public TextField a3;
    public TextField a2;
    public TextField a1;
    public TextField a0;
    public LineChart chart1;
    public LineChart chart2;
    public TextField zakres;


    @FXML
    private void handleButtonAction(ActionEvent event) {
        int b1,b2,b3,b4,b0;
        int zak, delta = 1;
        int y, x=0;
                  
        b1 = Integer.parseInt(a1.getText());
        b2 = Integer.parseInt(a2.getText());
        b3 = Integer.parseInt(a3.getText());
        b4 = Integer.parseInt(a4.getText());
        b0 = Integer.parseInt(a0.getText());
        zak = Integer.parseInt(zakres.getText());
        
        XYChart.Series series1 = new XYChart.Series();
        series1.setName("f(x)");
        
        while(x<zak)
        {
            y=b4*(x^4) + b3*(x^3) + b2*(x^2) + b1*x + b0; 
            series1.getData().add(new XYChart.Data(x, y));
            x++;
        }
        
        chart1.getData().addAll(series1);                   
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
      //  chart1.autosize();
      //  chart2.autosize();
        
      
    }    
    
}

main

ackage javafxapplication5;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 *
 * @author Agata
 */
public class JavaFXApplication5 extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        
        Scene scene = new Scene(root);
        
        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}
 

ecc18f8933.png

Dzięki za pomoc!!

0

A czy nie powinieneś mieć coś takiego w kodzie?

@FXML
private Label label;

@FXML
private TextField a4;

@FXML
private TextField a3;

@FXML
private TextField a2;

@FXML
private TextField a1;

@FXML
private TextField a0;

@FXML
private LineChart chart1;

@FXML
private LineChart chart2;

@FXML
private TextField zakres;

Bez adnotacji może nie zadziałać.

0

hej, to nie to - adnotację trzeba dodać jak wybieramy inną formę niż "public".
Takie błędy wyrzuca debugger:

Executing C:\Users\Agata\Documents\NetBeansProjects\JavaFXApplication5\dist\run854235995\JavaFXApplication5.jar using platform C:\Program Files\Java\jdk1.8.0_20\jre/bin/java
Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at javafx.scene.chart.CategoryAxis.calculateRequiredSize(CategoryAxis.java:373)
at javafx.scene.chart.CategoryAxis.autoRange(CategoryAxis.java:358)
at javafx.scene.chart.Axis.computePrefHeight(Axis.java:569)
at javafx.scene.Parent.prefHeight(Parent.java:922)
at javafx.scene.layout.Region.prefHeight(Region.java:1432)
at javafx.scene.chart.XYChart.layoutChartChildren(XYChart.java:684)
at javafx.scene.chart.Chart$1.layoutChildren(Chart.java:88)
at javafx.scene.Parent.layout(Parent.java:1074)
at javafx.scene.Parent.layout(Parent.java:1080)
at javafx.scene.Parent.layout(Parent.java:1080)
at javafx.scene.Scene.doLayoutPass(Scene.java:532)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2363)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$28(Toolkit.java:314)
at com.sun.javafx.tk.Toolkit$$Lambda$134/28487041.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:313)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:340)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:451)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:431)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$363(QuantumToolkit.java:298)
at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$41/9050628.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/29531133.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)

0

już wiem, może komuś się przyda rozwiązanie, na stronie Oracle wprowadzają w błąd. argument x przy deklarowaniu musi być string a więc:\

y=b4*(x4) + b3*(x3) + b2*(x^2) + b1*x + b0;
series1.getData().add(new XYChart.Data(Integer.toString(x), y));
x++;

1 użytkowników online, w tym zalogowanych: 0, gości: 1