java中的Jframe到底是怎么布局的?

This_chao 2020-06-09 10:29:13
起因:主要想实现一个注册界面。
问题:使用JFrame生成窗口,为什么在这同一个窗口(Frame)下添加一个按钮(Button)后原来的面板panel不见了?就是只能添加两个panel,之后再添加其它组件就不显示了。
源代码:
//构造一个新的JFrame,作为新窗口。
JFrame regis = new JFrame();
regis.setBounds(900, 180, 240, 360);
regis.setTitle("注册");
regis.setDefaultCloseOperation(2);

//获取输入的注册信息:用户名、密码
JTextField userNameIn = new JTextField();
JTextField passwordIn = new JTextField();

JPanel panelRegisName = new JPanel();
panelRegisName.setLayout(null);//自己布局,适用于不变窗口。
panelRegisName.setBounds(10, 20, 200, 50);
regis.getContentPane().add(panelRegisName);
JLabel userNameLabel = new JLabel("用户名:");
userNameLabel.setBounds(20,25,60,20);
panelRegisName.add(userNameLabel);
userNameIn.setBounds(80,25,60,20);
panelRegisName.add(userNameIn);

//为啥无法同时显示三个面板panel???
JPanel panelRegisPass = new JPanel();
panelRegisPass.setLayout(null);
panelRegisPass.setBounds(20, 80, 200, 50);
regis.getContentPane().add(panelRegisPass);
JLabel passwordLabel = new JLabel("密码:");
passwordLabel.setBounds(30,85,60,20);
panelRegisPass.add(passwordLabel);
passwordIn.setBounds(90,85,60,20);
panelRegisPass.add(passwordIn);

//点击确定按钮就注册。
JPanel panelEnsure = new JPanel();
panelEnsure.setLayout(null);
panelEnsure.setLocation(60, 230);
panelEnsure.setBounds(70, 240, 100, 35);
regis.getContentPane().add(panelEnsure);
JButton ensure = new JButton("确定");
ensure.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

System.out.println("userNameIn: " + userNameIn.getText());
JOptionPane.showMessageDialog(null, "注册成功!欢迎您!", "友情提示", JOptionPane.PLAIN_MESSAGE);
}
});
ensure.setBounds(75, 245, 60, 30);
panelEnsure.add(ensure);
regis.setVisible(true);
...全文
420 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
This_chao 2020-06-11
  • 打赏
  • 举报
回复
引用 7 楼 左手夕阳落地时 的回复:
我还没明白


参考3楼的代码,设置JFrame为无布局构造,此外设置边界需要做出调整,否则会被覆盖。修正后代码如下:


//注册界面
public class Demo2 extends JFrame{

//如果一个序列化类没有声明这样一个static final的变量,JVM会根据各种参数为这个类计算一个
private static final long serialVersionUID = 1L;
public Demo2() {


////构造一个新的JFrame,作为新窗口。
JFrame regis = new JFrame();
regis.setBounds(900, 180, 360, 360);
regis.setTitle("注册");
regis.setLayout(null);
regis.setDefaultCloseOperation(3);

//获取输入的注册信息:用户名、密码
JTextField userNameIn = new JTextField();
JTextField passwordIn = new JTextField();
JTextField hostIn = new JTextField();

JPanel panelRegisName = new JPanel();
panelRegisName.setLayout(null);//自己布局,适用于不变窗口。
panelRegisName.setBounds(20, 30,300,30);
regis.getContentPane().add(panelRegisName);
JLabel userNameLabel = new JLabel("用户名:");
//这里的位置都是相对的,将这个组件添加进panel容器,这panel容器的起始位置是新的组件的起点(0,0),否则可能使得组件被其他panel容器覆盖。
userNameLabel.setBounds(0,0,80,30);
panelRegisName.add(userNameLabel);
userNameIn.setBounds(80, 0, 220, 30);
panelRegisName.add(userNameIn);

JPanel panelRegisPass = new JPanel();
panelRegisPass.setLayout(null);
panelRegisPass.setBounds(20,70,300,30);
regis.getContentPane().add(panelRegisPass);
JLabel passwordLabel = new JLabel("密码:");
passwordLabel.setBounds(0,0,80,30);
panelRegisPass.add(passwordLabel);
passwordIn.setBounds(80, 0, 220, 30);
panelRegisPass.add(passwordIn);


//点击确定按钮就注册。
JPanel panelEnsure = new JPanel();
panelEnsure.setLayout(null);
panelEnsure.setBounds(20,130,300,30);
regis.getContentPane().add(panelEnsure);
JButton ensure = new JButton("确定");
ensure.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

// System.out.println("userNameIn: " + userNameIn.getText());
JOptionPane.showMessageDialog(null, "注册成功!欢迎您!", "友情提示", JOptionPane.PLAIN_MESSAGE);
}
});
ensure.setBounds(110, 0, 80, 30);
panelEnsure.add(ensure);
regis.setVisible(true);
}

public static void main(String[] args) {

Demo2 d2 = new Demo2();

}

}


qq_39936465 2020-06-10
  • 打赏
  • 举报
回复
引用 3 楼 zhengchaoli 的回复:
你好!感谢你的指导,我的标题不太准确。 请问注册界面怎么实现呢?就是在窗口添加三个控件,分别是用户名,密码,确定按钮。

public class MyJframe extends JFrame {
	JTextField name,pass;
	JLabel username,password;
	JButton ensure;
	JPanel panel1,panel2,panel3;
	
	MyJframe(){
		setSize(new Dimension(360, 240));
		setTitle("注册");
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setLayout(null);
		setLocation(300, 300);
		
		panel1=new JPanel();
		panel1.setLayout(null);
		panel1.setBounds(20, 30,300,30);
		name=new JTextField();
		name.setBounds(80, 0, 220, 30);
		panel2=new JPanel();
		panel2.setLayout(null);
		panel2.setBounds(20,70,300,30);
		pass=new JTextField();
		pass.setBounds(80, 0, 220, 30);
		username=new JLabel("用户名:");
		username.setBounds(0,0,80,30);
		password=new JLabel("密  码:");
		password.setBounds(0,0,80,30);
		panel3=new JPanel();
		panel3.setLayout(null);
		panel3.setBounds(20,130,300,30);
		ensure=new JButton("确定");
		ensure.setBounds(110, 0, 80, 30);
		ensure.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("用户名:"+name.getText());
				JOptionPane.showMessageDialog(null, "注册成功!欢迎您!","友情提示",JOptionPane.PLAIN_MESSAGE);
				
			}
		});
		panel1.add(username);
		panel1.add(name);
		panel2.add(password);
		panel2.add(pass);
		panel3.add(ensure);
		add(panel1);add(panel2);add(panel3);
		setVisible(true);
		
	}
	public static void main(String[] args) {
		new MyJframe();
	}

}


  • 打赏
  • 举报
回复
我还没明白
This_chao 2020-06-10
  • 打赏
  • 举报
回复
引用 1 楼 左手夕阳落地时的回复:
你好,我也是新手。我看了代码觉得是因为没有添加add方法,明天我把你代码写上再看
你好!你说的add方法是指的哪里?
This_chao 2020-06-10
  • 打赏
  • 举报
回复
引用 2 楼 qq_39936465的回复:
[quote=引用 楼主 zhengchaoli 的回复:] 起因:主要想实现一个注册界面。 问题:使用JFrame生成窗口,为什么在这同一个窗口(Frame)下添加一个按钮(Button)后原来的面板panel不见了?就是只能添加两个panel,之后再添加其它组件就不显示了。
你既然知道 容器用无布局构造,什么jframe没设置无布局构造?,jframe有自己的默认布局BorderLayout,你这样指定位置添加必然有容器会看不到。[/quote] 你好!感谢你的指导,我的标题不太准确。 请问注册界面怎么实现呢?就是在窗口添加三个控件,分别是用户名,密码,确定按钮。
qq_39936465 2020-06-10
  • 打赏
  • 举报
回复
引用 楼主 zhengchaoli 的回复:
起因:主要想实现一个注册界面。 问题:使用JFrame生成窗口,为什么在这同一个窗口(Frame)下添加一个按钮(Button)后原来的面板panel不见了?就是只能添加两个panel,之后再添加其它组件就不显示了。
你既然知道 容器用无布局构造,什么jframe没设置无布局构造?,jframe有自己的默认布局BorderLayout,你这样指定位置添加必然有容器会看不到。
  • 打赏
  • 举报
回复
你好,我也是新手。我看了代码觉得是因为没有添加add方法,明天我把你代码写上再看
This_chao 2020-06-10
  • 打赏
  • 举报
回复
引用 5 楼 qq_39936465的回复:
[quote=引用 3 楼 zhengchaoli 的回复:] 你好!感谢你的指导,我的标题不太准确。 请问注册界面怎么实现呢?就是在窗口添加三个控件,分别是用户名,密码,确定按钮。

public class MyJframe extends JFrame {
	JTextField name,pass;
	JLabel username,password;
	JButton ensure;
	JPanel panel1,panel2,panel3;
	
	MyJframe(){
		setSize(new Dimension(360, 240));
		setTitle("注册");
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setLayout(null);
		setLocation(300, 300);
		
		panel1=new JPanel();
		panel1.setLayout(null);
		panel1.setBounds(20, 30,300,30);
		name=new JTextField();
		name.setBounds(80, 0, 220, 30);
		panel2=new JPanel();
		panel2.setLayout(null);
		panel2.setBounds(20,70,300,30);
		pass=new JTextField();
		pass.setBounds(80, 0, 220, 30);
		username=new JLabel("用户名:");
		username.setBounds(0,0,80,30);
		password=new JLabel("密  码:");
		password.setBounds(0,0,80,30);
		panel3=new JPanel();
		panel3.setLayout(null);
		panel3.setBounds(20,130,300,30);
		ensure=new JButton("确定");
		ensure.setBounds(110, 0, 80, 30);
		ensure.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("用户名:"+name.getText());
				JOptionPane.showMessageDialog(null, "注册成功!欢迎您!","友情提示",JOptionPane.PLAIN_MESSAGE);
				
			}
		});
		panel1.add(username);
		panel1.add(name);
		panel2.add(password);
		panel2.add(pass);
		panel3.add(ensure);
		add(panel1);add(panel2);add(panel3);
		setVisible(true);
		
	}
	public static void main(String[] args) {
		new MyJframe();
	}

}


[/quote] 感谢你的指导!谢谢!

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧