1

ユーザーが選択した画面で特定の JDialog を開くことができる機能に取り組んでいます。私はそれを終わらせるのに非常に近いですが、私はまだ1つのことを管理していません. 以下のメソッドは、「screen[screen].setFullScreenWindow」で NullPointerException をスローします。ただし、JDialogが表示されました。閉じた直後に、NPE がコンソール ウィンドウにジャンプします。問題が setFullScreenWindow メソッドにあることは知っていますが、それ以外の方法で選択した画面で JDialog を「ポップ」する方法がわかりません。

/*
 * SHOW ON SPECIFIC MONITOR
 */
public void showOnScreen(GraphicsDevice[] screenlist, int screen, JDialog dialog) {
     if (screen > -1 && screen < screenlist.length) {
          try {
               screenlist[screen].setFullScreenWindow(dialog);
          } catch (NullPointerException e) {
               e.printStackTrace();
          }
     } else if (screenlist.length > 0) {
          screenlist[0].setFullScreenWindow(dialog);
     } else {
          throw new RuntimeException("No Screens Found");
     }
}

JButton アクションでメソッドを呼び出します。

    buttonStartDemo.addActionListener(new ActionListener() {
 public void actionPerformed(ActionEvent e) {
      VisualField_DemoSession_JDialog dialog = new VisualField_DemoSession_JDialog();
      GraphicsDevice[] screenlist = getScreenList();
      if (screenlist.length > 1) {
           Object[] options = {"1", "2"};
           int n = JOptionPane.showOptionDialog(new JFrame(), "On which screen you want to open Demo Session?", "Question!", JOptionPane.YES_NO_OPTION, 
                     JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
           if (n == JOptionPane.YES_OPTION) {
                showOnScreen(screenlist, 0, dialog);
           } else if (n == JOptionPane.NO_OPTION) {
                showOnScreen(screenlist, 1, dialog);
           }
      } else if (screenlist.length == 1) {
           showOnScreen(screenlist, 0, dialog);
      } else {
           throw new RuntimeException("No Screens Found");
      }
 }

});

そして、これは画面リストを取得するメソッドです:

public GraphicsDevice[] getScreenList() {
 GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
 GraphicsDevice[] gs = ge.getScreenDevices();
 return gs;
}

スタックトレース:

java.lang.NullPointerException
 at java.awt.GraphicsDevice.setFullScreenWindow(Unknown Source)
 at sun.awt.Win32GraphicsDevice.setFullScreenWindow(Unknown Source)
 at plugin.vision.visualfield.VisualField_Main_JFrame.showOnScreen(VisualField_Main_JFrame.java:349)
 at plugin.vision.visualfield.VisualField_Main_JFrame$3.actionPerformed(VisualField_Main_JFrame.java:146)
 at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
 at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
 at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
 at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
 at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
 at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
 at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
 at java.awt.Component.processMouseEvent(Unknown Source)
 at javax.swing.JComponent.processMouseEvent(Unknown Source)
 at java.awt.Component.processEvent(Unknown Source)
 at java.awt.Container.processEvent(Unknown Source)
 at java.awt.Component.dispatchEventImpl(Unknown Source)
 at java.awt.Container.dispatchEventImpl(Unknown Source)
 at java.awt.Component.dispatchEvent(Unknown Source)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
 at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
 at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
 at java.awt.Container.dispatchEventImpl(Unknown Source)
 at java.awt.Window.dispatchEventImpl(Unknown Source)
 at java.awt.Component.dispatchEvent(Unknown Source)
 at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
 at java.awt.EventQueue.access$200(Unknown Source)
 at java.awt.EventQueue$3.run(Unknown Source)
 at java.awt.EventQueue$3.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
 at java.awt.EventQueue$4.run(Unknown Source)
 at java.awt.EventQueue$4.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
 at java.awt.EventQueue.dispatchEvent(Unknown Source)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
 at java.awt.EventDispatchThread.run(Unknown Source)

編集 2013/09/30、午後 8 時 10 分

Ok。この問題が何であるかを理解したと思います。そこで主に、JDialog クラスのオブジェクトである「dialog」に対してメソッド setFullScreenWindow を呼び出してみました。しかし、いくつかの init メソッドを呼び出すボタンのアクションでは、「ダイアログ」を初期化するだけです。「ダイアログ」オブジェクトクラスの適切な実装です。だから私はそれをやった、そしてNPEはなくなった. 新しい Swing スレッドと contentPane のいくつかの標準設定を含む main メソッドを追加するだけです。以上です。

何かご提案がありましたら、またこの件について何かお聞かせいただければ幸いです。

問題は解決しました。JDialog クラスの標準フレームの下:

public class DialogTest extends JDialog {

 private final JPanel contentPanel = new JPanel();

 /**
  * Launch the application.
  */
 public static void main(String[] args) {
      try {
           DialogTest dialog = new DialogTest();
           dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
           dialog.setVisible(true);
      } catch (Exception e) {
           e.printStackTrace();
      }
 }

 /**
  * Create the dialog.
  */
 public DialogTest() {
      setBounds(100, 100, 450, 300);
      getContentPane().setLayout(new BorderLayout());
      contentPanel.setLayout(new FlowLayout());
      contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
      getContentPane().add(contentPanel, BorderLayout.CENTER);
 }

}

4

0 に答える 0