-1

投稿したリンクを読みましたが、次のエラーが表示されます。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at client.medical.main.Main.jMenuItem6ActionPerformed(Main.java:348)
at client.medical.main.Main.access$400(Main.java:21)
at client.medical.main.Main$5.actionPerformed(Main.java:249)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

コードを編集して、あなたがくれたリンクのように見えるようにしました。

JDialog : 次のように、新しい JButton を 1 つ追加しました。

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

    Window win = SwingUtilities.getWindowAncestor(this);
    if (win != null) {
        win.dispose();
     }
   }
  public String getFieldText() {
     return jTextField1.getText();
  }

JFrame: ここでは、2 つの変数 dialogPanel とダイアログを作成し、jdialog を開くボタンを編集しました。コードは次のとおりです。

 private Recherche dialogPanel = new Recherche();
 private JDialog dialog;    
 private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {                                           
  if (dialog == null) {
     Window win = SwingUtilities.getWindowAncestor(this);
      if (win != null) {
        dialog = new JDialog(win, "My Dialog",
                 Dialog.ModalityType.APPLICATION_MODAL);
        dialog.getContentPane().add(dialogPanel);
        dialog.pack();
        dialog.setLocationRelativeTo(null);
     }
  }
  dialog.setVisible(true); // here the modal dialog takes over
  System.out.print(dialogPanel.getFieldText());

}

私はここで何かを台無しにしていることを知っていますが、それを見ることができません。この問題を解決するのを手伝ってくれませんか?

4

1 に答える 1

1

まずJDialog#show()、このメソッドは推奨されていないため、使用しないでください (詳細については、JDialog API を確認してください)。代わりに を使用しますJDialog#setVisible(true)

このコードは「メイン フレーム」内から呼び出されていますか?

その場合、ダイアログはモーダルであるため、ダイアログを表示に設定した直後に、コード内の変数の状態についてダイアログ インスタンスにクエリを実行するだけで済みます。ゲッター (アクセサーとも呼ばれます) メソッドを使用して、この情報を抽出できます。それ以外の場合は、情報を渡すために「メイン フレーム」インスタンスへの有効な参照が必要です。

さらにサポートが必要な場合は、問題について詳しくお知らせください。また、JFrame または JDialog を拡張するクラスはめったにありませんが、柔軟性を高めるために JPanels を作成するための GUI を保持する必要がある場合は、JFrame または JDialog を作成することに注意してください。

編集
あなたの最近の編集に関して、私はまだあなたが行き詰まっている場所を正確に見ることができませんが、問題を単純化し、JDialog の JTextField から情報を取得し、その情報を使用して JFrame に JTextField を設定してみましょう。 . ダイアログクラスにgetFieldText()、そのフィールドに保持されているテキストを返すメソッドを指定し、ダイアログが返された後、JFrame がダイアログインスタンスでこのメソッドを呼び出すようにします。

この具体的な例については、この回答で投稿したコードを参照してください

編集 2
たとえば、コードを使用すると、すべてが機能します。それでも問題が解決しない場合は、さらに表示する必要があります。

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class DialogEg {
   private static void createAndShowGUI() {
      MainPanelGen mainPanelGen = new MainPanelGen();

      JFrame frame = new JFrame("DialogEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanelGen.getMainPanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }

}

class MainPanelGen {
   private JPanel mainPanel = new JPanel();
   private JTextField field = new JTextField(10);
   private JButton btn = new JButton(new BtnActn());
   private JDialog dialog;
   private DialogPanel dialogPanel = new DialogPanel();

   public MainPanelGen() {
      mainPanel.add(field);
      mainPanel.add(btn);

      field.setEditable(false);
      field.setFocusable(false);
   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   private class BtnActn extends AbstractAction {
      BtnActn() {
         super("Button");
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         if (dialog == null) {
            Window win = SwingUtilities.getWindowAncestor(mainPanel);
            if (win != null) {
               dialog = new JDialog(win, "My Dialog",
                     Dialog.ModalityType.APPLICATION_MODAL);
               dialog.getContentPane().add(dialogPanel);
               dialog.pack();
               dialog.setLocationRelativeTo(null);
            }
         }
         dialog.setVisible(true); // here the modal dialog takes over
         System.out.println   (dialogPanel.getFieldText());
         field.setText(dialogPanel.getFieldText());
      }
   }
}

class DialogPanel extends JPanel {
   private JTextField field = new JTextField(10);
   private JButton exitBtn = new JButton(new ExitBtnAxn("Exit"));

   public DialogPanel() {
      add(field);
      add(exitBtn);
   }

   public String getFieldText() {
      return field.getText();
   }

   private class ExitBtnAxn extends AbstractAction {

      public ExitBtnAxn(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent arg0) {
         Window win = SwingUtilities.getWindowAncestor(DialogPanel.this);
         if (win != null) {
            win.dispose();
         }

      }

   }

}

あなたは私たちがあなたを助けるのに十分なことを私たちに伝えていません. NPEの原因となるラインは? その行の変数をテストして、どの変数が null であるかを確認しましたか? コードを見直して、変数が null である理由を確認しましたか?

于 2012-09-11T23:54:44.897 に答える