传递值或从jDialog访问jFrame,反之亦然

时间:2012-09-11 23:42:09

标签: java swing

好的,我确实看过你发布的链接,但我收到了这些错误:

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和对话框,然后编辑了打开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());

}

我知道我在这里搞乱了,但我看不清楚,你能帮我解决一下这个问题吗?

1 个答案:

答案 0 :(得分:1)

对于初学者,请不要使用JDialog#show(),因为该方法已被弃用(请查看JDialog API以了解更多相关信息)。而是使用JDialog#setVisible(true)

是否在“主框架”内调用此代码?

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

如需更多帮助,请告诉我们您的问题。另外,请注意我很少有扩展JFrame或JDialog的类,而是在需要时创建我的JFrame或JDialog来保存我的GUI,以便更灵活地创建JPanel。

修改
关于你最近的编辑,我仍然无法确切地看到你被困在哪里,但是让我们简化问题,让你尝试从JDialog中的JTextField获取信息并使用该信息来填充JFrame中的JTextField。我给对话框类一个getFieldText()方法返回其字段中保存的文本,然后在对话框返回后,我将让对话框实例上的JFrame调用此方法

有关此问题的具体示例,请参阅我在此回答here中发布的代码。

编辑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?您是否测试过该行的变量以查看哪一个是空的?您是否重新查看了代码以了解变量为空的原因?