将面板添加到面板

时间:2015-07-10 10:18:15

标签: java swing

我想把JPanel添加到我已经存在的JPanel中,所以我可以在一个带有JTextField的小窗口的顶部有一个名称,下面有一个可滚动的JTextArea,带有一些描述。我创建了一个使用以下构造函数扩展JPanel的类:

import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import java.awt.*;

public class LocationWindow extends JPanel {
    public JTextField name;
    public JTextArea desc;
    public JScrollPane scroll;

    public LocationWindow(){
        super();
        setBorder (new TitledBorder(new EtchedBorder(), "Display Area"));
        setLayout(new BorderLayout());
        setVisible(true);
        setBounds(30, 40, 700, 290);
        name = new JTextField(10);
        name.setText("name");
        desc = new JTextArea(5,10);
        scroll = new JScrollPane(desc);
        scroll.setVerticalScrollBarPolicy ( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );
        desc.setEditable (true);
        desc.setLineWrap(true);
        desc.setText("random text");
        add(name);
        add(desc);
        add(scroll);
        validate();
    }
}

它几乎可以工作,因为它给了我带边框和滚动的窗口,但JTextField和JTextArea都丢失了。

2 个答案:

答案 0 :(得分:1)

当您使用BorderLayout作为JPanel时,

  setLayout(new BorderLayout());   

如果您未指定位置,则组件将始终添加到中心。 add(scroll);add(scroll,BorderLayout.CENTER);相同,因为您要添加所有内容,只需添加最后添加的组件即可见。阅读this as well

接下来你要单独添加JTextArea,这样就可以从ScrollPane中删除它。只需添加scrollpane到Panel就不需要添加所有组件了。[单独添加父组件]

    add(name,BorderLayout.NORTH);
    //add(desc);Noo need to add desc as it is already added in JScrollPane
    add(scroll,BorderLayout.CENTER);

JPanel.JPanel不需要setVisible,需要像JFrame一样嵌入到容器中

         //setVisible(true);Wont do anything

所以这样打电话

    JFrame frame = new JFrame();
    frame.add(new LocationWindow());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

答案 1 :(得分:0)

您可以使用以下代码将面板添加到面板。

 public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    LocationWindow loc = new LocationWindow();
    frame.add(loc);
    frame.setSize(300, 200);
    frame.setVisible(true);
}