Не удалось найти какие-либо опции на JOptionPane
, поэтому я начал изучать, как легко было бы переопределить его, используя другой JFrame
. Я решил отключить основной кадр и включить его позже (кажется, что это то, что JOptionPane
делает внутренне так или иначе), и, прежде чем я переписана JOptionPane
я заметил, что это решает проблему:
public static void main(String[] args) {
final JFrame frame = new JFrame();
JButton button = new JButton("hello");
button.addActionListener(e -> {
frame.setEnabled(false); // disable main frame
JOptionPane.showMessageDialog(frame, "hello");
frame.setEnabled(true); // enable main frame
});
frame.setContentPane(button);
frame.setVisible(true);
frame.setSize(600, 480);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
Однако я не уверен, если это будет работать на всех платформах. Помогает ли вам это?
Если нет, я бы рекомендовал заменить JOptionPane.showMessageDialog(frame, "hello");
на ваш собственный JFrame
, чтобы вы могли полностью контролировать его. Вам нужно будет добавить WindowListener
, чтобы включить основной кадр, когда он закрыт. Однако вы потеряете функциональность блокировки - это может быть сложнее реализовать, чем того стоит.
Обычно вы указываете JFrame в качестве родительского окна JOptionPane. Попробуйте использовать «null» для родителя, то, надеюсь, JOptionPane будет работать независимо от JFrame. – camickr
@camickr Я использую «нуль», и к сожалению, это не помогает. – Csh