Day28(프로그램 종료 후에도 화면 그대로 유지,getComponent)
사용자가 프로그램을 종료했다가 다시 실행시켰을 때 이전에 저장한 할 일들과 체크 여부를 볼 수 있도록 하려면 데이터를 저장하고 불러오는 기능을 사용해야한다.데이터를 저장하는 방법으로 파일에 저장하는 방법이 있다.
데이터를 저장하는 saveData()메서드를 추가한다. 이 메서드는 프로그램을 종료할 때 호출된다. saveData() 메서드에서는 리스트에 있는 데이터를 파일에 저장한다. 이 때, ObjectOutputStream 클래스를 사용하여 객체를 파일에 저장한다.
데이터 파일은 'tasks.dat'처럼 .dat에 저장된다.
private void saveData() {
try {
FileOutputStream fileOutputStream = new FileOutputStream("tasks.dat");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(tasks);
objectOutputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
다음으로 데이터를 불러오는 loadData() 메서드를 추가한다. 이 메서드는 프로그램을 실행할 때 호출된다.loadData()메서드에서는 파일에서 데이터를 읽어와 리스트가 있으면 리스트에 저장된다.이 때, ObjectInputStream 클래스를 사용하여 파일에서 객체를 읽어온다.
private void loadData() {
try {
File file = new File("tasks.dat");
if (file.exists()) {
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
tasks = (ArrayList<Task>) objectInputStream.readObject();
objectInputStream.close();
fileInputStream.close();
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
프로그램이 종료될 때 saveData() 메서드를 호출하여 데이터를 저장하고, 프로그램이 실행될 때 loadData()메서드를 호출하여 데이터를 불러오도록 run() 메서드를 수정한다.
private void run() {
frame = new JFrame("Todo List");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(3, 1));
frame.setSize(600, 600);
JPanel titlePanel = new JPanel();
frame.add(titlePanel);
titleLabel = new JLabel("할 일 목록");
titlePanel.add(titleLabel);
initTypePanel();
initContent();
loadData(); // 데이터 불러오기
updateContentPanel(); // 할 일 목록 업데이트
frame.setVisible(true);
// 프로그램 종료 시 데이터 저장
Runtime.getRuntime().addShutdownHook(new Thread(this::saveData));
}
getComponent()는 java.awt.Container 클래스의 메서드로, 해당 컨테이너 안에 있는 컴포넌트들 중에서 특정 인덱스에 해당하는 컴포넌트를 반환하는 메서드이다.
예를 들어, JPanel이라는 컨테이너 안에 JLabel과 JTextField이라는 두 개의 컴포넌트가 있다면, getComponent(0) 메서드를 호출하면 JLabel 객체를 반환하고, getComponent(1) 메서드를 호출하면 JTextField 객체를 반환한다.
이 메서드를 사용하여 컨테이너 안에 있는 컴포넌트를 동적으로 제어하거나 검색할 수 있다. 주의할 점은, 이 메서드가 반환하는 컴포넌트는 Component 클래스 타입이므로, 이를 해당 컴포넌트의 실제 타입으로 캐스팅해야 한다. 예를 들어 JPanel 안에 있는 JLabel 객체를 가져오려면, 아래와 같이 코드를 작성할 수 있다.