Java 将值或访问权限从jDialog传递到jFrame,反之亦然
好的,我确实读了你发布的链接,但我发现以下错误:Java 将值或访问权限从jDialog传递到jFrame,反之亦然,java,swing,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.act
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:我在这里创建了两个变量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());
}
我知道我在这里搞乱了一些东西,但我看不到,你能帮我解决这个问题吗?对于初学者,不要使用
JDialog\#show()
,因为该方法已被弃用(请查看JDialog API了解更多信息)。而是使用JDialog\setVisible(true)
是否从“主框架”中调用此代码
如果是这样,因为对话框是模态的,所以您可以在将其设置为可见后立即在代码中查询对话框实例的变量状态。您可以使用getter(也称为accessor)方法来提取这些信息。否则,您需要有一个对“main frame”实例的有效引用才能传递信息
要获得更多帮助,请告诉我们有关您的问题的更多信息。另外,请注意,我很少有扩展JFrame或JDialog的类,而是在需要保存GUI时创建JFrame或JDialog,这些GUI旨在创建JPanel以获得更大的灵活性
编辑关于您最近的编辑,我仍然看不到您的确切位置,但是让我们简化问题,让您尝试从JDialog中的JTextField获取信息,并使用该信息填充JFrame中的JTextField。我给dialog类一个
getFieldText()
方法,返回其字段中的文本,然后在对话框返回后,让JFrame在dialog实例上调用这个方法
有关这方面的具体示例,请参阅我在回答中发布的代码
编辑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?您是否测试了该行上的变量以查看哪些变量为空?您是否回顾了您的代码,以了解为什么变量是否为空?@user1559104:请参见编辑以回答以及链接,以了解我所描述的具体示例。布满鳗鱼的气垫船:我的主要问题是我的jdialog中有一个jpanel,所以我真的无法调用布满鳗鱼的methodHovercraft:你,对了,我刚刚错过了smth,我可以访问该方法,但它给出了错误的结果。如果整个过程充满了EEL:使用新的更改进行更新仍然不起作用,请看一看。@user1559104:请参阅上面的编辑2。你没有告诉我们足够的信息来解释你的NPE。你没有告诉我们足够的信息让我们帮助你。什么线路导致NPE?您是否测试了该行上的变量以查看哪些变量为空?您是否回顾了代码以了解变量为null的原因?
client.medical.main.main.jMenuItem6ActionPerformed(main.java:348)
指出,NullPointerException(NPE)发生在文件main.java的第348行。您发布的代码第348行在哪里?