Main 변경 없이 바로 Scene Builder로




Boder Center 위에 Pane(400, 400)을 하나 올려줍니다.


그 위에


PieChart : Code : fx:id - pieChart


Button : Code : OnAction - javaSel


Button : Code : OnAction - csSel


Button : Code : OnAction - pySel


Button : Code : OnAction - jsSel


Controller Class 설정



package app;

import java.net.URL;
import java.util.ResourceBundle;

import javax.swing.JScrollBar;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.chart.PieChart;
import javafx.scene.chart.PieChart.Data;

public class MainController implements Initializable{
	@FXML private PieChart pieChart;
	// 개별데이터 -> 리스트 -> 파이차트에 set
	int java = 10;
	int cs = 10;
	int py = 10;
	int js = 10;
	
	ObservableList<Data> list = null;
	
	@Override
	public void initialize(URL location, ResourceBundle resources) {
		System.out.println("FXML 완");
		list = FXCollections.observableArrayList();
		list.add(new PieChart.Data("Java",  java));
		list.add(new PieChart.Data("C#",  cs));
		list.add(new PieChart.Data("Python",  py));
		list.add(new PieChart.Data("Java Script",  js));
		pieChart.setTitle("선호 언어"); // 타이틀
		pieChart.setLabelsVisible(true); // 라벨 여부
		pieChart.setData(list); // 데이터 적용
	}
	
	public void javaSel() { // 버튼을 누를 때 파이 값 증가
		java++;
		list.set(0, new Data("Java", java));
	}
	
	public void csSel() {
		cs++;
		list.set(1, new Data("C#", cs));
	}
	
	public void pySel() {
		py++;
		list.set(2, new Data("Python", py));
	}
	
	public void jsSel() {
		js++;
		list.set(3, new Data("Java Script", js));
	}
	
}



이번에는 Main을 Parent로 바꾼다.


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


primaryStage.setTitle("Progress 예제");




Border를 지워주고 Pane을 추가

Pane(400, 400) 위에

Label : Code : fx:id - result

ProgressBar : Code : fx:id - bar

ProgressIndicator : Code : fx:id - pi

Button(+) : Code : OnAction - plus

Button(auto) : Code : OnAction - auto

Button(-) : Code : OnAction - minus

Controller Class 설정을 마치고 코딩

다음 코드는 버튼을 누를 경우 +, - 가 되고 그 값을 Label에 띄우고 Progress bar, Indicator에도 띄운다.

또한 auto에 Thread를 적용하여 자동으로 증가하게끔 코딩





package app;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.ProgressIndicator;

public class MainController implements Initializable{

	@FXML private Label result;
	@FXML private ProgressBar bar;
	@FXML private ProgressIndicator pi;
	private int percent = 0;
	
	@Override
	public void initialize(URL location, ResourceBundle resources) {
		System.out.println("FXML 완");
	}
	
	public void plus() {
		if(percent<100) {
			percent++;
		}else {
			percent = 0;
		}
		print(percent);
	}
	
	public void minus() {
		if(percent > 0) {
			percent--;
		}else {
			percent = 100;
		}
		print(percent);
	}
	
	public void print(int num) {
		result.setText(num + "%");
		bar.setProgress(num*0.01); // 1을 100%로 잡으므로 0.01을 곱한다.
		pi.setProgress(num*0.01);
	}
	
	public void auto() {
		// 스레드로 pi의 % 채우기
		Thread th = new Thread() {
			@Override
			public void run() {
				// 방법 1 (충돌 발생)
//				while(true) { // 스레드를 임의로 만들면 작동은 되지만 예외를 발생
//								// FX등록 스레드만 쓰라는것
//					try { // 코드 안의 값들은 상관없는데 UI도 하나의 스레드로 서로 간섭이 일어나 충돌
//						plus(); // 코드 안의 값들은 상관없는데 UI도 하나의 스레드로 서로 간섭이 일어나 충돌
//						Thread.sleep(100);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//				}
				
				// 방법 2, 1의 해결법
				while(true) {
					Platform.runLater(()->{ // 자바 8버젼부터 사용가능, UI 충돌이 예상되는 지점에 사용
						plus();
					});
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		th.start();
		
	}
}


'JavaFX > 01.Node 추가' 카테고리의 다른 글

[JAVA FX]01-12.Line Chart, Random  (0) 2018.09.11
[JAVA FX]01-11.PieChart  (0) 2018.09.11
[JAVA FX]01-09.속성 감시, 속성 바인딩  (0) 2018.09.10
[JAVA FX]01-08.Menu 바 추가  (0) 2018.09.10
[JAVA FX]01-07.TreeView  (0) 2018.09.10

Stream이란 사전적 의미로는 '줄줄 흐르다', 즉 흘러가는 흐름을 말하는데


Input Output도 마찬가지다.


데이터를 불러오는데 읽어들어오는 흐름과 내보내는 흐름이라고 이해하면 쉽다.




C:\temp\data.dat


위의 파일을 inputStream으로 불러온다고 하면


C:\temp\data.dat 이 경로에서 나의 작업 공간으로 데이터가 흘러온다.


현실에 비유한다면


산(C:\temp\data.dat)에서 강물이 도시(작업 공간)로 흘러 들어온다.


Output도 역으로 생각하면 된다.





이 흐름은 Byte, 바이트 형식으로 흘러오거나 Character, 문자 형식으로 흘러온다.


Byte형식은 InputStream, OutputStream이고


Character형식은 Reader와 Writer로 사용한다.





InputStream은 Byte 형식의 흐름의 최상위 객체로 FileInputStream, BufferedInputStream, DataInputStream 등


각각 용도에 특화된 InputStream의 자식 객체가 있다.


다음 게시글을 통해 다양한 스트림의 활용을 확인해보자




+ Recent posts