-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,如下所示:

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 和 dialog 然后编辑了打开 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).

这段代码是从“主框架”中调用的吗?

如果是这样,由于您的对话框是模态的,您可以在设置为可见后立即在代码中查询对话框实例以了解其变量的状态。您可以使用 getter(也称为访问器)方法来提取此信息。否则,您需要对“主框架”实例进行有效引用才能传递信息。

如需更多帮助,请告诉我们更多关于您的问题的信息。另外,请注意,我很少有扩展 JFrame 或 JDialog 的类,而是在需要保存我的 GUI 时创建我的 JFrame 或 JDialog,这些 GUI 旨在创建 JPanel 以获得更大的灵活性。

编辑
关于您最近的编辑,我仍然看不到您卡在哪里,但让我们简化问题,让您尝试从 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?您是否测试了该行上的变量以查看哪些变量为空?你有没有回顾过你的代码,看看为什么变量是空的?

于 2012-09-11T23:54:44.897 回答