Я хочу отобразиться два (или больше) JFrames одновременно.
Когда я закрываюсь, один из них (используйте близкую кнопку по умолчанию), другие кадры должны все еще быть видимы.
Как я могу сделать это?
Если Вы хотите, чтобы Ваше приложение прекратило свое действие после закрытия JFrame
, используйте
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)
вместо
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
из документации:
DO_NOTHING_ON_CLOSE
(определено в WindowConstants): Ничего не делайте; требуйте, чтобы программа обрабатывала операцию в методе windowClosing зарегистрированного объекта WindowListener.HIDE_ON_CLOSE
(определено в WindowConstants):HIDE_ON_CLOSE
(определено в WindowConstants): Автоматически скрывать рамку после вызова любого зарегистрированного объекта WindowListener.DISPOSE_ON_CLOSE
(определено в WindowConstants): Автоматически скрывать и располагать рамку после вызова любых зарегистрированных объектов WindowListener.EXIT_ON_CLOSE
(определён в JFrame): Выход из приложения с помощью метода выхода из системы. Используйте его только в приложениях. Это был мой ответ до того, как вопрос был разъяснен, может быть все же полезным:
Вы можете использовать setVisible(false)
на вашем JFrame
, если вы хотите отобразить тот же самый кадр еще раз.
В противном случае вызовите dispose()
на remove all of native screen resources.
Помогает ли это ?
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TwoJFrames {
public static void main(String[] args) {
int nb = 4;
if (args != null && args.length > 0) {
nb = Integer.parseInt(args[0]);
}
final int frameCount = nb;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
for (int i = 0; i < frameCount; i++) {
JFrame frame = new JFrame("Frame number " + i);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel p = new JPanel(new BorderLayout());
p.add(new JLabel("Click on the corner to close..."), BorderLayout.CENTER);
frame.setContentPane(p);
frame.setSize(200, 200);
frame.setLocation(100 + 20 * i, 100 + 20 * i);
frame.setVisible(true);
}
}
});
}
}