package com.jwlee.quiz_budongsan;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class DatabaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "STUDENT.db"; // 데이터베이스 명
public static final String TABLE_NAME = "student_table"; // 테이블 명


// 테이블 항목
public static final String COL_1 = "ID";
public static final String COL_2 = "Name";
public static final String COL_3 = "Correct_Rate";



public DatabaseHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, 3);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, CORRECT_RATE TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+ TABLE_NAME);
onCreate(db);

}

// 데이터베이스 추가하기 insert

public boolean insertData(String name, String correct_Rate){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,name);
contentValues.put(COL_3,correct_Rate);

long result = db.insert(TABLE_NAME, null,contentValues);
if(result == -1)
return false;
else
return true;

}

//데이터베이스 항목 모두 읽어오기 Read
public Cursor getAllData(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
return res;
}

//데이터베이스 선택한항목만 읽어오기 Read
public Cursor getSelectData(String select_name){
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select * from "+TABLE_NAME + " where name = " + "\""+ select_name+ "\"",null);//select * from student_table where name = "민법"
return res;
}

// 데이터베이스 삭제하기
public Integer deleteData(String id){
SQLiteDatabase db = this.getWritableDatabase();
return db.delete(TABLE_NAME, "ID = ? ",new String[]{id});
}

//데이터베이스 수정하기
public boolean updateData(String id, String name, String correct_Rate){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_1,id);
contentValues.put(COL_2,name);
contentValues.put(COL_3,correct_Rate);

db.update(TABLE_NAME,contentValues,"ID = ?", new String[] { id });
return true;
}
}

1. 먼저 XChart 라이브러리를 다운받아서 설치해야 합니다. (다음 글에 내용이 있으니 참고바랍니다.)

2020/03/02 - [자바] - 자바 XChart 를 이용해 자바 차트 그래프 만들기


2. 간단한 Java 실시간 Java 차트 예제

실시간 차트 작성은 XYChart 인스턴스를 통해 하나 이상의 시리즈 오브젝트에 대해 updateXYSeries를 호출하고 차트를 포함하는 JPanel의 다시 그리기를 트리거하는 것만 큼 간단합니다. 예제는 여기에 표시된 repaintChart () 메소드와 함께 SwingWrapper와 revalidate () 및 repaint ()가있는 XChartPanel을 사용하는 방법을 보여줍니다. XChartPanel을 통합하는 자체 Java Swing 애플리케이션이 이미있는 경우에 사용하려고합니다.



import org.knowm.xchart.QuickChart;

import org.knowm.xchart.SwingWrapper;

import org.knowm.xchart.XYChart;

 

/**

* Creates a simple real-time chart

*/

public class SimpleRealTime {

 

  public static void main(String[] args) throws Exception {

 

    double phase = 0;

    double[][] initdata = getSineData(phase);

 

    // Create Chart

    final XYChart chart = QuickChart.getChart("Simple XChart Real-time Demo", "Radians", "Sine", "sine", initdata[0], initdata[1]);

 

    // Show it

    final SwingWrapper<XYChart> sw = new SwingWrapper<XYChart>(chart);

    sw.displayChart();

 

    while (true) {

 

      phase += 2 * Math.PI * 2 / 20.0;

 

      Thread.sleep(100);

 

      final double[][] data = getSineData(phase);

 

      chart.updateXYSeries("sine", data[0], data[1], null);

      sw.repaintChart();

    }

 

  }

 

  private static double[][] getSineData(double phase) {

 

    double[] xData = new double[100];

    double[] yData = new double[100];

    for (int i = 0; i < xData.length; i++) {

      double radians = phase + (2 * Math.PI / xData.length * i);

      xData[i] = radians;

      yData[i] = Math.sin(radians);

    }

    return new double[][] { xData, yData };

  }

}


2. Swing Worker Java 실시간 Java 차트 예제

위의 예에서 차트 데이터 생성은 EventDispatchThread에서 실행되며 반응 형 GUI에는 적합하지 않습니다. 또한 EventDispatchThread는 실시간 차트를 업데이트 할 때마다 100ms 동안 휴면 상태가됩니다. Java Swing 애플리케이션을 빌드하는 올바른 방법과는 거리가 멀지 만 XChart 컴포넌트의 작동 방식을 보여주기위한 목적으로 사용됩니다.

이 예에서는 EventDispatchThread 대신 추가 스레드를 사용하여 데이터 생성을 수행 할 수 있습니다. 이 모범 사례 기술을 사용하면 차트를 백그라운드에서 다시 그리는 시간을 제외하고 차트가 백그라운드에서 진행되는 동안 GUI가 사용자 상호 작용에 응답 할 수 있습니다. SwingWorker 스레드는 EventDispatchThread에서 실행되는 GUI를 업데이트 할 때 복잡한 세부 정보를 처리하는 특수 스레드입니다.

이 예제는 실시간 차트 응용 프로그램을 만드는 일반적인 시나리오를 시뮬레이션합니다. 센서에서 데이터를 읽는 일부 백그라운드 스레드가 있으며 새 데이터를 사용할 수있게되면 라이브 차트를 업데이트하려고합니다. 그러나 때때로 데이터가 얼마나 자주 업데이트되는지 알 수 없습니다. 한 가지 문제는 데이터를 차트를 다시 그리려는 것보다 빠르게 진행되고 있다는 것입니다. 예를 들어 데이터 속도가 화면 새로 고침 빈도보다 빠른 경우 (예 : 초당 24 포인트) 새 단일 데이터 포인트마다 차트를 업데이트하는 것은 의미가 없습니다. 따라서이 예제에서는 동적으로 계산 된 데이터 포인트 당 5ms의 데이터 속도와 초당 24 프레임의 차트 업데이트 속도를 시뮬레이션합니다. 차트 애니메이션이 매끄럽게 보이고 아무런 이유없이 차트를 업데이트하는 데 추가 CPU주기가 낭비되지 않습니다.


import java.util.LinkedList;

import java.util.List;


import javax.swing.SwingWorker;


import org.knowm.xchart.QuickChart;

import org.knowm.xchart.SwingWrapper;

import org.knowm.xchart.XYChart;


/**

 * Creates a real-time chart using SwingWorker

 */

public class SwingWorkerRealTime {


  MySwingWorker mySwingWorker;

  SwingWrapper<XYChart> sw;

  XYChart chart;


  public static void main(String[] args) throws Exception {


    SwingWorkerRealTime swingWorkerRealTime = new SwingWorkerRealTime();

    swingWorkerRealTime.go();

  }


  private void go() {


    // Create Chart

    chart = QuickChart.getChart("SwingWorker XChart Real-time Demo", "Time", "Value", "randomWalk", new double[] { 0 }, new double[] { 0 });

    chart.getStyler().setLegendVisible(false);

    chart.getStyler().setXAxisTicksVisible(false);


    // Show it

    sw = new SwingWrapper<XYChart>(chart);

    sw.displayChart();


    mySwingWorker = new MySwingWorker();

    mySwingWorker.execute();

  }


  private class MySwingWorker extends SwingWorker<Boolean, double[]> {


    LinkedList<Double> fifo = new LinkedList<Double>();


    public MySwingWorker() {


      fifo.add(0.0);

    }


    @Override

    protected Boolean doInBackground() throws Exception {


      while (!isCancelled()) {


        fifo.add(fifo.get(fifo.size() - 1) + Math.random() - .5);

        if (fifo.size() > 500) {

          fifo.removeFirst();

        }


        double[] array = new double[fifo.size()];

        for (int i = 0; i < fifo.size(); i++) {

          array[i] = fifo.get(i);

        }

        publish(array);


        try {

          Thread.sleep(5);

        } catch (InterruptedException e) {

          // eat it. caught when interrupt is called

          System.out.println("MySwingWorker shut down.");

        }


      }


      return true;

    }


    @Override

    protected void process(List<double[]> chunks) {


      System.out.println("number of chunks: " + chunks.size());


      double[] mostRecentDataSet = chunks.get(chunks.size() - 1);


      chart.updateXYSeries("randomWalk", null, mostRecentDataSet, null);

      sw.repaintChart();


      long start = System.currentTimeMillis();

      long duration = System.currentTimeMillis() - start;

      try {

        Thread.sleep(40 - duration); // 40 ms ==> 25fps

        // Thread.sleep(400 - duration); // 40 ms ==> 2.5fps

      } catch (InterruptedException e) {

      }


    }

  }

}




JAVA using XChat, Chart graph  만들기

 

1. 라이브러리부터 다운로드  https://knowm.org/open-source/xchart/

 

다운로드 받은 파일 압출을 푼다.

 

 

압출을 풀면 그 중에서 xchart-3.6.1.jar 파일을 라이브러리에 등록합니다. 

1. xchart-3.6.1.jar파일을 프로젝트에 복사한다. 

나는 buildpath폴더를 만들어 놓고 사용할 라아브러리를 그 폴더에 복사했습니다. 

 

2. 그리고 라이브러리 추가작업을 한다. 

Eclipse에서 프로젝트를 마우스 우클릭-Properties를 클릭하세요.

 

아래 그림처럼 창이 나타나면 Java Build Path - Add JARs...을 클릭하여, xchart-3.6.1.jar 파일을 추가하면 됩니다.




1. 첫번째 그래프 만들기

 

import java.util.function.IntPredicate;

import org.knowm.xchart.QuickChart;
import org.knowm.xchart.SwingWrapper;
import org.knowm.xchart.XYChart;

import model.Seat;

public class testGraph {

public static void main(String[] args) {
 double[] xData = new double[] { 0.0, 1.0, 2.0 };
    double[] yData = new double[] { 2.0, 1.0, 0.0 };
 
    // Create Chart
    XYChart chart = QuickChart.getChart("Sample Chart", "X", "Y", "y(x)", xData, yData);
 
    // Show it
    new SwingWrapper(chart).displayChart();
}
  
}

 

 

 

2번째 그래프 만들기 

import java.util.ArrayList;
import java.util.List;

import org.knowm.xchart.SwingWrapper;
import org.knowm.xchart.XYChart;
import org.knowm.xchart.XYChartBuilder;
import org.knowm.xchart.XYSeries;
import org.knowm.xchart.style.markers.SeriesMarkers;


public class testGraph {

public static void main(String[] args)  {
  int numCharts = 4;
  
    List charts = new ArrayList();
 
    for (int i = 0; i < numCharts; i++) {
      XYChart chart = new XYChartBuilder().xAxisTitle("X").yAxisTitle("Y").width(600).height(400).build();
      chart.getStyler().setYAxisMin(-10.0);
      chart.getStyler().setYAxisMax(10.0);
      XYSeries series = chart.addSeries("" + i, null, getRandomWalk(200));
      series.setMarker(SeriesMarkers.NONE);
      charts.add(chart);
    }
    new SwingWrapper(charts).displayChartMatrix();
  }
 
  /**
   * Generates a set of random walk data
   *
   * @param numPoints
   * @return
   */
  private static double[] getRandomWalk(int numPoints) {
 
    double[] y = new double[numPoints];
    y[0] = 0;
    for (int i = 1; i < y.length; i++) {
      y[i] = y[i - 1] + Math.random() - .5;
    }
    return y;
}
  
}

+ Recent posts