Java: JOptionPane влияет на родительский JFrame? (включает SSCCE) - PullRequest
4 голосов
/ 21 октября 2011

Учитывая следующий апплет:

import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Example extends JApplet
{
   JPanel aPanel;

   @Override
   public void init()
   {
      try
      {
         javax.swing.SwingUtilities.invokeAndWait(new Runnable()
         {
            public void run()
            {
               makeGui();
            }
         });
      }
      catch (InterruptedException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      catch (InvocationTargetException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }      
   }

   public void makeGui()
   {
      aPanel = new JPanel(new BorderLayout());

      this.getContentPane().add(aPanel, BorderLayout.CENTER);

      JFrame aTestFrame =new JFrame();
      aTestFrame.setBounds(new Rectangle(200,200));
      JPanel aTestPanel = new JPanel(new BorderLayout());
      aTestPanel.setBounds(new Rectangle(200,200));

      aTestFrame.add(aTestPanel);
      aTestFrame.setVisible(true);
      JOptionPane.showMessageDialog(aTestFrame, "arfarf");


   }

}

Почему вызов JOptionPane закрывает aTestFrame? Если я пропускаю вызов, 2 кадра отображаются правильно, но когда я нажимаю OK на панели JOptionPane, родительский JFrame закрывается.

Первый ответ правильный, видимо, есть проблема с фокусом .. СПАСИБО!

1 Ответ

2 голосов
/ 21 октября 2011

Я думаю, что вам лучше не использовать JFrame с JApplet, а вместо этого использовать JDialog, связанный с предком Window JApplet:

   public void makeGui() {
      aPanel = new JPanel(new BorderLayout());

      this.getContentPane().add(aPanel, BorderLayout.CENTER);

      Window win = SwingUtilities.getWindowAncestor(Example.this);

      JDialog dialog = new JDialog(win, "My Dialog", ModalityType.MODELESS);

      JPanel dialogPanel = new JPanel();
      dialogPanel.setPreferredSize(new Dimension(200, 200));
      dialog.add(dialogPanel);
      dialog.pack();
      dialog.setVisible(true);

      JOptionPane.showMessageDialog(dialog, "arfarf");
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...