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