2015-04-02 151 views
1

我试图重写和简化图表的oracle教程,以便您拥有控制器类并使用fxml。 由于某种原因,它无法正常工作。JavaFX中的显示图表

这里是我的代码: 主类:

public class BarChartSample extends Application { 

    Stage primaryStage; 

    public void start(Stage primaryStage) { 
     this.primaryStage = primaryStage; 
     primaryStage.setTitle("Bar Chart Sample"); 

     showPage(); 
    } 

    public void showPage(){ 
     try { 
      FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(BarChartSample.class.getResource("ChartPage.fxml")); 
      AnchorPane pane = loader.load(); 

      Scene scene = new Scene(pane); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

控制器:

public class Controller { 
    final static String performance = "Performance:"; 

    @FXML 
    NumberAxis xAxis = new NumberAxis(); 
    @FXML 
    CategoryAxis yAxis = new CategoryAxis(); 

    @FXML 
    BarChart<Number,String> bc; 

    public void initialize(){ 
     xAxis.setLabel("Percent"); 
     xAxis.setTickLabelRotation(90); 
     yAxis.setLabel("Performance"); 

     bc = new BarChart<Number,String>(xAxis,yAxis); 

     XYChart.Series series1 = new XYChart.Series();  
     series1.getData().add(new XYChart.Data(80, performance)); 
     bc.getData().add(series1); 
    } 
} 

FXML:

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

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

<AnchorPane prefHeight="393.0" prefWidth="419.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controller"> 
    <children> 
     <BarChart fx:id="bc" layoutX="-40.0" layoutY="-3.0" prefHeight="205.0" prefWidth="409.0" AnchorPane.bottomAnchor="5.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0"> 
     <xAxis> 
      <CategoryAxis fx:id="yAxis" side="BOTTOM" /> 
     </xAxis> 
     <yAxis> 
      <NumberAxis side="LEFT" fx:id="xAxis" /> 
     </yAxis> 
     </BarChart> 
    <TextArea layoutX="103.0" layoutY="14.0" maxHeight="100.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.leftAnchor="21.0"AnchorPane.rightAnchor="21.0" AnchorPane.topAnchor="5.0" /> 
     </children> 
     </AnchorPane> 

将不能正常显示图表,它只是画几行。为什么?谢谢!

回答

2

initialize()

bc = new BarChart<Number,String>(xAxis,yAxis); 

你不应该重新初始化它已经在FXML定义,并已通过@FXML注释集成在控制器的任何控制删除此行。

您还需要与

@FXML 
NumberAxis xAxis; 
@FXML 
CategoryAxis yAxis; 

替换下列行的原因说

@FXML 
NumberAxis xAxis = new NumberAxis(); 
@FXML 
CategoryAxis yAxis = new CategoryAxis(); 

同样,你需要正确定义BARCHART。在FXML中,您宣称xAxisCategoryAxisyAxisNumberAxis。但是在控制器中你定义了一个BarChart<Number,String>

public class Controller { 
    final static String performance = "Performance:"; 

    @FXML 
    NumberAxis xAxis; 
    @FXML 
    CategoryAxis yAxis; 

    @FXML 
    BarChart<String, Number> bc; 

    public void initialize(){ 
     xAxis.setLabel("Percent"); 
     xAxis.setTickLabelRotation(90); 
     yAxis.setLabel("Performance"); 

     XYChart.Series<String, Number> series1 = new XYChart.Series(); 
     series1.getData().add(new XYChart.Data(performance, 80)); 
     bc.getData().add(series1); 
    } 
} 
+0

我得到一个铸件例外,但我不明白为什么...... java.lang.Integer中不能转换为java.lang.String – user3435407 2015-04-02 22:43:34

+0

是的,我明白了。这是因为在FXML中,你已经声明xAxis是一个'CategoryAxis'和'yAxis'是一个数字轴。但是在控制器中你已经定义了一个BarChart '。请检查更新后的答案。 – ItachiUchiha 2015-04-02 22:49:41

+0

pffff ..谢谢,我误解了这里的一些行为.... – user3435407 2015-04-02 23:29:07