GUI编程
1,简介
- 图形用户界面,Graphical User Interface,又称图形用户接口,是指采用图形方式显示的计算机操作用户界面。
- GUI的核心技术:AWT,Swing
2,Awt
2.1 AWT简介
- AWT:Abstract Window Toolkit,抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的GUI的基本工具
- 包含了很多类和接口
- 元素:窗口,按钮,文本框
- java.awt
2.2 组件与容器
1, Frame
package com.ym.lesson01;import java.awt.*;public class FrameTest {public static void main(String[] args) {//Frame类 看源码Frame frame = new Frame("我的第一个图形用户界面窗口");//设置可见性frame.setVisible(true);//设置窗口大小frame.setSize(400,400);//设置背景颜色frame.setBackground(Color.blue);//设置弹出的初始位置frame.setLocation(200,200);//设置窗口大小固定frame.setResizable(false);}
}
生成多个Frame
package com.ym.lesson01;import java.awt.*;public class FrameTest2 {public static void main(String[] args) {MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.green);MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.green);MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.green);MyFrame myFrame4 = new MyFrame(300, 300, 400, 400, Color.green);}
}
//封装
class MyFrame extends Frame{static int id=0;public MyFrame(int x,int y,int w,int h,Color color){super("MyFrame"+(++id));//setLocation(200,200);//setSize(400,400);setBounds(x,y,w,h);setBackground(color);setVisible(true);setResizable(false);}
}
2,Panel
解决了窗口关闭问题
package com.ym.lesson01;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;public class PanelTest {public static void main(String[] args) {Frame frame = new Frame("frame");Panel panel = new Panel();//设置布局frame.setLayout(null);//frame坐标,背景颜色frame.setBounds(100,100,200,200);frame.setBackground(new Color(35, 128, 90));//panel坐标,背景颜色panel.setBounds(50,50,50,50);panel.setBackground(new Color(55, 91, 128));//frame.add(panel)frame.add(panel);frame.setVisible(true);frame.setResizable(false);//监听事件,监听窗口关闭事件 system.exit(0)//适配器模式frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {
// super.windowClosing(e);//结束进程System.exit(0);}});}
}
2.3,布局管理器
2.3.1 流式布局,FlowLayout
package com.ym.lesson01;import java.awt.*;public class FlowLayoutTest {public static void main(String[] args) {Frame frame = new Frame();Button button1 = new Button("1");Button button2 = new Button("2");Button button3 = new Button("3");frame.setBounds(100,100,200,200);frame.setVisible(true);frame.add(button1);frame.add(button2);frame.add(button3);//FlowLayout
// frame.setLayout(new FlowLayout());//默认center
// frame.setLayout(new FlowLayout(FlowLayout.LEFT));//左frame.setLayout(new FlowLayout(FlowLayout.RIGHT));//右}
}
3.2 东南西北中,BorderLayout
package com.ym.lesson01;import java.awt.*;public class BorderLayoutTest {public static void main(String[] args) {Frame frame = new Frame();Button east = new Button("East");//东Button west = new Button("West");//西Button south = new Button("South");//南Button north = new Button("North");//北Button center = new Button("Center");//中//东西南北中布局frame.add(east,BorderLayout.EAST);frame.add(west,BorderLayout.WEST);frame.add(south,BorderLayout.SOUTH);frame.add(north,BorderLayout.NORTH);frame.add(center,BorderLayout.CENTER);frame.setBounds(100,100,100,100);frame.setVisible(true);}
}
2.3.3 表格布局,GridLayout
package com.ym.lesson01;import java.awt.*;public class GridLayoutTest {public static void main(String[] args) {Frame frame = new Frame();Button btn1 = new Button("btn1");Button btn2 = new Button("btn2");Button btn3 = new Button("btn3");Button btn4 = new Button("btn4");Button btn5 = new Button("btn5");Button btn6 = new Button("btn6");frame.add(btn1);frame.add(btn2);frame.add(btn3);frame.add(btn4);frame.add(btn5);frame.add(btn6);frame.setLayout(new GridLayout(3,2));frame.setVisible(true);
// frame.setSize(200,200);frame.pack();//java中的一个函数,确定frame的最佳大小}
}
2.3.4 练习
package com.ym.lesson01;import javax.swing.border.Border;
import java.awt.*;public class Test {public static void main(String[] args) {Frame frame = new Frame();frame.setVisible(true);frame.setBounds(100,100,400,300);frame.setLayout(new GridLayout(2,1));Panel p1 = new Panel(new BorderLayout());Panel p2 = new Panel(new GridLayout(2,1));Panel p3 = new Panel(new BorderLayout());
// Panel p4 = new Panel(new GridLayout(2,2));Panel p4 = new Panel();p4.setLayout(new GridLayout(2,2));p1.add(new Button("p1_btn_west"),BorderLayout.WEST);p1.add(new Button("p1_btn_east"),BorderLayout.EAST);p2.add(new Button("p2_btn_top"));p2.add(new Button("p2_btn_bottom"));p1.add(p2,BorderLayout.CENTER);//下面p3.add(new Button("p3_btn_west"),BorderLayout.WEST);p3.add(new Button("p3_btn_east"),BorderLayout.EAST);p4.add(new Button("p4_btn_top1"));p4.add(new Button("p4_btn_top2"));p4.add(new Button("p4_btn_bottom1"));p4.add(new Button("p4_btn_bottom2"));p3.add(p4,BorderLayout.CENTER);frame.add(p1);frame.add(p3);}
}
2.4, 事件监听
package com.ym.lesson02;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 ActionEventTest {public static void main(String[] args) {Frame frame = new Frame();Button button = new Button();
//因为addActionListener()需要一个ActionListener,
//所以构造了一个MyActionListener类MyActionListener myActionListener = new MyActionListener();button.addActionListener(myActionListener);frame.add(button,BorderLayout.CENTER);frame.setVisible(true);frame.pack();windowClose(frame);}//关闭窗口方法private static void windowClose(Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}class MyActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("111");}
}
2.4.1 多个按钮共享一个事件
package com.ym.lesson02;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 ActionEventTest2{public static void main(String[] args) {Frame frame = new Frame();Button btn1 = new Button("start");Button btn2 = new Button("stop");btn1.setActionCommand("btn1_start");//设置标签值MyListener myListener = new MyListener();btn1.addActionListener(myListener);btn2.addActionListener(myListener);frame.add(btn1,BorderLayout.NORTH);frame.add(btn2,BorderLayout.SOUTH);frame.setVisible(true);frame.pack();}
static class MyListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(e.getActionCommand());//getActionCommand()得到按钮上的labelif(e.getActionCommand().equals("btn1_start")){System.out.println("点击了开始btn1_start");}else{System.out.println("点击了结束stop");}}
}}
2.5,输入框TextField
package com.ym.lesson02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TextFieldTest {public static void main(String[] args) {MyFrame myFrame = new MyFrame();}
}class MyFrame extends Frame{public MyFrame(){TextField textField = new TextField();add(textField);MyTextListener myTextListener = new MyTextListener();//按下回车键就会触发事件textField.addActionListener(myTextListener);//输入框中的文本替换为*,但控制台显示的是文本,不是*textField.setEchoChar('*');pack();setVisible(true);}
}
class MyTextListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(e.getSource());//e.getSource()得到资源,返回objectTextField textField = (TextField) e.getSource();System.out.println(textField.getText());//获得输入框中的文本textField.setText("");//按下回车就会清空输入框中的内容}
}
2.6,简易计算器
package com.ym.lesson02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//简易计算器
public class CalcTest {public static void main(String[] args) {Calculator calculator = new Calculator();}
}//计算器类
class Calculator extends Frame {public Calculator(){//三个文本框TextField num1 = new TextField(10);TextField num2 = new TextField(10);TextField num3 = new TextField(20);//一个按钮Button button = new Button("=");button.addActionListener(new MyCalculatorListener(num1,num2,num3));//一个标签Label label = new Label("+");//流式布局,FlowLayoutsetLayout(new FlowLayout());add(num1);add(label);add(num2);add(button);add(num3);pack();setVisible(true);}
}//监听器类
class MyCalculatorListener implements ActionListener{//获取三个变量private TextField num1,num2,num3;public MyCalculatorListener(TextField num1,TextField num2,TextField num3){this.num1=num1;this.num2=num2;this.num3=num3;}@Overridepublic void actionPerformed(ActionEvent e) {//1,获得加数和被加数int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());//2,加法运算后将得数放到第三个框中num3.setText(""+(n1+n2));//3,清除前两个框中的内容num1.setText("");num2.setText("");}
}
改造为面向对象写法(组合)
package com.ym.lesson02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//简易计算器
public class CalcTest {public static void main(String[] args) {Calculator calculator = new Calculator();calculator.loadFrame();}
}//计算器类
class Calculator extends Frame {//属性TextField num1;TextField num2;TextField num3;//方法public void loadFrame(){//三个文本框num1 = new TextField(10);num2 = new TextField(10);num3 = new TextField(10);//一个按钮Button button = new Button("=");//为按钮添加监听事件button.addActionListener(new MyCalculatorListener(this));//一个标签Label label = new Label("+");//流式布局,FlowLayoutsetLayout(new FlowLayout());add(num1);add(label);add(num2);add(button);add(num3);pack();setVisible(true);}
}//监听器类
class MyCalculatorListener implements ActionListener{//获取计算器这个对象,在一个类中组合另外一个类Calculator calculator=null;public MyCalculatorListener(Calculator calculator){this.calculator=calculator;}@Overridepublic void actionPerformed(ActionEvent e) {//1,获得加数和被加数int n1 = Integer.parseInt(calculator.num1.getText());int n2 = Integer.parseInt(calculator.num2.getText());//2,加法运算后将得数放到第三个框中calculator.num3.setText(""+(n1+n2));//3,清除前两个框中的内容calculator.num1.setText("");calculator.num2.setText("");}
}
内部类
package com.ym.lesson02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;//简易计算器
public class CalcTest {public static void main(String[] args) {Calculator calculator = new Calculator();calculator.loadFrame();}
}//计算器类
class Calculator extends Frame {//属性TextField num1;TextField num2;TextField num3;//方法public void loadFrame(){//三个文本框num1 = new TextField(10);num2 = new TextField(10);num3 = new TextField(20);//一个按钮Button button = new Button("=");//为按钮添加监听事件button.addActionListener(new MyCalculatorListener());//一个标签Label label = new Label("+");//流式布局,FlowLayoutsetLayout(new FlowLayout());add(num1);add(label);add(num2);add(button);add(num3);pack();setVisible(true);}//监听器类private class MyCalculatorListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {
//内部类:可以畅通无阻地访问外部的属性和方法//1,获得加数和被加数int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());//2,加法运算后将得数放到第三个框中num3.setText(""+(n1+n2));//3,清除前两个框中的内容num1.setText("");num2.setText("");}}
}
2.7画笔paint
package com.ym.lesson03;import java.awt.*;public class PaintTest {public static void main(String[] args) {new MyPaint().loadFrame();}
}class MyPaint extends Frame{public void loadFrame(){setVisible(true);setBounds(100,100,400,400);}//画笔@Overridepublic void paint(Graphics g) {
// super.paint(g);//画笔颜色
// g.setColor(Color.green);//画圆g.drawOval(100,100,100,100);g.fillOval(100,100,100,100);//实心圆// g.setColor(Color.red);g.fillRect(200,200,100,100);//实心圆//画笔用完之后要还原到画笔默认的颜色}
}
2.8鼠标监听
2.9窗口监听
package com.ym.lesson03;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class WindowListenerTest {public static void main(String[] args) {new WindowFrame();}
}
class WindowFrame extends Frame {public WindowFrame() {setBackground(Color.blue);setVisible(true);setBounds(100,100,200,200);// addWindowListener(new WindowListener());this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.out.println("windowClosing");}@Overridepublic void windowActivated(WindowEvent e) {WindowFrame wf=(WindowFrame) e.getSource();wf.setTitle("windowActivated");System.out.println("windowActivated");}@Overridepublic void windowDeactivated(WindowEvent e) {System.out.println("windowDeactivated");}});}class WindowListener extends WindowAdapter{@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);//程序退出}}
}
2.10键盘监听
package com.ym.lesson03;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;public class KeyListenerTest {public static void main(String[] args) {new KeyFrame();}
}class KeyFrame extends Frame{public KeyFrame(){setBounds(100,100,200,200);setVisible(true);this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if(keyCode==KeyEvent.VK_UP){System.out.println("你按下了上键");}}});}
}
3, Swing
3.1窗口,面板
package com.ym.lesson04;import javax.swing.*;
import java.awt.*;public class JFrameTest {public static void main(String[] args) {new JFrameTest().init();}//init()初始化public void init(){JFrame jFrame = new JFrame();jFrame.setVisible(true);jFrame.setBounds(10,10,200,200);jFrame.setBackground(Color.blue);//获得一个容器Container contentPane = jFrame.getContentPane();contentPane.setBackground(Color.red);JLabel jLabel = new JLabel("哈哈哈");//设置水平对齐jLabel.setHorizontalAlignment(SwingConstants.CENTER);jFrame.add(jLabel);}
}
3.2 弹窗JDialog
package com.ym.lesson04;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class DialogTest extends JFrame {public DialogTest() {this.setVisible(true);this.setSize(400,300);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);Container container = this.getContentPane();container.setLayout(null);//绝对布局JButton jButton = new JButton("点击弹出对话框");jButton.setBounds(30,30,100,100);jButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {MyDialog myDialog = new MyDialog();}});container.add(jButton);}public static void main(String[] args) {DialogTest dialogTest = new DialogTest();}
}class MyDialog extends JDialog{public MyDialog() {this.setVisible(true);this.setBounds(100,100,100,100);
// this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);//默认有关闭事件Container container = this.getContentPane();container.setLayout(null);container.add(new JLabel("abc"));}
}
3.3 标签
图标和图片图标
package com.ym.lesson04;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){this.width=width;this.height=height;}public void init(){IconDemo iconDemo = new IconDemo(20, 20);//把图标放在标签上JLabel jLabel = new JLabel("iconDemo",iconDemo,SwingConstants.CENTER);Container container = getContentPane();container.add(jLabel);this.setVisible(true);this.setBounds(10,10,150,150);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new IconDemo().init();}@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {g.fillOval(x,y,width,height);}@Overridepublic int getIconWidth() {return width;}@Overridepublic int getIconHeight() {return height;}
}
package com.ym.lesson04;import javax.swing.*;
import java.awt.*;
import java.net.URL;public class ImageIconDemo extends JFrame {public ImageIconDemo(){JLabel jLabel = new JLabel("ImageIcon");//获取图片地址URL url = ImageIconDemo.class.getResource("imageicondemo.png");ImageIcon imageIcon = new ImageIcon(url);//注意命名冲突问题jLabel.setIcon(imageIcon);jLabel.setHorizontalAlignment(SwingConstants.CENTER);Container container = getContentPane();container.add(jLabel);this.setVisible(true);this.setBounds(10,10,100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new ImageIconDemo();}}
3.4 面板
JPanel
package com.ym.lesson05;import javax.swing.*;
import java.awt.*;public class JPanelDemo extends JFrame {public JPanelDemo(){Container container = getContentPane();container.setLayout(new GridLayout(1,2,5,5));JPanel jPanel = new JPanel(new GridLayout(2,1));JPanel jPane2 = new JPanel(new GridLayout(1,2));jPanel.add(new JButton("1"));jPanel.add(new JButton("1"));jPane2.add(new JButton("2"));jPane2.add(new JButton("2"));container.add(jPanel);container.add(jPane2);setVisible(true);setBounds(10,10,100,100);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JPanelDemo();}
}
JScrollPane
package com.ym.lesson05;import javax.swing.*;
import java.awt.*;public class JScrollDemo extends JFrame {public JScrollDemo(){//文本域JTextArea jTextArea = new JTextArea(10,10);jTextArea.setText("你好呀");//scroll面板JScrollPane jScrollPane = new JScrollPane(jTextArea);Container container = getContentPane();container.add(jScrollPane);this.setVisible(true);this.setBounds(10,10,200,200);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JScrollDemo();}
}
3.5 按钮
Jbutton
package com.ym.lesson05;import javax.swing.*;
import java.awt.*;
import java.net.URL;public class JButtonDemo01 extends JFrame {public JButtonDemo01() {//将图片变为图片图标URL url = JButtonDemo01.class.getResource("btnicon.png");ImageIcon imageIcon = new ImageIcon(url);//把图标放在按钮上JButton jButton = new JButton();jButton.setIcon(imageIcon);jButton.setToolTipText("图片图标按钮");Container container = this.getContentPane();container.add(jButton);this.setVisible(true);this.setSize(100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo01();}
}
单选按钮
package com.ym.lesson05;import javafx.scene.control.RadioButton;import javax.swing.*;
import java.awt.*;
import java.net.URL;public class JButtonDemo02 extends JFrame {public JButtonDemo02() {Container container = this.getContentPane();//将图片变为图片图标URL url = JButtonDemo02.class.getResource("btnicon.png");ImageIcon imageIcon = new ImageIcon(url);//把图标放在按钮上JButton jButton = new JButton();jButton.setIcon(imageIcon);//单选框JRadioButton jRadioButton1 = new JRadioButton("jRadioButton1");JRadioButton jRadioButton2 = new JRadioButton("jRadioButton2");JRadioButton jRadioButton3 = new JRadioButton();//把这三个按钮分到一个组里ButtonGroup buttonGroup = new ButtonGroup();buttonGroup.add(jRadioButton1);buttonGroup.add(jRadioButton2);buttonGroup.add(jRadioButton3);container.add(jRadioButton1,BorderLayout.NORTH);container.add(jRadioButton2,BorderLayout.CENTER);container.add(jRadioButton3,BorderLayout.SOUTH);this.setVisible(true);this.setSize(100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo02();}
}
复选按钮
package com.ym.lesson05;import javax.swing.*;
import java.awt.*;
import java.net.URL;public class JButtonDemo03 extends JFrame {public JButtonDemo03() {Container container = this.getContentPane();//将图片变为图片图标URL url = JButtonDemo03.class.getResource("btnicon.png");ImageIcon imageIcon = new ImageIcon(url);//把图标放在按钮上JButton jButton = new JButton();jButton.setIcon(imageIcon);//复选框JCheckBox jCheckBox1 = new JCheckBox("jCheckBox1");JCheckBox jCheckBox2 = new JCheckBox("jCheckBox2");container.add(jCheckBox1,BorderLayout.NORTH);container.add(jCheckBox2,BorderLayout.SOUTH);
// this.setLayout(new FlowLayout(FlowLayout.LEFT));
// this.setLayout(new GridLayout(2,1));this.setVisible(true);this.setSize(100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo03();}
}
3.6 列表
下拉列表
package com.ym.lesson06;import javafx.scene.control.ComboBox;import javax.swing.*;
import java.awt.*;public class ComboboxDemo extends JFrame {public ComboboxDemo() {Container container = this.getContentPane();JComboBox status = new JComboBox();status.addItem("就业");status.addItem("考研");status.addItem("考公");container.add(status);this.setVisible(true);this.setBounds(10,10,100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new ComboboxDemo();}
}
列表框
package com.ym.lesson06;import javax.swing.*;
import java.awt.*;
import java.util.Vector;public class ComboboxDemo2 extends JFrame {public ComboboxDemo2() {Container container = this.getContentPane();//生成列表的内容String[] contents1={"ha","haha","哈哈哈"};JList jList1 = new JList(contents1);container.add(jList1,BorderLayout.NORTH);Vector contents2 = new Vector();contents2.add("la");contents2.add("lala");contents2.add("啦啦啦");JList jList2 = new JList(contents2);container.add(jList2,BorderLayout.SOUTH);this.setVisible(true);this.setBounds(10,10,100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new ComboboxDemo2();}
}
3.7 文本框
文本框,文本域和密码框
package com.ym.lesson06;import javax.swing.*;
import java.awt.*;
import java.util.Vector;public class TextDemo extends JFrame {public TextDemo() {Container container = this.getContentPane();//文本框JTextFieldJTextField jTextField = new JTextField("haha",8);//文本域JTextAreaJTextArea jTextArea = new JTextArea("hahahahahha",8,8);//密码框JPasswordFieldJPasswordField jPasswordField = new JPasswordField("12345678",8);JPanel jPanel = new JPanel();jPanel.add(jTextField);jPanel.add(jTextArea);jPanel.add(jPasswordField);JScrollPane jScrollPane = new JScrollPane(jPanel);container.add(jScrollPane);this.setVisible(true);this.setBounds(10,10,100,100);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new TextDemo();}
}