前两个int 是矩形组件左上角那个点在容器中的坐标。后两个int 是矩形组件的宽度和高度。
setBounds
public void setBounds(int x,int y,int width,int height)移动组件并调整其大小。由 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
参数:
x - 组件的新 x 坐标。
y - 组件的新 y 坐标。
width - 组件的新 width。
height - 组件的新 heigh。
扩展资料:
首部 function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect; $[Types.pas。
功能 返回左、上位置以及宽度、高度相应的矩形区域。
说明 <NULL>。
参考 <NULL>。
例子 Bevel1.BoundsRect := Bounds(SpinEdit1.Value, SpinEdit2.Value, SpinEdit3.Value, SpinEdit4.Value);。
例子 setBounds(100,200,500,600);。
是在屏幕左上角的焦点为0坐标,向右移动100个像素,向下移动200个像素,对话框宽。
为500个像素,高为600个像素。
参考资料来源:百度百科-Bounds。
setBounds(int x, int y, int width, int height)。
前两个是组件左上角在容器中的坐标。
后两个是组件的宽度和高度
参数:
x - 组件的新 x 坐标
y - 组件的新 y 坐标
width - 组件的新 width。
height - 组件的新 height。
扩展资料:
INT函数将返回实数向下取整后的整数值。它的语法格式为INT (number),其中的number是需要进行取整的实数。例如INT( 8.6)的返回值为8,而INT(-8.6)的返回值为-9。TRUNC函数是将数字的小数部分截去,返回数字的整数部分。
语法格式为TRUNC(number,number_digits),其中number为需要截尾取整的数字,number_digits为指定取整精度的数字,默认为0。例如函数TRUNC(8.5)的返回值是8,而TRUNC(-8.5)的返回值为-8。
参考资料来源:百度百科-INT()函数。
在iOS开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤其是bound很绕,很难理解。
一、首先,看一下公认的资料
先看到下面的代码你肯定就明白了一些:
-(CGRect)frame{。
return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);。
-(CGRect)bounds{。
return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);。
很明显,bounds的原点是(0,0)点(就是view本身的坐标系统,默认永远都是0,0点,除非调用了setbounds函数),而frame的原点却是任意的(相对于父视图中的坐标位置)。
二、再看一下斯坦福iOS教程视频中的图片。
翻译如下:
frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)
bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
center:该view的中心点在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)
三、下面阐述一下frame和bound的区别。
frame就容易理解一些:frame的(frame.origin.x,frame.origin.y)就是相对于父坐标系的偏移量。
bounds稍微有点费解,稍不留神,想的多了,就会绕进去。每个view都有一个本地坐标系统。这个坐标系统作用比较重要,比如触摸的回调函数中的 UITouch里面的>坐标值都是参照这个本地坐标系统的坐标。当然bounds这个属性也是参照这个本地坐标系统来的。
其实本地坐标系统的关键就是要知道的它的原点(0,0)在什么位置(这个位置又是相对于上层的view的本地坐标系统而言的,最上层view就是 window它的本地坐标系统原点就是屏幕的左上角了)。
通过修改view的bounds属性可以修改本地坐标系统的原点位置。
所以,bounds的有这么一个特点:
它是参考自己坐标系,它可以修改自己坐标系的原点位置,进而影响到“子view”的显示位置。
四、demo论证
10
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];。
[view1 setBounds:CGRectMake(-30, -30, 200, 200)];。
view1.backgroundColor = [UIColor redColor];。
[self.view addSubview:view1];//添加到self.view。
NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));。
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];。
view2.backgroundColor = [UIColor yellowColor];。
[view1 addSubview:view2];//添加到view1上,[此时view1坐标系左上角起点为(-30,-30)]。
NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));。
这段代码没什么特别的地方。view1加入view中,view2加入view1中。代码第二行,对view1进行了setBounds设置。注释和打开这行代码的效果如图:
[view1 setBounds:CGRectMake(-30, -30,200,200)];。
这行代码起到了:让view2的位置改变的作用。为何(-30,-30)的偏移量,却可以让view2向右下角移动呢?
这是因为setBounds的作用是:强制将自己(view1)坐标系的左上角点,改为(-30,-30)。那么view1的原点,自然就向在右下方偏移(30,30)。
上面代码控制台输出如下:
20140924132839203.jpg。
(log输出日志表明,每个新的view默认的bounds其实都是(0,0),且bounds的width和height都是跟frame一致)。
事情还没完
上面代码中view和bounds的大小都是一样的。如果view的frame和bounds不是一样大小,又会如何呢?
就上面的代码段,将view1的bounds改大!例如:
[view1 setBounds:CGRectMake(-30, -30, 250, 250)];。
20140924135352969.jpg。
log显示:view1的frame已经被修改了。这是因为setBounds的问题。
frame定义了一个相对父视图的一个框架(容器),bounds则是真实显示区域。如果,bounds比frame小了,可以放到框架(容器)里。如果bounds比frame大,感觉frame被“撑大”了。frame变成了{{25, 25}, {250, 250}}了。25是如何得出的?bounds比frame长,宽各大了50像素,那么四条边平衡一下,各溢出“25”像素。
五、结论
bounds的有以下两个特点:
1. 它可以修改自己坐标系的原点位置,进而影想到“子view”的显示位置。这个作用更像是移动原点的意思。
2. bounds,它可以改变的frame。如果bounds比frame大。那么frame也会跟着变大。这个作用更像边界和大小的意思。
可以推测一下,setBound第一个特性可以用于view的滑动,手势动作。第二个特性如何使用呢?从网上找到一个案例:可以将下图中cell拉伸:
代码如下,重写cell的layoutSubviews方法即可:
// MyCustomUITableViewCell.h。
- (void)layoutSubviews。
self.bounds = CGRectMake(self.bounds.origin.x,。
self.bounds.origin.y,。
self.bounds.size.width - 50,。
self.bounds.size.height);。
[super layoutSubviews];。
// jp1.setLayout(null);//将两个面板的布局管理器都设为空。
// jp2.setLayout(null);。
屏蔽这两行就可以了
这是我的界面
package client;。
import java.awt.Color;。
import java.awt.Dimension;。
import java.awt.Font;。
import java.awt.Toolkit;。
import java.awt.event.ActionEvent;。
import java.awt.event.ActionListener;。
import javax.swing.ButtonGroup;。
import javax.swing.ImageIcon;。
import javax.swing.JButton;。
import javax.swing.JFrame;。
import javax.swing.JLabel;。
import javax.swing.JOptionPane;。
import javax.swing.JPanel;。
import javax.swing.JPasswordField;。
import javax.swing.JRadioButton;。
import javax.swing.JTextField;。
public class Register extends JFrame implements ActionListener。
/**
*
*/
private static final long serialVersionUID = 4257580101437991396L;。
JPanel pnlRegister;。
JLabel lblUserName,lblGender,lblAge,img1,img2;。
JLabel lblPassword,lblConfirmPass,logoPosition;。
JTextField txtUserName,txtAge;。
JPasswordField pwdUserPassword,pwdConfirmPass;。
JRadioButton rbtnMale,rbtnFemale;。
ButtonGroup btngGender;。
JButton btnOk,btnCancel,btnClear;。
String strServerIp;。
//用于将窗口用于定位。
Dimension scrnsize;。
Toolkit toolkit=Toolkit.getDefaultToolkit();。
//构造方法
public Register(String ip)。
{
super("帐号注册");。
strServerIp=ip;。
pnlRegister=new JPanel();。
this.getContentPane().add(pnlRegister);。
lblUserName=new JLabel("用 户 名:");。
lblGender=new JLabel("性 别:");。
lblAge=new JLabel("年 龄:");。
lblPassword=new JLabel("密 码:");。
lblConfirmPass=new JLabel("确认密码:");。
txtUserName=new JTextField(30);。
txtAge=new JTextField(10);。
pwdUserPassword=new JPasswordField(30);。
pwdUserPassword.setEchoChar('*');。
pwdConfirmPass=new JPasswordField(30);。
pwdConfirmPass.setEchoChar('*');。
rbtnMale=new JRadioButton("男",true);。
rbtnFemale=new JRadioButton("女");。
btngGender=new ButtonGroup();。
btnOk=new JButton("确定(O)");。
btnOk.setMnemonic('O');。
btnOk.setToolTipText("保存注册信息");。
btnCancel=new JButton("返回(B)");。
btnCancel.setMnemonic('B');。
btnCancel.setToolTipText("返回登录窗口");。
btnClear=new JButton("清空(L)");。
btnClear.setMnemonic('L');。
btnClear.setToolTipText("清空注册信息");。
/* 该布局采用手动布局 *。
* setBounds设置组件位置 *。
* setFont设置字体、字型、字号 *。
* setForeground设置文字的颜色 *。
* setBackground设置背景色 *。
* setOpaque将背景设置为透明 */。
pnlRegister.setLayout(null); //组件用手动布局。
pnlRegister.setBackground(new Color(180,210,250));。
lblUserName.setBounds(30,70,120,30);。
txtUserName.setBounds(110,75,120,20);。
lblPassword.setBounds(30,95,100,30);。
pwdUserPassword.setBounds(110,100,120,20);。
lblConfirmPass.setBounds(30,120,100,30);。
pwdConfirmPass.setBounds(110,125,120,20);。
lblGender.setBounds(30,145,100,30);。
rbtnMale.setBounds(110,150,60,20);。
rbtnFemale.setBounds(190,150,60,20);。
lblAge.setBounds(30,170,100,30);。
txtAge.setBounds(110,175,120,20);。
btnOk.setBounds(10,210,80,25); 。
btnClear.setBounds(130,210,80,25);。
btnCancel.setBounds(245,210,80,25);。
Font fontstr=new Font("宋体",Font.PLAIN,12); 。
lblUserName.setFont(fontstr);。
lblGender.setFont(fontstr);。
lblPassword.setFont(fontstr);。
lblConfirmPass.setFont(fontstr);。
lblAge.setFont(fontstr);。
rbtnMale.setFont(fontstr);。
rbtnFemale.setFont(fontstr);。
txtUserName.setFont(fontstr);。
btnOk.setFont(fontstr);。
btnCancel.setFont(fontstr);。
btnClear.setFont(fontstr);。
lblUserName.setForeground(Color.BLACK);。
lblGender.setForeground(Color.BLACK);。
lblPassword.setForeground(Color.BLACK);。
lblAge.setForeground(Color.BLACK);。
lblConfirmPass .setForeground(Color.BLACK);。
rbtnMale.setForeground(Color.BLACK);。
rbtnFemale.setForeground(Color.BLACK);。
rbtnMale.setBackground(Color.white);。
rbtnFemale.setBackground(Color.white); 。
rbtnMale.setOpaque(false); 。
rbtnFemale.setOpaque(false);。
pnlRegister.add(lblUserName);。
pnlRegister.add(lblGender);。
pnlRegister.add(lblPassword);。
pnlRegister.add(lblConfirmPass);。
pnlRegister.add(lblAge);。
pnlRegister.add(txtAge);。
pnlRegister.add(txtUserName);。
pnlRegister.add(pwdUserPassword);。
pnlRegister.add(pwdConfirmPass);。
pnlRegister.add(btnOk);。
pnlRegister.add(btnCancel);。
pnlRegister.add(btnClear);。
pnlRegister.add(rbtnMale);。
pnlRegister.add(rbtnFemale);。
btngGender.add(rbtnMale);。
btngGender.add(rbtnFemale);。
//设置背景图片
ImageIcon icon1 = new ImageIcon(this.getClass().getResource("/icons/3.png"));。
img1=new JLabel(icon1);。
pnlRegister.add(img1);。
img1.setBounds(0, -20,340, 96); 。
ImageIcon icon2 = new ImageIcon(this.getClass().getResource("/icons/4.png"));。
img2=new JLabel(icon2);。
pnlRegister.add(img2);。
img2.setBounds(185, 90,200, 106); 。
this.setSize(340,270);。
this.setVisible(true);。
this.setResizable(false);。
this.setDefaultCloseOperation(EXIT_ON_CLOSE);。
//将窗口定位在屏幕中央
scrnsize=toolkit.getScreenSize();。
this.setLocation(scrnsize.width/2-this.getWidth()/2,。
scrnsize.height/2-this.getHeight()/2);。
//三个按钮注册监听
btnOk .addActionListener(this);。
btnCancel.addActionListener(this);。
btnClear .addActionListener(this);。
} //构造方法结束
class Register_Customer extends Object implements java.io.Serializable。
{
/**
*
*/
private static final long serialVersionUID = 6843334615403912646L;。
String custName;。
String custPassword;。
String age;。
String sex;。
String email;。
}
//按钮监听响应
public void actionPerformed(ActionEvent ae)。
{
Object source=new Object();。
source=ae.getSource();。
if (source.equals(btnOk)) //"确定"按钮。
{
register();。
}
if (source.equals(btnCancel)) //"返回"按钮。
{
new Login();。
//this.dispose();。
}
if (source.equals(btnClear)) //"清空"按钮。
{
txtUserName.setText("");。
pwdUserPassword.setText("");。
pwdConfirmPass.setText("");。
txtAge.setText("");。
}
} //actionPerformed()结束。
//////////"确定"按钮事件响应//////////。
public void register()。
{
//接受客户的详细资料
String custName = txtUserName.getText();。
String custPassword = pwdUserPassword.getText();。
String age = txtAge.getText();。
String sex = rbtnMale.isSelected()?"男":"女";。
//验证用户名是否为空
if(custName.length()==0)。
{
JOptionPane.showMessageDialog(null,"用户名不能为空"); 。
return; 。
}
//验证密码是否为空
if(custPassword.length()==0)。
{
JOptionPane.showMessageDialog(null,"密码不能为空"); 。
return; 。
}
//验证密码的一致性
if(!custPassword.equals(pwdConfirmPass.getText()))。
{
JOptionPane.showMessageDialog(null,"密码两次输入不一致,请重新输入"); 。
return;。
}
//验证年龄是否为空
if(age.length()==0)。
{
JOptionPane.showMessageDialog(null,"年龄不能为空"); 。
return; 。
}
//验证年龄的合法性
int age1=Integer.parseInt(txtAge.getText());。
if (age1<=0||age1>100){。
JOptionPane.showMessageDialog(null,"年龄输入不合法");。
return;
}
}
public static void main(String args[])。
{
new Register("127.0.0.1");。
}
} //class Register 结束。