GUI学习
前言:本来不打算学习Gui的,不过最近需要用到还是学习一下吧
1.1 awt 与swing
java的图形化界面的对象存在于awt与swing包中,awt需要调用本地系统方法实现功能,在不同的
平台下显示不同,swing是在awt的基础上实现的一套图形化界面,提供了更多组件,由于全部都适
用java完成,所以在不同平台下显示相同,这就给移植到不同平台提供了可能。
在java gui中,所有的内容都是通过组件实现的。组件和容器
1.2 Frame的使用
package com.ch2;import javax.swing.*;
import java.awt.*;
public class Gui {public static void main(String[] args){Frame frame =new Frame("first gui");frame.setVisible(true);//可视化frame.setSize(300,300);frame.setBackground(new Color(135, 36, 36));//背景颜色frame.setLocation(100,100);//窗口位置frame.setResizable(false);//不能缩放大小}
}
通过上述操作,我们就生成了一个窗口,并设定了大小,背景颜色等
每次都要初始化比较麻烦,我们通过继承进行封装
package com.ch2;import java.awt.*;public class Test {public static void main(String[] args){new Nframe(100,200,300,200);new Nframe(380,200,300,200);new Nframe(700,200,300,200);}
}
class Nframe extends Frame{static int id=0;public Nframe(int x,int y,int w,int h){super("Frame"+id++);this.setVisible(true);this.setBounds(x,y,w,h);this.setBackground(new Color(241, 232, 232));}
}
1.3 Panel的使用
package com.ch2;import javax.swing.*;
import java.awt.*;
public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setLayout(null);frame.setBackground(Color.red);frame.setBounds(100,100,500,500);panel.setBackground(Color.blue);panel.setBounds(10,10,500,500);frame.add(panel);panel.setVisible(true);frame.setVisible(true);}
}
panel并不像frame一样直接具有可见性,想要利用panel必须将其添加到容器中比如frame我们在
设置panel时 panel.setBounds(10,10,500,500);选定的是相对其父容器的位置,也就是0,0点是该
frame的左上角
1.4 关闭窗口
就比如我们上面的那个窗口,如果我们想要关闭需要怎么操作呢
package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setLayout(null);frame.setBackground(Color.red);frame.setBounds(100,100,500,500);panel.setBackground(Color.blue);panel.setBounds(10,10,500,500);frame.add(panel);panel.setVisible(true);frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}
向窗口中添加一个窗口监听器,重写在点击关闭键时需要调用的方法,我们这里只需要关闭当前窗
口即可。
1.5 布局方式
流式布局
package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setLayout(null);frame.setBackground(new Color(248, 244, 244));frame.setBounds(100,100,500,500);
// panel.setBackground(Color.blue);
// panel.setBounds(10,10,500,500);
// frame.add(panel);
// panel.setVisible(true);frame.setVisible(true);Button button1 = new Button("Button1");Button button2 = new Button("Button2");frame.add(button1);frame.add(button2);frame.setLayout(new FlowLayout());//流式布局frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}
当我们向面板中添加比如按钮等组件时(这里先放在窗口中),需要设置组件的布局方式,即这些组件需要放
的位置,通过setLayout(); 来设置,我们先学习流式布局 即FlowLayout(),按行从上到下进行布局,一行满
了进入下一行,如果不加参数的话,默认情况下在同一行是进行居中放置的。
我们想要靠右可以new FlowLayout(FlowLayout.RIGHT)
靠左同理
东西南北中布局
如果我们想要让组件按东西南北中分布,则可以像下面这样操作
package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setBackground(new Color(248, 244, 244));frame.setBounds(100,100,500,500);
// panel.setBackground(Color.blue);
// panel.setBounds(10,10,500,500);
// frame.add(panel);
// panel.setVisible(true);frame.setVisible(true);Button button1 = new Button("Button1");Button button2 = new Button("Button2");Button button3 = new Button("Button3");Button button4 = new Button("Button4");frame.add(button1, BorderLayout.SOUTH);frame.add(button2, BorderLayout.NORTH);frame.add(button3, BorderLayout.WEST);frame.add(button4, BorderLayout.EAST);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}
这种布局只能这样设置
表格布局
package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setBackground(new Color(248, 244, 244));frame.setBounds(100,100,500,500);
// panel.setBackground(Color.blue);
// panel.setBounds(10,10,500,500);
// frame.add(panel);
// panel.setVisible(true);frame.setVisible(true);Button button1 = new Button("Button1");Button button2 = new Button("Button2");Button button3 = new Button("Button3");Button button4 = new Button("Button4");frame.setLayout(new GridLayout(2,2));frame.add(button1);frame.add(button2);frame.add(button3);frame.add(button4);frame.pack();frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}
frame.setLayout(new GridLayout(2,2));
用于设置表格布局,表格布局将容器按我们要求进行划分
比如当前设置的是两行两列,然后按照我们添加顺序对其进行填充。pack()是用于自动调整窗口的大小,以适
应其内容
布局间可以进行组合,通过不同布局的组合来实现不同的布局,比如我们可以这样用:
package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();frame.setVisible(true);frame.setBounds(100,100,400,400);frame.setLayout(new GridLayout(2,1));Panel panel1 =new Panel(new BorderLayout());Panel panel2 =new Panel(new GridLayout(2,1));Panel panel3 =new Panel(new GridLayout(2,1));Panel panel4 =new Panel(new BorderLayout());panel1.add(new Button("left"),BorderLayout.EAST);panel1.add(new Button("right"),BorderLayout.WEST);panel4.add(new Button("right"),BorderLayout.WEST);panel4.add(new Button("left"),BorderLayout.EAST);panel2.add(new Button("up"));panel2.add(new Button("down"));panel1.add(panel2,BorderLayout.CENTER);panel3.add(new Button("up"));panel3.add(new Button("down"));panel4.add(panel3,BorderLayout.CENTER);frame.add(panel1);frame.add(panel4);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}
1.6事件监听
监听点击事件
package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Button button=new Button("button");//button.addActionListener(e -> System.out.println("111"));button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("111");}});frame.add(button, BorderLayout.CENTER);frame.setBounds(100,100,300,300);frame.setVisible(true);windowClose(frame);}private static void windowClose(Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}
我们利用匿名内部类去实现该操作,因为该接口是一个函数接口,所以我们也可以使用lambda表达式去写,
就是注释掉的那里
触发事件时我们重构的函数中的e是事件信息,我们可以自己去设计事件信息,使用setActionComand()
e也有方法去获取该信息 getActionComand()
1.7 输入框
在java中,输入框组件是TextField