java学习(1)

今天老师留了一个作业:建立框架,在中央放置多行文本框(TextArea),在南方放置一个面板(JPanel),并在上边放置两个按钮,按钮文本分别为确定和取消

多行文本框

TextArea是一个AWT组件
JTextArea是一个swing组件
想要加一个多行文本框,就需要new JTextArea()

正确的代码

package pack2;
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame{
    private static final long serialVersionUID = 1L;
    JButton bt1,bt2;
    JTextArea textarea;
    JPanel j1;
    MyFrame(){
        this.setSize(400, 400);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setVisible(true);
        bt1=new JButton("确定");
        bt2=new JButton("取消");
        textarea=new JTextArea();
        j1=new JPanel();
        j1.add(bt1);
        j1.add(bt2);
        this.add(j1,BorderLayout.SOUTH);
        this.add(textarea);
    }
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        new MyFrame();
    }
}

遇到的问题

adding container's parent to itself

错误的代码为this.add(j1, BorderLayout.SOUTH)
补充一下,在类中还定义了JPanel j1,以及构造方法中的j1=(JPanel)this.getContentPane()
其中由于内容面板是container类型的,所以需要类型强制转换
这是把容器自身添加到了自身内容造成的
JDK1.5之前需要先获取内容面板,然后在内容面板上添加组件,从JDK1.5之后,可以直接使用
this.add()添加组件,但组件依然被添加到内容面板上,而不是JFrame上

错在哪里

这里显然j1就是内容面板,我在这句话中把j1添加到了JFrame上。但实质是把j1加到了j1上

纠错

这里我实际上是误解了题意,题目说的是放置一个面板,所以和获取内容面板没关系。
只需要j1=new JPanel(),然后把按钮添加到这个面板上,再把这个面板添加到JFrame(真正的内容面板)就可以了

默认布局

jframe默认是边界布局,同一个位置放入组件,那么后面的组件覆盖前面的组件(BorderLayout)
JPanel的默认布局为流式布局 ,所以就是一个靠近一个的出来(FlowLayout)
这里new出来的JPanel是流式布局,所以不会覆盖

疑问

2020-02-25 (4).png

如果我非要用j1=(JPanel)this.getContentPane();获取内容面板,然后j1.add(bt1,BorderLayout.SOUTH); j1.add(bt2,BorderLayout.SOUTH);为什么同时添加的两个南方的按钮会有一个被覆盖呢,明明JPanel是流式的...
内容面板的默认布局管理器是边界式的,普通面板是流式的
经过答疑了解到,强制类型转换改变不了内容面板的布局管理器,只是可以赋值给JPanel对象了
当然题目说的是放置一个面板,如果像我这样做,等于直接在内容面板的南方放了两个按钮,虽然看着没什么不同,但感觉还是有实质上的区别

你可能感兴趣的:(java学习(1))