TIL

Day28(프로그램 종료 후에도 화면 그대로 유지,getComponent)

jackpods 2023. 3. 1. 22:30

사용자가 프로그램을 종료했다가 다시 실행시켰을 때 이전에 저장한 할 일들과 체크 여부를 볼 수 있도록 하려면 데이터를 저장하고 불러오는 기능을 사용해야한다.데이터를 저장하는 방법으로 파일에 저장하는 방법이 있다.

데이터를 저장하는 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 객체를 가져오려면, 아래와 같이 코드를 작성할 수 있다.