Java 通过按钮将字符串从一个JPanel上的JTextField发送到另一个JPanel上的JTextArea
我目前正在尝试将文本字段“itemName”中键入的文本打印在文本区域“printArea”上。当我将printArea和itemName都打印在同一个JPanel p1上时,效果很好。当printArea在p1上设置为单独的JPanel itemName,在p2上设置为printArea时,不会输出任何内容。两个JPanel用于使GUI在分配时显示。我认为问题所在是我将JPanel“p1”添加到了JPanel“p2”中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
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