2012-09-11 38 views
-1

OK我没有看到你发布的链接,但我得到这些错误:通值或从的JDialog到JFrame的访问,反之亦然

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()); 

} 

我知道我在这里搞点东西,但我看不到它,请问您能帮我解决这个问题吗?

+0

你还没有告诉我们足够让我们来帮助你。什么线路导致NPE?你是否测试了该行的变量以查看哪一个是空的?你回头看看你的代码,看看为什么变量是空的? –

+0

'client.medical.main.Main.jMenuItem6ActionPerformed(Main.java:348)'表示NullPointerException(NPE)发生在文件Main.java的第348行。您发布的代码中的第348行在哪里? –

回答

1

对于初学者,请勿使用JDialog#show(),因为该方法已被弃用(请检查JDialog API以了解更多信息)。请使用JDialog#setVisible(true)

此代码正在从“主框架”内叫什么名字?

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

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

编辑
关于你最近的编辑,我现在还不能清楚地看到你就完蛋了,但让我们简化问题,只是有你尝试从一个JTextField获取信息的的JDialog和使用该信息来填充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?你是否测试了该行的变量以查看哪一个是空的?你回头看看你的代码,看看为什么变量是空的?

+0

我刚更新了我的帖子,更多信息 – user1559104

+0

@ user1559104:请参阅编辑以回答以及链接,以获取我描述的具体示例。 –

+0

气垫船充满了鳗鱼:我的主要问题是,我有jpaialog中的jpanel,所以我真的不能打电话给方法 – user1559104