前言:
java swing是用于gui设计的,虽然现在有了很多的替代品,但学习swing可以打下一个好的基础
大致框架如下:
JFrame 窗体:
import javax.swing.*;
public class test {
public test(){
JFrame xx=new JFrame("hello world ");//构造方法,可以设计标题,也可不填
xx.setBounds(100,100,500,300);//设置窗体在屏幕中的位置第一个是x坐标,第二个是y坐标,第三个是宽,第四个是高
xx.setVisible(true);//窗体可见
}
public static void main(String[] args) {
new test();
}
}
我们虽然知道了setBounds可以设定文本框的位置,但x,y究竟是规定的我们并不知道,那么看下图
setBounds设置的坐标是指文本框左上角的位置
但我们通常喜欢这么写
import javax.swing.*;
public class test extends JFrame {
public test(){
setTitle("hello world");
setBounds(100,100,500,300);//设置窗体在屏幕中的位置第一个是x坐标,第二个是y坐标,第三个是宽,第四个是高
setResizable(true);//是否可以更改窗体大小
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体右上角‘x’的功能
/*JFrame.DISPOSE_ON_CLOSE 释放窗体资源
JFrame.DO_NOTHING_ON_CLOSE 什么也不做,也就是点“x”没反应
JFrame.EXIT_ON_CLOSE 关闭窗口,并停止程序
JFrame.HIDE_ON_CLOSE 影藏窗口,但程序没有结束
*/
//xx.setSize(500 ,300);
//xx.setlocation(100,100);
//这2行和xx.setBounds(100,100,500,300);功能相同
setVisible(true);//窗体可见
System.out.println("x"+f.getX()+"y"+f.getY());//获取坐标
}
public static void main(String[] args) {
new test();
}
}
为什么了 ,因为java是面向对象的语言,这样写更方便维护…
Container(窗体容器):
窗体只是一个框架,而框架里的东西是显示在窗体容器中的
import javax.swing.*;
import java.awt.*;
public class test extends JFrame {
public test(){
setTitle("hello world");
setBounds(100,100,500,300);
setResizable(true);
Container c=getContentPane();//获取一个窗体容器
c.setBackground(Color.blue);//设置窗体容器背景颜色
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);//窗体可见
}
public static void main(String[] args) {
new test();
}
}
Jlable(标签):
import javax.swing.*;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,100,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
JLabel l=new JLabel("这是一个标签");
l.setSize(20,20);//设置标签大小
l.setText("更改标签类容");
l.setFont(new Font("楷体",Font.BOLD,15));//设置字体
l.setForeground(Color.blue);//设置字的颜色
c.add(l);//忘容器中添加该组件
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
标签不仅仅可以放过文字还可以放图片
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,100,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
setVisible(true);
JLabel l=new JLabel("这是一个标签");
l.setText("更改标签类容");
l.setFont(new Font("楷体",Font.BOLD,15));//设置字体
l.setForeground(Color.blue);//设置字的颜色
Icon picture=new ImageIcon("F:\\代码\\test\\src\\swing\\asdasd.jpg");
//我们通过Icon找到图片
l.setIcon(picture);//将图片添加到 标签里
c.add(l);
}
public static void main(String[] args) {
new test();
}
}
JButton(按钮):
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,100,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
JButton xx=new JButton("设置内容");
c.add(xx);
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,100,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null );//当设置为null时默认为绝对布局
JButton xx=new JButton("设置内容");
xx.setLocation(10,10,60,20);
c.add(xx);
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
流布局:
从左到右排列,默认居中对齐
它可以使组件像水一样,向某个方向流动,遇到障碍就折回
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,100,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout( new FlowLayout());//给容器设置流布局
for(int i=0;i<10;i++){
c.add(new JButton("按钮"+ i));
}
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
如上代码,我们通过循环给容器添加了10个按钮
如下
我们可以拉动
因为默认是居中对齐的,所以呈现了上面的效果,相信大家也明白了流的意思
当然我们也可以设计为左对齐
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,100,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout( new FlowLayout(FlowLayout.LEFT));//给容器设置流布局,为左对齐
for(int i=0;i<10;i++){
c.add(new JButton("按钮"+ i));
}
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
效果如下
我们还可以在构造方法中添加水平间距和竖直间距
将设置布局的代码改成如下即可
c.setLayout( new FlowLayout(FlowLayout.LEFT,30,10));//
边界布局(BorderLayout):
它能将容器划分为5个区域
如下图
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,350,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new BorderLayout());
JButton b1=new JButton("center");
JButton b2=new JButton("east");
JButton b3=new JButton("west");
JButton b4=new JButton("north");
JButton b5=new JButton("south");
c.add(b1,BorderLayout.CENTER);
c.add(b2,BorderLayout.EAST);
c.add(b3,BorderLayout.WEST);
c.add(b4,BorderLayout.NORTH);
c.add(b5,BorderLayout.SOUTH);
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
网格组布局(Gridlayout):
如图
它有2种常用的构造方式
import javax.swing.*;
import javax.swing.plaf.IconUIResource;
import java.awt.*;
public class test extends JFrame {
public test(){
setBounds(100,100,350,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new GridLayout(7,3,5,5));//7行3列,水平竖直间距为5
for(int i=0;i<20;i++){
c.add(new JButton());
}
setVisible(true);
}
public static void main(String[] args) {
new test();
}
}
如图它会按照,7行3列布局
如果组件数多于网格数,他会自动优化到最优效果
网格组布局:
让我们看看和网格布局的差别
可见网格组布局是比较灵活的,但也相对麻烦,要实现一个网格组布局有以下步骤
第三步,也就是定义一个约束对象它有很多属性
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
public class test {
JFrame f=new JFrame();//主窗体
Container c;//主容器
void creat(){
c=f.getContentPane();
c.setLayout(new GridBagLayout());//设置为网格组布局
f.setSize(800,600);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init(){
GridBagConstraints g1=new GridBagConstraints();
g1.gridx=1;//设置左上角的位置
g1.gridy=1;
c.add(new JButton("组件1"),g1);//添加方法
GridBagConstraints g2=new GridBagConstraints();
g2.gridx=2;
g2.gridy=2;
c.add(new JButton("组件2"),g2);
GridBagConstraints g3=new GridBagConstraints();
g3.gridx=3;
g3.gridy=3;
c.add(new JButton("组件3"),g3);
}
void init2(){
GridBagConstraints g1=new GridBagConstraints();
g1.gridx=1;
g1.gridy=1;
c.add(new JButton("组件1"),g1);
GridBagConstraints g2=new GridBagConstraints();
g2.gridx=2;
g2.gridy=2;
g2.gridwidth=2;//设置 组件占的行列数
g2.gridheight=1;
c.add(new JButton("组件2"),g2);
GridBagConstraints g3=new GridBagConstraints();
g3.gridx=3;
g3.gridy=3;
g3.gridwidth=2;
g3.gridheight=2;
c.add(new JButton("组件3"),g3);
}
void Init3(){
GridBagConstraints g1=new GridBagConstraints();
g1.gridx=1;
g1.gridy=1;
c.add(new JButton("组件1"),g1);
GridBagConstraints g2=new GridBagConstraints();
g2.gridx=2;
g2.gridy=2;
g2.gridwidth=2;
g2.gridheight=1;
c.add(new JButton("组件2"),g2);
GridBagConstraints g3=new GridBagConstraints();
g3.gridx=3;
g3.gridy=3;
g3.gridwidth=2;
g3.gridheight=2;
g3.fill=GridBagConstraints.BOTH;//使组件填满所占的行与列
c.add(new JButton("组件3"),g3);
}
void Init4(){
GridBagConstraints x=new GridBagConstraints();
x.anchor=GridBagConstraints.NORTHEAST;//设置为东北方向
c.add(new JButton("xxx"),x);
}
void Init5(){
GridBagConstraints x=new GridBagConstraints();
x.gridx=1;
x.gridy=1;
x.insets=new Insets(5,5,5,10);//上下左右边距
c.add(new JButton("asdasd"),x);
}
void init6(){
GridBagConstraints x=new GridBagConstraints();
x.gridx=1;
x.gridy=1;
x.ipadx=10;
x.ipady=10;
c.add(new JButton("你好"),x);
x.gridx=7;
x.gridy=7;
x.ipadx=-10;//正数是扩大,负数是缩小
x.ipady=-10;
c.add(new JButton("你好"),x);
}
void init7(){
GridBagConstraints x=new GridBagConstraints();
x.gridx=1;
x.gridy=1;
x.weightx=10;
x.weighty=10;
c.add(new JButton("你好"),x);
}
public static void main(String[] args) {
test x=new test();
x.creat();
// x.init();
x.Init3();
x.f.setVisible(true);
}
}