javafx窗体面板位置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javafx窗体面板位置相关的知识,希望对你有一定的参考价值。

参考技术A 点击 ImageView 调整窗口。
Javafx几种典型的布局是FlowPane面板它采用的布局策略是,按照控件的添加次序按个摆放,按照从上到下,从左到右的次序摆放,当窗口的大小发生变化后,场景的大小也自动跟着变化,面板的大小也跟着变化,并且会重新计算各个控件的位置,重新摆放各个控件的位置,GridPane面板它采用的布局策略是,将整个面板划分为若干个格子,每个格子的大小是一样的,每个格子中可以放置一个控件,类似于表格的方式。

GUI

GUI

  定义规则:

    大小:先水平、后垂直;先宽、后高(单位像素)

    位置:原点:x:0/y:0(原点定位于左上角)

    窗体关闭即退出:

  1. 界面元素:(1)容器:

         (2)组件:

  2.布局——嵌套布局

  3.事件处理

   

  标题栏占25, 设置窗体面板大小是减去标题栏的内容面板  this.setSize(500, 400);//设置窗体大小--像素

 SWT开发:

  Java.awt包(关于界面类):容器类与组件类:带外观(过时不在使用)

                            工具类:颜色类、字体类

  Java.swing包:容器类与组件类(带Jxxxx)

 

  界面元素:(1)容器:4种首层容器:Jwindow(最原始容器)/JFrame(原始容器升级版)/JDialog(对话框)/JApplet(Java小应用程序);

         (2)组件:标签;文本框(密码框);按钮;下拉列表;单选;复选;文本域

容器类JFrame:

public class MyFrame extends JFrame{
	
  private Container contentP;//内容面板
	
  private JLabel msgLab;//文字标签
	
  private JLabel imgLab;//图片标签
	
  private JTextField usernameTxt;//文本框
	
  private JPasswordField pwdTxt;//密码框
	
  private JButton okBtn;//按钮
	
  private JButton getMoentyBtn;//取钱按钮
	
  private JComboBox<String> teacherCmb;//下拉列表
	
  private JTextArea selfArea;//文本域
	
  private JRadioButton maleRad;//单选框
	
  private JRadioButton femaleRad;
	
  private JCheckBox hobbitBox;//复选框
		
  public MyFrame(){
	Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
	int screenWidth = (int)tk.getScreenSize().getWidth();
	int screenHeight = (int)tk.getScreenSize().getHeight();
	this.setSize(500, 400);//设置窗体大小--像素
	this.setLocation((screenWidth-500)/2, (screenHeight-400)/2);//设置窗体的位置
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
	this.setTitle("我的第一个GUI窗体");//标题栏设置标题
	this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
	this.setResizable(false);//设置窗体改变大小的能力
	this.addContent();
	this.setVisible(true);//设置该窗体可见
  }
	
  private void addContent(){
	this.contentP = this.getContentPane();//获取内容面板
	this.contentP.setBackground(Color.WHITE);//设置窗体背景色
	this.contentP.setLayout(null);//设置布局管理器为null---代表放入该容器的组件的大小位置全靠自定义
		
	//文本标签
	this.msgLab = new JLabel("用户名:");//产生对象
	this.msgLab.setText("用户名:");
//	this.msgLab.setBorder(BorderFactory.createLineBorder(Color.BLACK));//给标签设置边框--调试用
	this.msgLab.setFont(new Font("微软雅黑",Font.BOLD,16));//设置字体
	this.msgLab.setForeground(new Color(82,254,211));//设置字体颜色
	this.msgLab.setBounds(100, 20, 80, 30);//设置大小位置
	this.contentP.add(this.msgLab);//放入容器
		
	//图片标签
	this.imgLab = new JLabel(new ImageIcon("image/fish.jpg"));
	this.imgLab.setBounds(200, 20, 243, 167);
	this.contentP.add(this.imgLab);
		
	//文本框
	this.usernameTxt = new JTextField();
	this.usernameTxt.setBounds(20, 70, 100, 30);
	this.usernameTxt.setFont(new Font("微软雅黑",Font.BOLD,16));//设置字体
	this.usernameTxt.setForeground(new Color(82,254,211));//设置字体颜色
//	this.usernameTxt.setEditable(false);//设置文本框不可编辑
	this.contentP.add(this.usernameTxt);
		
	//密码框
	this.pwdTxt = new JPasswordField();
	this.pwdTxt.setEchoChar(‘*‘);
	this.pwdTxt.setFont(new Font("微软雅黑",Font.BOLD,16));//设置字体
	this.pwdTxt.setForeground(new Color(82,254,211));//设置字体颜色
	this.pwdTxt.setBounds(20, 120, 100, 30);
	this.contentP.add(this.pwdTxt);
		
	//按钮
	this.okBtn = new JButton("确定");
	this.okBtn.setText("确定");
	this.okBtn.setFont(new Font("微软雅黑",Font.BOLD,16));//设置字体
	this.okBtn.setForeground(new Color(82,254,211));//设置字体颜色
	this.okBtn.setBounds(20, 160, 100, 30);
	this.contentP.add(this.okBtn);
		
	this.getMoentyBtn = new JButton(new ImageIcon("image/buttonGet.jpg"));
	this.getMoentyBtn.setBounds(20, 200, 140, 50);
	this.contentP.add(this.getMoentyBtn);
		
	//下拉列表
	this.teacherCmb = new JComboBox<String>();
	this.teacherCmb.addItem("周春艳");
	this.teacherCmb.addItem("刘弯弯");
	this.teacherCmb.addItem("万洁");
	this.teacherCmb.addItem("张欣");
	this.teacherCmb.addItem("何茹薇");
	this.teacherCmb.setEditable(true);//设置为可编辑为true
	this.teacherCmb.setBounds(20, 260, 100, 20);
	this.contentP.add(this.teacherCmb);
		
	//文本域
	this.selfArea = new JTextArea();
	JScrollPane scrollP = new JScrollPane(this.selfArea);
	scrollP.setBounds(200, 200, 280, 160);
	this.contentP.add(scrollP);
		
	//单选框
	this.maleRad = new JRadioButton("男");
	this.femaleRad = new JRadioButton("女");
	this.maleRad.setBounds(20, 290, 50, 25);
	this.femaleRad.setBounds(80, 290, 50, 25);
	this.maleRad.setBackground(Color.WHITE);
	this.femaleRad.setBackground(Color.WHITE);
	this.maleRad.setSelected(true);//设置默认选中
	this.contentP.add(this.maleRad);
	this.contentP.add(this.femaleRad);
	ButtonGroup bGroup = new ButtonGroup();//按钮分组
	bGroup.add(this.maleRad);
	bGroup.add(this.femaleRad);
		
	//复选框
	this.hobbitBox = new JCheckBox("兴趣爱好");
	this.hobbitBox.setBounds(20, 325, 100, 25);
	this.contentP.add(this.hobbitBox);
  }
	
}

public static void main(String[] args) {   // TODO Auto-generated method stub   //容器类JFrame   MyFrame frame = new MyFrame(); }

 

布局layut

  最常用的4种布局管理器:“只要使用布局管理器,任何自定义布局无法使用”

1.边界布局(应用最多):BorderFrame

  布局方式:把整个容器划分为5个部分:东西南北中,南北要贯通,中间最大(不仅是中间的范围最大,权利也最大“周边不存在的时候,中间会占领周边”),当中间不存在的时候周边也不能占领中间;

  使用场景:不是用来直接放组件的,而是用来放置子容器(中间容器)的;

public class BorderFrame extends JFrame {
	
  private Container contentP;//内容面板
	
  private JButton btn1;
  private JButton btn2;
  private JButton btn3;
  private JButton btn4;
  private JButton btn5;
	
  public BorderFrame(){
	Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
	int screenWidth = (int)tk.getScreenSize().getWidth();
	int screenHeight = (int)tk.getScreenSize().getHeight();
	this.setSize(500, 400);//设置窗体大小--像素
	this.setLocation((screenWidth-500)/2, (screenHeight-400)/2);//设置窗体的位置
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
	this.setTitle("我的第一个GUI窗体");//标题栏设置标题
	this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
	this.setResizable(false);//设置窗体改变大小的能力
	this.addContent();
	this.setVisible(true);//设置该窗体可见
  }
	
	
  private void addContent(){
	this.contentP = this.getContentPane();//获取内容面板
	this.contentP.setBackground(Color.WHITE);//设置窗体背景色
	this.contentP.setLayout(new BorderLayout());//设置布局管理器为边界布局管理器---在默认的情况下,JFrame的内容面板就是边界布局
		
	this.btn1 = new JButton("button1");
	this.btn2 = new JButton("button2");
	this.btn3 = new JButton("button3");
	this.btn3.setFont(new Font("宋体",Font.BOLD,28));
	this.btn4 = new JButton("button4");
	this.btn5 = new JButton("button5button5");
	this.contentP.add(this.btn1);//直接add就是默认往中间放
	this.contentP.add(BorderLayout.NORTH, this.btn2);
	this.contentP.add(BorderLayout.SOUTH,this.btn3);
	this.contentP.add(BorderLayout.EAST,this.btn4);
	this.contentP.add(BorderLayout.WEST,this.btn5);
		
  }
}

public static void main(String[] args) {
  // TODO Auto-generated method stub

  BorderFrame bframe = new BorderFrame();
}

 

 

2.流布局:FlowFrame

  布局方式:按从左往右,从上往下,由中间开始的方式依次排放组件;

       组件大小要根据组件内容那个确定;

       组件的位置随着容器大小的改变而改变;

 

  使用场景:流布局是用来放置组件的,而不是用来放中间容器的;最好只做单行布局; 

public class FlowFrame extends JFrame {
  private Container contentP;//内容面板
	
  private JButton btn1;
  private JButton btn2;
  private JButton btn3;
  private JButton btn4;
  private JButton btn5;
  private JTextField inputTxt;
	
  public FlowFrame(){
	Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
	int screenWidth = (int)tk.getScreenSize().getWidth();
	int screenHeight = (int)tk.getScreenSize().getHeight();
	this.setSize(500, 400);//设置窗体大小--像素
	this.setLocation((screenWidth-500)/2, (screenHeight-400)/2);//设置窗体的位置
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
	this.setTitle("我的第一个GUI窗体");//标题栏设置标题
	this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
	this.setResizable(true);//设置窗体改变大小的能力
	this.addContent();
	this.setVisible(true);//设置该窗体可见
  }
  private void addContent(){ this.contentP = this.getContentPane();//获取内容面板 this.contentP.setBackground(Color.WHITE);//设置窗体背景色 this.contentP.setLayout(new FlowLayout());//设置布局管理器为流布局管理器 this.btn1 = new JButton("button1"); this.btn2 = new JButton("button2"); this.btn3 = new JButton("button3"); this.btn3.setFont(new Font("宋体",Font.BOLD,28)); this.btn4 = new JButton("button4"); this.btn5 = new JButton("button5button5"); this.inputTxt = new JTextField(); this.inputTxt.setColumns(10); this.add(this.btn1); this.add(this.btn2); this.add(this.btn3); this.add(this.btn4); this.add(this.btn5); this.add(this.inputTxt);   } }
public static void main(String[] args) {
  // TODO Auto-generated method stub
  FlowFrame fFrame = new FlowFrame();
}

 

 

3.网格布局:GridFrame:

  布局方式:按行列将整个容器划分为等大的区域,放入的子容器的数目如果与设置的数目不等,优先保证行改变列

  使用场景:不是用来放置组件的,而是用来放置容器(中间容器)的。

 

       使用场景:不是用来放置组件的,而是用来放置容器(中间容器)的。

public class GridFrame extends JFrame {
	private Container contentP;//内容面板
	
	private JButton btn1;
	private JButton btn2;
	private JButton btn3;
	private JButton btn4;
	private JButton btn5;
	
  public GridFrame(){ Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象 int screenWidth = (int)tk.getScreenSize().getWidth(); int screenHeight = (int)tk.getScreenSize().getHeight(); this.setSize(500, 400);//设置窗体大小--像素 this.setLocation((screenWidth-500)/2, (screenHeight-400)/2);//设置窗体的位置 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序 this.setTitle("我的第一个GUI窗体");//标题栏设置标题 this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标 this.setResizable(false);//设置窗体改变大小的能力 this.addContent(); this.setVisible(true);//设置该窗体可见   }   private void addContent(){ this.contentP = this.getContentPane();//获取内容面板 this.contentP.setBackground(Color.WHITE);//设置窗体背景色 this.contentP.setLayout(new GridLayout(2,3));//设置布局管理器为网格布局管理器 this.btn1 = new JButton("button1"); this.btn2 = new JButton("button2"); this.btn3 = new JButton("button3"); this.btn3.setFont(new Font("宋体",Font.BOLD,28)); this.btn4 = new JButton("button4"); this.btn5 = new JButton("button5"); this.contentP.add(this.btn1); this.contentP.add(this.btn2); this.contentP.add(this.btn3); this.contentP.add(this.btn4); this.contentP.add(this.btn5);   } }

public static void main(String[] args) {
  // TODO Auto-generated method stub
  GridFrame gFrame = new GridFrame();
}

 

面板类JPand:面板嵌套


1.定义内容面板:设置分割框体:

public class GameFrame extends JFrame {
	
  private Container contentP;
	
  private UpPanel upP;
	
  private MidPanel midP;   private DownPanel dnP;   public GameFrame(){ Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象 int screenWidth = (int)tk.getScreenSize().getWidth(); int screenHeight = (int)tk.getScreenSize().getHeight(); this.setSize(300, 300);//设置窗体大小--像素 this.setLocation((screenWidth-300)/2, (screenHeight-300)/2);//设置窗体的位置 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序 this.setTitle("猜数字游戏");//标题栏设置标题 this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标 this.setResizable(false);//设置窗体改变大小的能力 this.addContent(); this.setVisible(true);//设置该窗体可见   }   private void addContent() { // TODO Auto-generated method stub this.contentP = this.getContentPane(); this.contentP.setLayout(new GridLayout(3,1));//用网格布局划分框体 this.upP = new UpPanel(); this.midP = new MidPanel(); this.dnP = new DownPanel(this); this.contentP.add(this.upP); this.contentP.add(this.midP); this.contentP.add(this.dnP); }   public Container getContentP() { return contentP;   }   public void setContentP(Container contentP) { this.contentP = contentP;   }   public UpPanel getUpP() { return upP;   }   public void setUpP(UpPanel upP) { this.upP = upP;   }   public MidPanel getMidP() { return midP;   }   public void setMidP(MidPanel midP) { this.midP = midP;   }   public DownPanel getDnP() { return dnP;   }   public void setDnP(DownPanel dnP) { this.dnP = dnP;   } }

2.先设置布局上框架:

public class UpPanel extends JPanel {
	
  private JTextField inputTxt;//设置文本框
	
  public UpPanel() {
	// TODO Auto-generated constructor stub
	this.setBackground(Color.LIGHT_GRAY);
	this.setLayout(new FlowLayout());//JPanel默认的布局管理器就是流布局
	this.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Your Guess"));
     //(Color.BLACK):边框颜色, "Your Guess":设置边框文字
this.inputTxt = new JTextField(); this.inputTxt.setColumns(10); this.add(this.inputTxt);   }   public JTextField getInputTxt() { return inputTxt;   }   public void setInputTxt(JTextField inputTxt) { this.inputTxt = inputTxt;   } }

3.设置中间框架:

public class MidPanel extends JPanel {
	
  private JLabel msgLab;
	
  public MidPanel() {
	// TODO Auto-generated constructor stub
	this.setBackground(Color.LIGHT_GRAY);
	this.setLayout(null);
	this.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLACK), "Hint"));
		
	this.msgLab = new JLabel("Let‘s Play HiLo");
	this.msgLab.setBounds(100, 30, 100, 30);
	this.add(this.msgLab);
  }

  public JLabel getMsgLab() {
	return msgLab;
  }

  public void setMsgLab(JLabel msgLab) {
	this.msgLab = msgLab;
  }

4.设置下部框体:

4-1.先设置边界布局:并设置按钮

public class DownPanel extends JPanel {
	
  private ButtonPanel btnP;//设置按钮
	
  public DownPanel(GameFrame gm) {
	// TODO Auto-generated constructor stub
	this.setBackground(Color.LIGHT_GRAY);
	this.setLayout(new BorderLayout());
		
	this.btnP = new ButtonPanel(gm);
	this.add(BorderLayout.SOUTH,this.btnP);
  }

  public ButtonPanel getBtnP() {
	return btnP;
  }

  public void setBtnP(ButtonPanel btnP) {
	this.btnP = btnP;
  }
}

4-2.按钮设置

public class ButtonPanel extends JPanel {
	
  private JButton enterBtn;
	
  private JButton cancelBtn;
		
	this.setBackground(Color.LIGHT_GRAY);
	this.enterBtn = new JButton("确定");
	this.cancelBtn = new JButton("取消");
		
	this.add(this.enterBtn);
	this.add(this.cancelBtn);
		
	this.enterBtn.addActionListener(new ActionListener(){

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			//首先获取文本框中的输入
			//做输入有效性校验---正则
			//校验通过,转换为整数,再和随机数比较
			//然后根据比较结果,修改标签的显示信息
				
				
		}
			
	});
  }

  public JButton getEnterBtn() { return enterBtn;   }   public void setEnterBtn(JButton enterBtn) { this.enterBtn = enterBtn;   }   public JButton getCancelBtn() { return cancelBtn;   }   public void setCancelBtn(JButton cancelBtn) { this.cancelBtn = cancelBtn;   } }
public static void main(String[] args) {
	// TODO Auto-generated method stub
	GameFrame game = new GameFrame();
}

 

事件处理:

  事件:按钮——事件源对象

  委托事件模型:(1)事件源:——绑定关系——2)监听器对象:     

    一个监听器可以绑定多个事件源;一个事件源可以绑定多个监听器;监听器有各自的监听事件类型;

 

  步骤:1.写好界面,事件源对象已经有了;

     2.选择合适的监听器类型;

     3.书写监听器的实现类(写好处理代码);

     4.产生监听器对象和事件源对象进行绑定;

 

    Event + Listrener:事件源监听器接口:Action(动作)

  监听器实现方式一:

    单独书写一个类,实现监听器接口。

    特点:1.可以让一个监听器类监听多个事件源,用if判断进行分割;但这么做违背了单一职责、因此从设计上每一个事件源书写单独的监听器类。

       2.如果需要操作费时间远的其它组件,只能传参。

  监听器实现方式二:

    让容器类充当监听器。

    特点:1.只能让一个监听器类监听多个事件源,用if判断进行分割;铁定违背单一职责。

       2.操作本容器的组件或中间容器,不用传参;

  监听器实现方式三:

    匿名内部类——在跟事件源对象绑定监听器对象的同时,实现监听器类。

    特点:1.每个事件源对象拥有独立的监听器类,同时没有多的java文件。即满足单一,又没有增加文件量。

       2.操作外部容器类的任何组件或子容器不用传参。

public class ColorFrame extends JFrame{	
	private Container contentP;
	
	private JButton redBtn;
	
	private JButton greenBtn;
	
	public ColorFrame(){
		Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
		int screenWidth = (int)tk.getScreenSize().getWidth();
		int screenHeight = (int)tk.getScreenSize().getHeight();
		this.setSize(300, 300);//设置窗体大小--像素
		this.setLocation((screenWidth-300)/2, (screenHeight-300)/2);//设置窗体的位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
		this.setTitle("我的第一个GUI窗体");//标题栏设置标题
		this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
		this.setResizable(false);//设置窗体改变大小的能力
		this.addContent();
		this.setVisible(true);//设置该窗体可见
	}

	private void addContent() {
		// TODO Auto-generated method stub
		this.contentP = this.getContentPane();
		this.contentP.setBackground(Color.WHITE);
		this.contentP.setLayout(new FlowLayout());
		
		//事件源对象
		this.redBtn = new JButton("红色");
		this.redBtn.setActionCommand("red");
		this.greenBtn = new JButton("绿色");
		this.greenBtn.setActionCommand("green");
				
		this.redBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				ColorFrame.this.contentP.setBackground(Color.RED);
				ColorFrame.this.redBtn.setEnabled(false);
				ColorFrame.this.greenBtn.setEnabled(true);
			}
		});
		
		this.greenBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				ColorFrame.this.contentP.setBackground(Color.GREEN);
				ColorFrame.this.redBtn.setEnabled(true);
				ColorFrame.this.greenBtn.setEnabled(false);
			}
		});
		
		
		this.contentP.add(this.redBtn);
		this.contentP.add(this.greenBtn);
	}	
}

读取文件:

public class LoginFrame extends JFrame {
	
	private Container contentP;
	
	private JLabel nameLab;
	
	private JLabel pwdLab;
	
	private JTextField nameTxt;
	
	private JPasswordField pwdTxt;
	
	private JButton loginBtn;
	
	private Properties props;
	
	public LoginFrame() {
		// TODO Auto-generated constructor stub
		Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
		int screenWidth = (int)tk.getScreenSize().getWidth();
		int screenHeight = (int)tk.getScreenSize().getHeight();
		this.setSize(300, 300);//设置窗体大小--像素
		this.setLocation((screenWidth-300)/2, (screenHeight-300)/2);//设置窗体的位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
		this.setTitle("用户登录");//标题栏设置标题
		this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
		this.setResizable(false);//设置窗体改变大小的能力
		this.addContent();
		this.setVisible(true);//设置该窗体可见
		
		this.props = new Properties();
		try {
			props.load(new FileInputStream("user.properties"));
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

	private void addContent() {
		// TODO Auto-generated method stub
		this.contentP = this.getContentPane();
		this.contentP.setBackground(Color.WHITE);
		this.contentP.setLayout(null);
		
		this.nameLab = new JLabel("用户名:");
		this.nameLab.setBounds(20, 20, 80, 30);
		this.contentP.add(this.nameLab);
		
		this.pwdLab = new JLabel("密     码:");
		this.pwdLab.setBounds(20, 70, 80, 30);
		this.contentP.add(this.pwdLab);
		
		this.nameTxt = new JTextField();
		this.nameTxt.setBounds(110, 25, 100, 20);
		this.contentP.add(this.nameTxt);
		
		this.pwdTxt = new JPasswordField();
		this.pwdTxt.setBounds(110, 75, 100, 20);
		this.contentP.add(this.pwdTxt);
		
		this.loginBtn = new JButton("登录");
		this.loginBtn.setBounds(160, 110, 80, 25);
		this.contentP.add(this.loginBtn);
		
		this.loginBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String inputName = LoginFrame.this.nameTxt.getText();
				String password = new String(LoginFrame.this.pwdTxt.getPassword());
				
				if(inputName.equals(props.getProperty("username")) && password.equals(props.getProperty("password"))){
					JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!");
				}else{
					JOptionPane.showMessageDialog(LoginFrame.this, "登录失败!");
				}
				
				LoginFrame.this.nameTxt.setText("");
				LoginFrame.this.pwdTxt.setText("");
				LoginFrame.this.nameTxt.requestFocus();
				
			}
		});
	}

 

4.卡片布局(最实用“事件处理用”):布局管理器最后一种,也是最常用种;

  整个翻页: 内容面板 设置为 卡片布局

 

  布局翻页: JPael 设置为 卡片布局

  4-1.设置内容面板:

public class CardFrame extends JFrame{
	
	private Container contentP;
	
	private SeasonPanel seaP;//设置卡片布局管理器
	
	private ButtonPanel btnP;//设置布局器管理器的步骤
	
	public CardFrame(){
		Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
		int screenWidth = (int)tk.getScreenSize().getWidth();
		int screenHeight = (int)tk.getScreenSize().getHeight();
		this.setSize(300, 300);//设置窗体大小--像素
		this.setLocation((screenWidth-300)/2, (screenHeight-300)/2);//设置窗体的位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
		this.setTitle("卡片布局管理");//标题栏设置标题
		this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
		this.setResizable(false);//设置窗体改变大小的能力
		this.addContent();
		this.setVisible(true);//设置该窗体可见
	}

	private void addContent() {
		// TODO Auto-generated method stub
		this.contentP = this.getContentPane();
		this.contentP.setLayout(new BorderLayout());
		
		this.seaP = new SeasonPanel();
		this.btnP = new ButtonPanel(this);
		
		this.contentP.add(BorderLayout.CENTER,this.seaP);
		this.contentP.add(BorderLayout.SOUTH,this.btnP);
	}

	public SeasonPanel getSeaP() {
		return seaP;
	}

	public void setSeaP(SeasonPanel seaP) {
		this.seaP = seaP;
	}

	public ButtonPanel getBtnP() {
		return btnP;
	}

	public void setBtnP(ButtonPanel btnP) {
		this.btnP = btnP;
	}
}

  4-2.设置卡片管理布局器

public class SeasonPanel extends JPanel {
	
	private SpringPanel sprP;//设置颜色或添加相片
	
	private SummerPanel sumP;//设置颜色或添加相片
private AutumnPanel autP;//设置颜色或添加相片
private WinterPanel winP;//设置颜色或添加相片
public SeasonPanel(){ this.setBackground(Color.BLACK); this.setLayout(new CardLayout());//设置卡片布局管理器 this.sprP = new SpringPanel(); this.sumP = new SummerPanel(); this.autP = new AutumnPanel(); this.winP = new WinterPanel(); //第一个被放入的卡片在最上面 //每张卡片放入的时候要给出别名 this.add("spring", this.sprP); this.add("summer", this.sumP); this.add("autumn", this.autP); this.add("winter", this.winP); } public SpringPanel getSprP() { return sprP; } public void setSprP(SpringPanel sprP) { this.sprP = sprP; } public SummerPanel getSumP() { return sumP; } public void setSumP(SummerPanel sumP) { this.sumP = sumP; } public AutumnPanel getAutP() { return autP; } public void setAutP(AutumnPanel autP) { this.autP = autP; } public WinterPanel getWinP() { return winP; } public void setWinP(WinterPanel winP) { this.winP = winP; } }

  4-2-1.设置颜色或添加图片

public class SpringPanel extends JPanel {
	
	public SpringPanel(){
		this.setBackground(Color.GREEN);
	}
	
}

public class SummerPanel extends JPanel{
	
	public SummerPanel(){
		this.setBackground(Color.RED);
	}
	
}

public class AutumnPanel extends JPanel {
	
	public AutumnPanel(){
		this.setBackground(Color.ORANGE);
	}
	
}

public class WinterPanel extends JPanel {
	
	public WinterPanel(){
		this.setBackground(Color.LIGHT_GRAY);
	}
	
}

  4-3.设置卡片管理布局器步骤

public class ButtonPanel extends JPanel {
	
	private JButton firstBtn;
	
	private JButton lastBtn;
	
	private JButton nextBtn;
	
	private JButton preBtn;
	
	private JButton sumBtn;
	
	private CardFrame cardF;
	
	public ButtonPanel(CardFrame cardF) {
		// TODO Auto-generated constructor stub
		this.cardF = cardF;
		
		this.setBackground(Color.WHITE);
		this.setLayout(new FlowLayout());
		
		this.firstBtn = new JButton("|<");
		this.firstBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//翻页步骤:1、首先得到被设置为卡片布局的那个容器
				SeasonPanel sp = ButtonPanel.this.cardF.getSeaP();
				//2、得到这个容器的布局管理器
				CardLayout card = (CardLayout)sp.getLayout();
				//3、调用该布局管理器翻页
				card.first(sp);
			}
		});
			
		this.preBtn = new JButton("<<");
		this.preBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//翻页步骤:1、首先得到被设置为卡片布局的那个容器
				SeasonPanel sp = ButtonPanel.this.cardF.getSeaP();
				//2、得到这个容器的布局管理器
				CardLayout card = (CardLayout)sp.getLayout();
				//3、调用该布局管理器翻页
				card.previous(sp);
			}
		});
				
		this.nextBtn = new JButton(">>");
		this.nextBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//翻页步骤:1、首先得到被设置为卡片布局的那个容器
				SeasonPanel sp = ButtonPanel.this.cardF.getSeaP();
				//2、得到这个容器的布局管理器
				CardLayout card = (CardLayout)sp.getLayout();
				//3、调用该布局管理器翻页
				card.next(sp);
			}
		});
			
		this.lastBtn = new JButton(">|");
		this.lastBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//翻页步骤:1、首先得到被设置为卡片布局的那个容器
				SeasonPanel sp = ButtonPanel.this.cardF.getSeaP();
				//2、得到这个容器的布局管理器
				CardLayout card = (CardLayout)sp.getLayout();
				//3、调用该布局管理器翻页
				card.last(sp);
			}
		});
		
		this.sumBtn = new JButton("夏天");
		this.sumBtn.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//翻页步骤:1、首先得到被设置为卡片布局的那个容器
				SeasonPanel sp = ButtonPanel.this.cardF.getSeaP();
				//2、得到这个容器的布局管理器
				CardLayout card = (CardLayout)sp.getLayout();
				//3、调用该布局管理器翻页
				card.show(sp, "summer");
			}
		});
		
		this.add(this.firstBtn);
		this.add(this.preBtn);
		this.add(this.nextBtn);
		this.add(this.lastBtn);
		this.add(this.sumBtn);
	}
}

 设置背景:

public class CardFrame2 extends JFrame {
	
	private Container contentP;
	
	private JLabel backLab;
	
	private JButton okBtn;
	
	public CardFrame2(){
		Toolkit tk = Toolkit.getDefaultToolkit();//获取工具对象
		int screenWidth = (int)tk.getScreenSize().getWidth();
		int screenHeight = (int)tk.getScreenSize().getHeight();
		this.setSize(600, 428);//设置窗体大小--像素;大小要与背景图片一样并且加上标题框高度+28
		this.setLocation((screenWidth-600)/2, (screenHeight-428)/2);//设置窗体的位置
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭即退出程序
		this.setTitle("背景图片问题");//标题栏设置标题
		this.setIconImage(tk.createImage("image/icon.png"));//设置标题栏图标
		this.setResizable(false);//设置窗体改变大小的能力
		this.addContent();
		this.setVisible(true);//设置该窗体可见
	}

	private void addContent() {
		// TODO Auto-generated method stub
		this.contentP = this.getContentPane();
		this.contentP.setLayout(new BorderLayout());		
		this.backLab = new JLabel(new ImageIcon("background.jpg"));
		this.contentP.add(this.backLab);
		
		this.backLab.setLayout(null);
		
		this.okBtn = new JButton("确定");
		this.okBtn.setBounds(200,50, 80, 30);
		this.backLab.add(this.okBtn);
		
	}
}

  

以上是关于javafx窗体面板位置的主要内容,如果未能解决你的问题,请参考以下文章

javafx如何在同一个面板界面切换

javaFX学习 面板手册--1

JavaFX - 分页:如何隐藏底部(控制)面板并用页面占据其区域?

javafx中如何给面板添加背景图片例如BorderPane

调整面板大小以适应 Windows 窗体中包含的元素

在 Windows 窗体 c# 中绘制动态面板