Java 通过按钮将字符串从一个JPanel上的JTextField发送到另一个JPanel上的JTextArea

Java 通过按钮将字符串从一个JPanel上的JTextField发送到另一个JPanel上的JTextArea,java,swing,jpanel,jtextfield,jtextarea,Java,Swing,Jpanel,Jtextfield,Jtextarea,我目前正在尝试将文本字段“itemName”中键入的文本打印在文本区域“printArea”上。当我将printArea和itemName都打印在同一个JPanel p1上时,效果很好。当printArea在p1上设置为单独的JPanel itemName,在p2上设置为printArea时,不会输出任何内容。两个JPanel用于使GUI在分配时显示。我认为问题所在是我将JPanel“p1”添加到了JPanel“p2”中 import javax.swing.*; import java.awt

我目前正在尝试将文本字段“itemName”中键入的文本打印在文本区域“printArea”上。当我将printArea和itemName都打印在同一个JPanel p1上时,效果很好。当printArea在p1上设置为单独的JPanel itemName,在p2上设置为printArea时,不会输出任何内容。两个JPanel用于使GUI在分配时显示。我认为问题所在是我将JPanel“p1”添加到了JPanel“p2”中

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MovieGUI extends JFrame{

JButton submit = new JButton("Submit");
JTextField itemName = new JTextField();
JTextField itemPrice = new JTextField();
JTextField itemQuantity = new JTextField();
JTextArea printArea = new JTextArea(400,400);


public MovieGUI(){


        JPanel p1 = new JPanel();

        p1.setLayout(new GridLayout(6, 2));



        p1.add(new JLabel("Item Name"));
        p1.add(itemName);   //p1.add(new JTextField(8));
        p1.add(new JLabel("Item Price"));
        p1.add(itemPrice);  // p1.add(new JTextField(8));
        p1.add(new JLabel("Quantity"));
        p1.add(itemQuantity);   //p1.add(new JTextField(8));
        p1.add(new JLabel("submit"));
        p1.add(submit);

        //Something is not working... 

        JPanel p2 = new JPanel(new BorderLayout());
            p2.setLayout(new BorderLayout());
            p2.add(p1, BorderLayout.NORTH);

        p2.add(printArea, BorderLayout.SOUTH);
        //add(p1);  
        add(p2);

        event e = new event();
        submit.addActionListener(e);
    }


    public class event implements ActionListener{
        public void actionPerformed(ActionEvent e){
            String text = itemName.getText();

            printArea.setText(text);   //printArea.setText("BUTTON");


        }
    }
    public static void main(String[] args){


        MovieGUI frame = new MovieGUI();
        frame.setTitle("Submission");
        frame.setSize(800, 500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }


} 
您的JPanel p2在中心对齐上不包含任何内容,因此printArea不会在南对齐上查看。要查看printArea上的inputItem文本,请从

p2.add(printArea, BorderLayout.SOUTH);


您的文本正在打印区域中打印,但打印区域的第一行和更多部分隐藏在p1后面。这是因为带有printArea的南部位置填充了整个p2,但其z索引意味着它位于p1后面。如果执行以下操作,您可以看到:

p2.add(printArea, BorderLayout.SOUTH);
printArea.setBackground(Color.BLUE);
p2.setComponentZOrder(printArea, 0); // now the blue printArea hides the form elements in p1
要解决此问题,请将printArea更改为“中心”,而不是“南”

为什么? 它有助于理解BorderLayout的工作原理以及原因。它不是按百分比分割区域,而是用于围绕中心面板排列组件。布局的顺序为:

北/南组件将使用其首选高度,然后使用其所在组件的宽度。 我将忽略这里的东/西,因为您没有使用它们。 确定N/S/E/W部件尺寸后,中心将使用剩余空间 您的打印区域的首选高度是巨大的技术术语!,所以它试图利用这个。一旦进入中央面板,它被告知仅使用剩余空间:由于p1的首选高度小于p2高度,因此中央面板获得剩余高度,并且您仍然可以看到打印区域。如果在使用北/南时颠倒加法顺序,也可以看到这种效果;然后,您将只看到打印区域,而不是p1表单

如果查看JDK中BorderLayout的源代码,您可以看到layoutContainer方法,所有这些都发生在该方法中

p2.add(printArea, BorderLayout.SOUTH);
printArea.setBackground(Color.BLUE);
p2.setComponentZOrder(printArea, 0); // now the blue printArea hides the form elements in p1