我想把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都丢失了。
答案 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);
}