부모창이 있다면 생성자 파라미터로 넘겨서 사용한다.
보통은 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 |