Java 如何将字符串从ChildFrame发送到ParentFrame并重新绘制ParentFrame?

Java 如何将字符串从ChildFrame发送到ParentFrame并重新绘制ParentFrame?,java,swing,awt,Java,Swing,Awt,ParentFrame显示ArrayList和一个ADD按钮。单击ParentFrame上的ADD按钮后,就会显示ChildFrame。 在ChildFrame上,我键入一个字符串并单击OK按钮,然后它应该将其字符串传输到ParentFrame。最后,应使用新添加的字符串重新绘制ParentFrame 我在重新绘制时遇到问题,但我可能无法将字符串从子项发送到父项,因为父项未重新绘制 我尝试了两个或三个其他的观点,但下面的代码似乎是可行的,但 我需要你的帮助 父框架 你的问题是: public v

ParentFrame显示ArrayList和一个ADD按钮。单击ParentFrame上的ADD按钮后,就会显示ChildFrame。 在ChildFrame上,我键入一个字符串并单击OK按钮,然后它应该将其字符串传输到ParentFrame。最后,应使用新添加的字符串重新绘制ParentFrame

我在重新绘制时遇到问题,但我可能无法将字符串从子项发送到父项,因为父项未重新绘制

我尝试了两个或三个其他的观点,但下面的代码似乎是可行的,但

我需要你的帮助

父框架 你的问题是:

public void actionPerformed(ActionEvent e) {
    addFrame = new childFrame();
    
    list.add(addFrame.getTestString());
    big.revalidate();
    big.repaint();
}
由于您的子框架不是模式窗口(例如,JOptionPane是模式对话框窗口),因此它不会停止调用窗口中的程序流。在创建子帧时立即调用.getTestString,但在用户有机会再次输入任何数据之前,因为调用窗口中的程序流没有停止

解决方案是使您的子框架实际上成为模态JDialog。这将基本解决整个问题。因此,不要让子框架从JFrame扩展,而是扩展JDialog,并使用JDialog构造函数使其可以查看JDialog API

e、 g

现在,一旦对话框设置为可见,该对话框窗口将冻结来自调用代码的程序流,并且在该对话框不再可见之前,调用代码流不会恢复

另外,请看一下

另一种方法是继续使用多个JFrames,不推荐!!,并将WindowListener添加到子窗口,侦听windows关闭事件,然后从回调方法中的对话框获取信息,该方法在windows关闭事件发生时激活

例如:

import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ParentGuiPanel extends JPanel {
    private DefaultListModel<String> listModel = new DefaultListModel<>();
    private JList<String> jList = new JList<>(listModel);
    private JButton addButton = new JButton("Add");
    private JDialog childDialog;
    private ChildGuiPanel childPanel = new ChildGuiPanel();
    
    public ParentGuiPanel() {
        listModel.addElement("Test 1");
        listModel.addElement("Test 2");

        jList.setPrototypeCellValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        jList.setVisibleRowCount(8);
        JScrollPane scrollPane = new JScrollPane(jList);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
        addButton.addActionListener(e -> addActionPerformed(e));
        addButton.setMnemonic(KeyEvent.VK_A);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addButton);
        
        setLayout(new BorderLayout());
        add(scrollPane);
        add(buttonPanel, BorderLayout.PAGE_END);
    }
    
    private void addActionPerformed(ActionEvent e) {
        Window window = null;
        if (childDialog == null) {
            window = SwingUtilities.getWindowAncestor(this);
            if (window == null) {
                return;
            }
            
            childDialog = new JDialog(window, "Child GUI", ModalityType.APPLICATION_MODAL);
            childDialog.add(childPanel);
            childDialog.pack();
            childDialog.setLocationRelativeTo(window);
        }
        
        if (childDialog != null) {
            childDialog.setVisible(true);
            
            String text = childPanel.getText();
            if (!text.trim().isEmpty()) {
                listModel.addElement(text);
            }
        }
    }
    
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame mainGui = new JFrame("Main GUI");
            mainGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            ParentGuiPanel mainPanel = new ParentGuiPanel();
            mainGui.add(mainPanel);
            mainGui.pack();
            mainGui.setLocationRelativeTo(null);
            mainGui.setVisible(true);
        });
    }
}

1不要像JFrame那样扩展组件和窗口,除非覆盖它们关闭的方法。2参见3如果工作正常,则不必调用标准Swing组件上的重新绘制。只需更改模型或内容,其余将自动进行。请注意对我的回答收取的费用。如果对此有任何疑问,请问我非常感谢!!我试着把它们都用作JFrame。。。虽然你不推荐这个,但我很感激你把它放在最后:@flash,不要将它们同时用作jframe,因为这是你问题的一个来源
public void actionPerformed(ActionEvent e) {
    addFrame = new childFrame();
    
    list.add(addFrame.getTestString());
    big.revalidate();
    big.repaint();
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

@SuppressWarnings("serial")

// note that class names should begin with an upper-case letter
public class ChildFrame extends JDialog {
    String test;
    JTextField name;
    JButton ok, cancel;
    
    public ChildFrame(JFrame parentFrame) {

        // the true parameter makes this modal
        super(parentFrame, "child frame", true);  
import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ParentGuiPanel extends JPanel {
    private DefaultListModel<String> listModel = new DefaultListModel<>();
    private JList<String> jList = new JList<>(listModel);
    private JButton addButton = new JButton("Add");
    private JDialog childDialog;
    private ChildGuiPanel childPanel = new ChildGuiPanel();
    
    public ParentGuiPanel() {
        listModel.addElement("Test 1");
        listModel.addElement("Test 2");

        jList.setPrototypeCellValue("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        jList.setVisibleRowCount(8);
        JScrollPane scrollPane = new JScrollPane(jList);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
        addButton.addActionListener(e -> addActionPerformed(e));
        addButton.setMnemonic(KeyEvent.VK_A);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addButton);
        
        setLayout(new BorderLayout());
        add(scrollPane);
        add(buttonPanel, BorderLayout.PAGE_END);
    }
    
    private void addActionPerformed(ActionEvent e) {
        Window window = null;
        if (childDialog == null) {
            window = SwingUtilities.getWindowAncestor(this);
            if (window == null) {
                return;
            }
            
            childDialog = new JDialog(window, "Child GUI", ModalityType.APPLICATION_MODAL);
            childDialog.add(childPanel);
            childDialog.pack();
            childDialog.setLocationRelativeTo(window);
        }
        
        if (childDialog != null) {
            childDialog.setVisible(true);
            
            String text = childPanel.getText();
            if (!text.trim().isEmpty()) {
                listModel.addElement(text);
            }
        }
    }
    
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            JFrame mainGui = new JFrame("Main GUI");
            mainGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            ParentGuiPanel mainPanel = new ParentGuiPanel();
            mainGui.add(mainPanel);
            mainGui.pack();
            mainGui.setLocationRelativeTo(null);
            mainGui.setVisible(true);
        });
    }
}
@SuppressWarnings("serial")
class ChildGuiPanel extends JPanel {
    private JTextField textField = new JTextField(15);
    private JButton okButton = new JButton("OK");
    private JButton cancelButton = new JButton("Cancel");
    
    public ChildGuiPanel() {
        okButton.addActionListener(e -> okActionPerformed(e));
        cancelButton.addActionListener(e -> cancelActionPerformed(e));
        textField.addActionListener(e -> okActionPerformed(e));
        okButton.setMnemonic(KeyEvent.VK_O);
        cancelButton.setMnemonic(KeyEvent.VK_C);
        
        add(new JLabel("Text: "));
        add(textField);
        add(okButton);
        add(cancelButton);
    }
    
    public String getText() {
        return textField.getText();
    }
    
    private void disposeWindow() {
        textField.selectAll();
        Window window = SwingUtilities.getWindowAncestor(this);
        if (window != null) {
            window.dispose();
        }
    }
    
    private void okActionPerformed(ActionEvent e) {
        disposeWindow();
    }
    
    private void cancelActionPerformed(ActionEvent e) {
        textField.setText("");
        disposeWindow();
    }
}