Вы должны обязательно рассмотреть очень полезный ответ WizardOfOdds. Правильное использование «Меню приложения» поможет, и для начала легко установить минимальное значение Info.plist
. Постоянное меню File
позволит вашему приложению открывать новое окно, когда другие закрыты. Этот ответ связан с простым примером .
Хотя Apple Руководство по интерфейсу пользователя является отличным руководством к тому, чего ожидают ваши пользователи, вы, безусловно, можете поэкспериментировать с подходом, предложенным в вашем вопросе. В частности, вы можете попробовать setLocation(Short.MIN_VALUE, Short.MIN_VALUE)
в невидимом окне. Кроме того, вы можете захотеть ответить на WindowEvent
особым образом, если он сигнализирует о закрытии последнего видимого окна.
Приложение: Когда ваш слушатель увидит, как закрывается последнее видимое окно, создайте новое пустое окно приложения. Или переместите невидимое окно на экран и сделайте его видимым, пока пользователь не решит, как действовать.
Приложение: Mac OS X предупреждает о том, что видимая форма окна не может быть перемещена за пределы экрана, но легко поставить невидимое окно в подвешенном состоянии, как показано ниже.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
public class FrameTest extends JFrame {
private static FrameTest marco;
private static FrameTest polo;
private static class MyPanel extends JPanel {
public MyPanel() {
super(true);
final JToggleButton b = new JToggleButton("Test");
b.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (b.isSelected()) {
polo.setLocation(100, 100);
polo.setVisible(true);
}
else {
polo.setVisible(false);
polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
}
}
});
this.add(b);
}
}
public FrameTest(String title) {
super(title);
this.setLayout(new BorderLayout());
this.add(new MyPanel());
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
marco = new FrameTest("Marco");
marco.setLocationRelativeTo(null);
marco.setVisible(true);
polo = new FrameTest("Polo");
polo.setLocation(Short.MIN_VALUE, Short.MIN_VALUE);
}
});
}
}