文章目录
GUI编程
-
图形界面编程
组件
- 窗口
- 弹窗
- 面板
- 文本框、列表框、按钮、图片
- 监听事件
- 外挂java
简介
-
GUI:核心类Swing AWT
-
需要jre环境
-
MVC架构的监听基础
AWT
AWT介紹
-
包含了很多类和接口
-
包含很多元素:窗口、按钮、文本框
-
重要组件component
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBKIM2Pl-1635843645668)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20211031090220509.png)]
组件和容器
1、窗口Frame
public class GuiFrame {
public static void main(String[] args) {
//创建一个窗口
Frame frame = new Frame();
//设置一个标签
frame.setTitle("测试窗口");
//设置背景颜色
frame.setBackground(Color.CYAN);
//设置长宽
frame.setSize(400, 400);
//设置位置
frame.setLocation(200 ,200);
//设置是否可调整大小
frame.setResizable(true);
//可见性
frame.setVisible(true);
}
}
添加多个窗口,继承Frame类
import java.awt.*;
public class MyFrame extends Frame {
private static int id;
public MyFrame(String title , int x , int y , int w , int h) throws HeadlessException {
super("我的第"+(++id)+"个窗口:"+title);
setBackground(Color.GREEN);
setBounds(x,y,w,h); //设置坐标长宽、位置
setVisible(true);
setResizable(true);
}
}
public static void main(String[] args) {
new MyFrame("窗口1" , 100 , 100 ,200 , 200);
new MyFrame("窗口2" , 300 , 100 ,200 , 200);
new MyFrame("窗口3" , 500 , 100 ,200 , 200);
new MyFrame("窗口4" , 700 , 100 ,200 , 200);
}
2、面板Panel
- 存在于一个窗口中,功能跟frame类似
- 存一个布局的概念
- 23种设计模式:适配器模式
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestPanel {
public static void main(String[] args) {
//新建一个窗口
Frame frame = new Frame();
//新建一个面板
Panel panel = new Panel();
frame.setTitle("panel面板窗口");
//设置一个布局
frame.setLayout(null);
//设置窗口长宽位置
frame.setBounds(200 , 200 ,500 ,500);
//设置窗口背景颜色
frame.setBackground(new Color(98, 217, 115, 255));
//设置面板背景颜色
panel.setBackground(Color.BLUE);
//设置面板位置大小
panel.setBounds(50 ,50 ,200,200);
//添加面板到特定的窗口
frame.add(panel);
//设置窗口可见性
frame.setVisible(true);
//添加窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0); //退出
}
});
}
}
3、三种布局
-
流式布局
-
东南西北中
-
表格布局
import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class AllLayout { public static void main(String[] args) { Frame frame = new Frame("布局组合样式"); frame.setBackground(Color.BLUE); Panel panel1 = new Panel(); Panel panel2 = new Panel(); Panel panel3 = new Panel(); panel1.setBackground(Color.blue); panel2.setBackground(Color.GREEN); panel3.setBackground(Color.GRAY); Button button1 = new Button("菜单栏1"); Button button2 = new Button("菜单栏2"); Button button3 = new Button("左边栏1"); Button button4 = new Button("左边栏2"); Button button5 = new Button("中间栏1"); Button button6 = new Button("中间栏2"); //设置frame为东西南北中布局 frame.setLayout( new BorderLayout()); //先2格子里添加组件面板 frame.add(panel1, BorderLayout.NORTH); frame.add(panel2,BorderLayout.WEST); frame.add(panel3,BorderLayout.CENTER); //面板一添加流式布局 panel1.setLayout(new FlowLayout()); panel1.add(button1); panel1.add(button2); //添加表格布局 panel2.setLayout( new GridLayout(2,1)); panel2.add(button3); panel2.add(button4); panel3.setLayout(new FlowLayout(FlowLayout.LEFT)); panel3.add(button5); panel3.add(button6); frame.setVisible(true); frame.setBounds(100,100,800,800); // frame.pack(); //自动化适应大小 //添加窗口关闭事件 frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); //退出 } }); } }
4、事件监听
事件监听:当事件发生时候,干什么
button按钮事件监听
//按钮的事件监听
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 MyTestAction {
public static void main(String[] args) {
Frame frame = new Frame("事件监听");
Button start = new Button("start");
Button stop = new Button("stop");
frame.setLayout(new BorderLayout());
frame.add(start , BorderLayout.NORTH);
frame.add(stop , BorderLayout.SOUTH);
start.addActionListener(new MyMonitor());
stop.addActionListener(new MyMonitor());
frame.pack();
frame.setVisible(true);
windowsClose(frame);
}
//将关闭窗口功能抽成方法
public static void windowsClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//添加一个监听器
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("消息为:" + e.getActionCommand());
}
}
TextField事件实现
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextFileAction {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame() throws HeadlessException {
super();
setVisible(true);
TextField textField = new TextField();
add(textField);
textField.addActionListener(new MyTextFileListen()); //TextFile添加监听事件
pack();
}
}
class MyTextFileListen implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField) e.getSource(); //拿到监听器传入的资源
System.out.println(field.getText()); //将输入框中的消息输出
field.setText(""); //将输入框中的消息清空
}
}
组合+内部类实现简单计算器
//简单的流程性写法
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator {
public static void main(String[] args) {
new MyCalculator();
}
}
class MyCalculator extends Frame{
public MyCalculator() throws HeadlessException {
super();
TextField field1 = new TextField();
TextField field2 = new TextField();
TextField field3 = new TextField("和");
Label label = new Label("+");
Button button = new Button("=");
setLayout(new FlowLayout());
add(field1);
add(label);
add(field2);
add(button);
add(field3);
pack();
setVisible(true);
button.addActionListener( new MyCalculatorListen(field1,field2,field3));
}
}
class MyCalculatorListen implements ActionListener{
private TextField num1,num2,num3;
public MyCalculatorListen(TextField num1,TextField num2,TextField num3) {
this.num1 = num1;
this.num2 = num2;
this.num3 = num3;
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(num1.getText());
int n2 = Integer.parseInt(num2.getText());
num3.setText("" + (n1+n2));
num1.setText("");
num2.setText("");
}
}
//组合思想调用,类的封装调用
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator {
public static void main(String[] args) {
new MyCalculator();
}
}
class MyCalculator extends Frame{
TextField field1;
TextField field2;
TextField field3;
public MyCalculator() throws HeadlessException {
super();
field1 = new TextField();
field2 = new TextField();
field3 = new TextField("和");
Label label = new Label("+");
Button button = new Button("=");
setLayout(new FlowLayout());
add(field1);
add(label);
add(field2);
add(button);
add(field3);
pack();
setVisible(true);
button.addActionListener( new MyCalculatorListen(this));
}
}
class MyCalculatorListen implements ActionListener{
private MyCalculator calculator = null;
public MyCalculatorListen(MyCalculator calculator) {
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(calculator.field1.getText());
int n2 = Integer.parseInt(calculator.field2.getText());
calculator.field3.setText(""+(n1+n2));
calculator.field2.setText("");
calculator.field1.setText("");
}
}
//运用内部类的思想,将其封装在一个类中。公司中开发
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Calculator {
public static void main(String[] args) {
new MyCalculator().loacdForm();
}
}
class MyCalculator extends Frame{
TextField field1;
TextField field2;
TextField field3;
public void loacdForm() throws HeadlessException {
field1 = new TextField();
field2 = new TextField();
field3 = new TextField("和");
Label label = new Label("+");
Button button = new Button("=");
setLayout(new FlowLayout());
add(field1);
add(label);
add(field2);
add(button);
add(field3);
pack();
setVisible(true);
button.addActionListener( new MyCalculatorListen());
}
private class MyCalculatorListen implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int n1 = Integer.parseInt(field1.getText());
int n2 = Integer.parseInt(field2.getText());
field3.setText("" + (n1 + n2));
field2.setText("");
field1.setText("");
}
}
}
5、paint画笔
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class Paint {
public static void main(String[] args) {
new MyPaint();
}
}
class MyPaint extends Frame {
private ArrayList points;
public MyPaint() throws HeadlessException {
setBackground(Color.white);
setBounds(100, 100, 500, 500);
setVisible(true);
points = new ArrayList<>();
this.addMouseListener(new MyMouseListen());
}
@Override
public void paint(Graphics g) {
Iterator iterator = points.iterator(); //使用迭代器,进行循环迭代
while(iterator.hasNext()){
Point point = (Point) iterator.next();
g.setColor(Color.BLUE);
System.out.println(point.x + "===" + point.y);
g.fillOval(point.x , point.y , 10,10);
}
}
public void addPaint(Point point){
points.add(point);
}
private class MyMouseListen extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent e) {
//拿到 鼠标所在的Frame
MyPaint frame = (MyPaint) e.getSource();
//点击一下产生一个点
frame.addPaint(new Point(e.getX(),e.getY()));
//重画窗口
repaint();
}
}
}
6、窗口监听
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Windowed {
public static void main(String[] args) {
new MyWindows();
}
}
class MyWindows extends Frame{
public MyWindows() throws HeadlessException {
setBackground(Color.BLUE);
setBounds(100,100,500,500);
setVisible(true);
addWindowListener(new WindowAdapter() {
//窗口被激活时监听
@Override
public void windowActivated(WindowEvent e) {
System.out.println("窗口被打开");
}
//窗口被关闭时监听
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口被关闭");
System.exit(0);
}
});
}
}
7、键盘监听
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class KeyWord {
public static void main(String[] args) {
new MyKeyWord();
}
}
class MyKeyWord extends Frame{
public MyKeyWord() throws HeadlessException {
setBackground(Color.GREEN);
setBounds(100,100,500,500);
setVisible(true);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//获取键盘键位对应KeyCode
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_UP){
System.out.println("你按住了上键");
}
}
});
}
}
Swing
Swing简介
-
AWT的封装类,含有窗口和面板等
-
窗口中添加container容器,在容器你操作窗体效果
import javax.swing.*; import java.awt.*; public class Jframed { public static void main(String[] args) { new MyJframe().init(); } } class MyJframe extends JFrame{ protected void init() { setBounds(100 ,100 ,500,500); //创建一个JLabel标签 JLabel label = new JLabel("这是JLabel"); add(label); //标签居中 label.setHorizontalAlignment(SwingConstants.CENTER); //得到一个container容器,操作JFrame Container container = getContentPane(); container.setBackground(Color.GREEN); //设置一个窗口关闭 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); } }
弹窗
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Dailogs {
public static void main(String[] args) {
new MyDailog();
}
}
class MyDailog extends JFrame{
public MyDailog() throws HeadlessException {
this.setVisible(true);
this.setSize(600,700);
this.setBounds(100,100,500,500);
Container contentPane = this.getContentPane();
contentPane.setLayout(null);
JButton jButton = new JButton("点击弹出一个对话框");
jButton.setBounds(30,30,100,50);
jButton.addActionListener( new MyDialogListener());
contentPane.add(jButton);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
class MyDialogListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
new MyDialogListenered();
}
}
class MyDialogListenered extends JDialog{ //弹窗实现类
public MyDialogListenered() {
this.setVisible(true);
this.setBounds(200,200,400,400);
//this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 弹窗组件已经默认实现
Container contentPane = this.getContentPane();
contentPane.add( new JLabel("重走JAVA这条路"));
}
}
标签
//在标签中添加图标Icon
import javax.swing.*;
import java.awt.*;
public class IconDemo extends JFrame implements Icon {
private int width;
private int height;
public IconDemo() {}
public IconDemo(int width, int height) throws HeadlessException {
this.width = width;
this.height = height;
}
public void init(){
IconDemo iconDemo = new IconDemo(15, 15);
JLabel label = new JLabel("icontext", iconDemo, SwingConstants.CENTER);
Container contentPane = this.getContentPane();
contentPane.add(label);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setBounds(100,100,500,500);
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x,y,width,height);
}
@Override
public int getIconWidth() {
return this.width;
}
@Override
public int getIconHeight() {
return this.height;
}
public static void main(String[] args) {
new IconDemo().init();
}
}
//添加图片Icon
public void init(){
JLabel label = new JLabel("icontext",SwingConstants.CENTER);
URL url = IconDemo.class.getResource("head.jpg"); //获取图片Url
ImageIcon imageIcon = new ImageIcon(url); //得到图片Icon
label.setIcon(imageIcon);
Container contentPane = this.getContentPane();
contentPane.add(label);
this.setVisible(true);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setBounds(100,100,500,500);
}
面板
import javax.swing.*;
import java.awt.*;
public class JPanelDemo extends JFrame {
public JPanelDemo() {
setVisible(true);
Container contentPane = this.getContentPane();
contentPane.setLayout(new GridLayout(2,1,10,10));
JPanel panel1 = new JPanel(new GridLayout(2, 2));
JPanel panel2 = new JPanel(new GridLayout(2, 1));
JPanel panel3 = new JPanel(new GridLayout(1, 2));
JPanel panel4 = new JPanel(new GridLayout(1, 5));
panel1.add(new JButton("1"));
panel1.add(new JButton("1"));
panel2.add(new JButton("2"));
panel2.add(new JButton("2"));
panel3.add(new JButton("3"));
panel3.add(new JButton("3"));
panel3.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
contentPane.add(panel1);
contentPane.add(panel2);
contentPane.add(panel3);
contentPane.add(panel4);
setBounds(100,100,500,500);
contentPane.setBounds(100,100,1000,1000);
contentPane.setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
文本域和JScroll面板
//生成一个文本域,将其交路到JScroll面板中,根据窗口大小自动适应添加滚动条
import javax.swing.*;
import java.awt.*;
public class JPanelDemo extends JFrame {
public JPanelDemo() {
setVisible(true);
Container contentPane = this.getContentPane();
//创建一个文本域
JTextArea jTextArea = new JTextArea(20, 30);
//设置初始默认文本
jTextArea.setText("快到我这里来");
//添加文本域到一个面板中
JScrollPane jScrollPane = new JScrollPane(jTextArea);
//添加面板组件
contentPane.add(jScrollPane);
setBounds(100,100,500,500);
contentPane.setBounds(100,100,1000,1000);
contentPane.setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new JPanelDemo();
}
}
按钮
//图片按钮实现
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtons extends JFrame {
public static void main(String[] args) {
new JButtons();
}
public JButtons() {
Container contentPane = this.getContentPane();
URL url = JButtons.class.getResource("head.jpg");
Icon icon = new ImageIcon(url);
JButton jButton = new JButton();
jButton.setIcon(icon);
jButton.setToolTipText("这是图片按钮");
contentPane.add(jButton);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
//单选按钮
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class JButtoned extends JFrame {
public static void main(String[] args) {
new JButtoned();
}
public JButtoned() throws HeadlessException {
Container contentPane = this.getContentPane();
//将图片变成一个图标
URL url = JButtons.class.getResource("head.jpg");
Icon icon = new ImageIcon(url);
//新建一个单选框按钮
JRadioButton jRadioButton01 = new JRadioButton("JRadioButton01");
JRadioButton jRadioButton02 = new JRadioButton("JRadioButton02");
JRadioButton jRadioButton03 = new JRadioButton("JRadioButton03");
//创建一个button组
ButtonGroup buttonGroup = new ButtonGroup();
//给组中添加单选按钮
buttonGroup.add(jRadioButton01);
buttonGroup.add(jRadioButton02);
buttonGroup.add(jRadioButton03);
contentPane.setLayout(new BorderLayout());
contentPane.add(jRadioButton01 ,BorderLayout.SOUTH);
contentPane.add(jRadioButton03 ,BorderLayout.NORTH);
contentPane.add(jRadioButton02 ,BorderLayout.CENTER);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
//创建多选按钮
public JButtoned() throws HeadlessException {
Container contentPane = this.getContentPane();
//将图片变成一个图标
URL url = JButtons.class.getResource("head.jpg");
Icon icon = new ImageIcon(url);
//创建多选框
JCheckBox jCheckBox01 = new JCheckBox("JCheckBox01");
JCheckBox jCheckBox02 = new JCheckBox("JCheckBox02");
//添加流式布局
contentPane.setLayout(new FlowLayout());
contentPane.add(jCheckBox01);
contentPane.add(jCheckBox02);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
下拉框和列表框
//实现下拉框
import javax.swing.*;
import java.awt.*;
public class Comboboxs extends JFrame {
public static void main(String[] args) {
new Comboboxs();
}
public Comboboxs() throws HeadlessException {
Container contentPane = this.getContentPane();
JComboBox jComboBox = new JComboBox();
jComboBox.addItem(null);
jComboBox.addItem("正在上映");
jComboBox.addItem("已下架");
jComboBox.addItem("正在热映");
contentPane.add(jComboBox);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
//实现列表框
public Comboboxs() throws HeadlessException {
Container contentPane = this.getContentPane();
//线程安全的list集合
Vector<String> vector = new Vector<>();
//创建列表框
JList jList = new JList(vector);
//添加数据
vector.add("张三");
vector.add("李四");
vector.add("王五");
vector.add("马六");
//添加组件
contentPane.add(jList);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
文本框和密码框
//文本框和密码框使用
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class TextFiles extends JFrame {
public static void main(String[] args) {
new TextFiles();
}
public TextFiles() throws HeadlessException {
Container contentPane = this.getContentPane();
contentPane.setLayout(null); //使用绝对布局
JTextField textField = new JTextField("用户名"); //新建一个文本框
JPasswordField passwordField = new JPasswordField(); //新建一个密码框
passwordField.setEchoChar('&');
textField.setBounds(50,50,100,30);
passwordField.setBounds(50,100,100,30);
contentPane.add(textField);
contentPane.add(passwordField);
this.setVisible(true);
this.setSize(500,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}