Java/Swing

Swing JDialog

hamaganatanadda 2026. 3. 8. 23:22

 

부모창이 있다면 생성자 파라미터로 넘겨서 사용한다. 

보통은 JFrame을 사용하면 충분하고 JDialog와 JFrame 두 화면에서 호출해야 한다면 생성자를 분리하는 게 편하다.

추가로 전달할 값이 있다면 생성자 파라미터로 넘기는 것이 낫다. 자식창이 부모의 데이터를 호출하는 방식은 지양해야 한다.

 public SelectDialog(JFrame owner) {
    super(owner, "선택 팝업", true); //부모 타이틀 modal
    setLocationRelativeTo(owner); //부모 가운데

 

선택 버튼을 클릭했는지 구분자를 두고 JDialog로 종료되면 결과를 가져올 수 있다.

dipose가 호출되었지만 JDialog에 접근할 수 있는 상태고 참조가 없어지면 GC 대상으로 처리된다.

이렇게 처리하면 JDialog, JFrame 두 화면에서 호출할 때 호출하는 쪽에서 다양하게 처리가 가능하다.

//jframe
btnPop.addActionListener(e -> {
    SelectDialog dialog = new SelectDialog(DialogTest.this);
    dialog.setVisible(true);

    if (dialog.isConfirmed()) {
        txtField.setText(dialog.getText());
    }
});

//dialog
btnSelect.addActionListener(e -> {
    isConfirmed = true;
    dispose();
});
        
public String getText() {
    return txtField.getText();
}

public boolean isConfirmed() {
    return isConfirmed;
}

 

dispose는 창을 닫고 리소스를 해제한다. 재사용하지 않는다면 필요할 때마다 새로 생성하는 게 편하다. 

setDefaultCloseOperation(DISPOSE_ON_CLOSE);
dipose();

 


전체 소스

import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

class SelectDialog extends JDialog {
    private JTextField txtField; 
    private boolean isConfirmed;
    public SelectDialog(JFrame owner) {
        super(owner, "선택 팝업", true);

        txtField = new JTextField(10);
        JButton btnSelect = new JButton("Select");
        setLayout(new FlowLayout(FlowLayout.LEFT));
        add(txtField);
        add(btnSelect);

        btnSelect.addActionListener(e -> {
            isConfirmed = true;
            dispose();
        });
        
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(owner);
    }
    
    public String getText() {
        return txtField.getText();
    }
    
    public boolean isConfirmed() {
        return isConfirmed;
    }
}

public class DialogTest extends JFrame {    
    public DialogTest() {
        super("Dialog Main");
        
        setLayout(new FlowLayout(FlowLayout.LEFT));
        JButton btnPop = new JButton("Dialog");
        JTextField txtField = new JTextField(10);
        add(btnPop);
        add(txtField);
        
        btnPop.addActionListener(e -> {
            SelectDialog dialog = new SelectDialog(DialogTest.this);
            dialog.setVisible(true);
            
            if (dialog.isConfirmed()) {
                txtField.setText(dialog.getText());
            }
        });
        
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        pack();
        setLocationRelativeTo(null);
    }    
}

'Java > Swing' 카테고리의 다른 글

Swing Overlay  (0) 2026.03.08
Swing 디자인 layout  (0) 2026.03.08
Swing 사용하기 좋은 기능  (0) 2026.03.08
Swing 먼저 알아두면 좋은 내용  (0) 2026.03.08
Swing 시작하기  (0) 2026.03.08