고급 JAVA/FX

JavaFX - 차트 컨트롤

행복하게사는게꿈 2020. 5. 23. 11:58

차트 컨트롤

 

차트 컨트롤들은 javafx.scene.chart 패키지에 포함되어 있고, 

 

다양항 차트를 생성하는 컨트롤을 제공함. 

 

종류 : PieChart, LineChart, AreaChart, BarChart, BubbleChart, ScatterChart

 

PieChart : <PieChart/> 끝! X축과 Y축이 없으므로 정의할 필요 X 

 

LineChart,AreaChart,BarChart 는 X축과 Y축의 정의가 필요!

 

ex) BarChart

 

X축이 위 아래 있고, Y축이 좌우에 있다 => 눈금을 나타낼 위치를 지정해야함.

<BarChart>

   <xAxis>

      <CategoryAxis side="BOTTOM"/> // 분류 눈금을 아래 축에 나타냄.

   </xAxis>

   <yAxis>

      <NumberAxis side="LEFT" /> // 숫자 눈금을 왼쪽 축에 나타냄.

   </yAxis>

</BarChart>

컨트롤러는 DB나 네트워크에서 차트의 데이터를 전달받아 차트컨트롤에 추가함.

ex)

pieChart.setData(FXCollections.observableArrayList(

    new PieChart.Data("봄", 20),

    new PieChart.Data("여름", 32),

    new PieChart.Data("가을", 24),

    new PieChart.Data("겨울", -7)

));

 

X축과 Y축이 필요한 차트에서 데이터 추가 방법. (LineChart,AreaChart,BarChart모두 동일)

XYChart.Series s1 = new XYChart.Series();

s1.setName("시리즈이름");

s1.setData(FXCollections.observableArrayList(

    new XYChart.Data("네이버", 1),

    new XYChart.Data("블로그", 2),

    new XYChart.Data("부르곰", 3)

));

barChart.getData().add(s1); // 차트에 시리즈 추가

XYChart.Series : 하나의 그래프를 의미.

 

XYChart.Series를 그래프 갯수에 맞게 생성하면 여러 개의 그래프가 겹쳐보인다.

 

예제

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



<?import javafx.scene.chart.*?>

<?import java.lang.*?>

<?import javafx.geometry.*?>

<?import javafx.scene.layout.*?>

<?import javafx.scene.control.*?>



<HBox xmlns:fx="http://javafx.com/fxml" fx:controller="thisisjava.RootController"

prefHeight="250" prefWidth="850" >

   <children>

      <PieChart fx:id="pieChart" />

      <BarChart fx:id="barChart">

        <xAxis>

          <CategoryAxis side="BOTTOM" />

        </xAxis>

        <yAxis>

          <NumberAxis side="LEFT" />

        </yAxis>

      </BarChart>

      <AreaChart fx:id="areaChart">

        <xAxis>

          <CategoryAxis side="TOP" />

        </xAxis>

        <yAxis>

          <NumberAxis side="RIGHT" />

        </yAxis>

      </AreaChart>

   </children>

</HBox>




자바1)

package thisisjava;



import java.net.URL;

import java.util.ResourceBundle;



import javafx.collections.FXCollections;

import javafx.fxml.FXML;

import javafx.fxml.Initializable;

import javafx.scene.chart.AreaChart;

import javafx.scene.chart.BarChart;

import javafx.scene.chart.PieChart;

import javafx.scene.chart.XYChart;



public class RootController implements Initializable {

@FXML private PieChart pieChart;

@FXML private BarChart barChart;

@FXML private AreaChart areaChart;


@Override

public void initialize(URL location, ResourceBundle resources) {

pieChart.setData(FXCollections.observableArrayList(

new PieChart.Data("10대", 12),

new PieChart.Data("20대", 18),

new PieChart.Data("30대", 20),

new PieChart.Data("40대이상", 50)

));


XYChart.Series series1 = new XYChart.Series();

series1.setName("남자");       

series1.setData(FXCollections.observableArrayList(

new XYChart.Data("2015", 70),

new XYChart.Data("2016", 40),

new XYChart.Data("2017", 50),

new XYChart.Data("2018", 30)

));  

XYChart.Series series2 = new XYChart.Series();

series2.setName("여자");       

series2.setData(FXCollections.observableArrayList(

new XYChart.Data("2015", 30),

new XYChart.Data("2016", 60),

new XYChart.Data("2017", 50),

new XYChart.Data("2018", 60)

));

barChart.getData().add(series1);

barChart.getData().add(series2);


XYChart.Series series3 = new XYChart.Series();

series3.setName("평균온도");       

series3.setData(FXCollections.observableArrayList(

new XYChart.Data("봄", 20),

new XYChart.Data("여름", 32),

new XYChart.Data("가을", 24),

new XYChart.Data("겨울", -7)

));

areaChart.getData().add(series3);

}

}

















자바2)

package thisisjava;



import javafx.application.Application;

import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.stage.Stage;



public class AppMain extends Application {

@Override

public void start(Stage primaryStage) throws Exception {

Parent root = (Parent)FXMLLoader.load(getClass().getResource("root.fxml"));

Scene scene = new Scene(root);


primaryStage.setTitle("ChartControl");

primaryStage.setScene(scene);

primaryStage.show();

}


public static void main(String[] args) {

launch(args);

}

}