简介
GUI核心技术 Swing AWT
但是现在被淘汰了
- 界面不美观
- 需要jre环境
学习这个原因
- 给MYC架构的思想(监听器)做铺垫
- 能自己写一些小工具
- 有可能工作会维护Swing界面
AWT
介绍
java.awt
包含很多类和接口
元素:窗口,按钮,文本框

容器和组件
Frame
第一个GUI
public static void main(String[] args) {
//Frame,直接看源码
Frame frame = new Frame("这里是窗口的标题");
//需要设置可见性
frame.setVisible(true);
//然后窗口大小
frame.setSize(400,400);
//背景颜色
//frame.setBackground(new Color(1,1,1));
frame.setBackground(Color.BLACK);
//设置初始弹框的位置
frame.setLocation(200,200);
//还可以设置大小固定
frame.setResizable(false);//就不能拖动变大变小
//但是现在不能关 只能终结程序才行
}
封装实现多个弹窗
//封装窗口类
public class MyFrame extends Frame {
static int id = 0;//通过计数器解决多窗口问题
public MyFrame(int x, int y, int w, int h, Color color){
super("MyFrame"+(++id));//调用父类的设置标题构造器
setBackground(color);//背景颜色
setBounds(x, y, w, h);//起始位置 长宽
setVisible(true);//可视化
}
}
Panel面板
面板是在Frame窗口上面的
public static void main(String[] args) {
Frame frame = new Frame();
//会出现 FlowLayout(流布局) 布局的概念
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
frame.setBounds(200,200,200,200);
frame.setBackground(Color.BLUE);
//panel 设置坐标 是相对于frame的
panel.setBounds(50,50,100,100);
panel.setBackground(Color.pink);
//把面板放到Frame中
frame.add(panel);
frame.setVisible(true);//可见性
//监听事件 关掉
//适配器模式
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//点击关闭的时候做的事情 ing
System.exit(0);//终结程序
}
});
}
Layout
FlowLayout流式布局

public static void main(String[] args) {
Frame frame = new Frame();
Panel panel = new Panel();
//组件 按钮
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
//设置布局 流式布局
frame.setLayout(new FlowLayout());//默认居中
//frame.setLayout(new FlowLayout(FlowLayout.LEFT));//往左
frame.setBounds(200,200,200,200);
frame.setBackground(Color.BLUE);
//panel 设置坐标 是相对于frame的
panel.setBounds(50,50,200,200);//问题 为什么panel是包裹着button的大小
panel.setBackground(Color.pink);
//把面板放到Frame中
frame.add(panel);
//再把按钮添加到panel中
panel.add(button1);
panel.add(button2);
panel.add(button3);
frame.setVisible(true);//可见性
BorderLayout东南西北中布局

public static void main(String[] args) {
Frame frame = new Frame("TestBorderLayout");
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.setSize(200,200);
frame.setVisible(true);
}
GridLayout表格布局

public static void main(String[] args) {
Frame frame = new Frame("TestGridLayout");
Button b1 = new Button("b1");
Button b2 = new Button("b2");
Button b3 = new Button("b3");
Button b4 = new Button("b4");
Button b5 = new Button("b5");
Button b6 = new Button("b6");
frame.setLayout(new GridLayout(3,2));
frame.add(b1);
frame.add(b2);
frame.add(b3);
frame.add(b4);
frame.add(b5);
frame.add(b6);
//frame.pack();//自动设置frame的大小 刚好包裹控件
frame.setVisible(true);
}
事件监听
按钮监听
初
public class TestActionEvent {
public static void main(String[] args) {
Frame frame = new Frame("监听事件");
Button button = new Button("button");
//因为addActionListener需要一个 ActionListener 所以构造一个
MyActionListener myActionListener = new MyActionListener();
button.addActionListener(myActionListener);
//再给frame添加关闭的监听器
windowClose(frame);
// frame.addWindowListener(new WindowAdapter() {
// @Override
// public void windowClosing(WindowEvent e) {
// System.exit(0);
// }
// });
frame.add(button);
frame.pack();
frame.setVisible(true);
}
//关闭事件的方法 最好抽成方法
private static void windowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//事件监听
class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮点击会在出现这句话");
System.out.println(e.getActionCommand());//button 就是button的名字
}
}
两个按钮同一个监听
public static void main(String[] args) {
Frame frame = new Frame("开始&结束");
Button button1 = new Button("start");
Button button2 = new Button("stop");
//可以设置e.getActionCommand()的值
button2.setActionCommand("button2_stop");
AbstractAction action = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if ("start".equals(e.getActionCommand())){
System.out.println(e.getActionCommand()+"=>开始");
}
if ("button2_stop".equals(e.getActionCommand())){
System.out.println(e.getActionCommand()+"=>结束");
}
}
};
frame.setLayout(new FlowLayout());
frame.add(button1);
frame.add(button2);
button1.addActionListener(action);
button2.addActionListener(action);
frame.pack();
frame.setVisible(true);
}
TextField输入框监听
初
public class TestText_输入框监听 {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
TextField textField = new TextField();
add(textField);
//监听文本框
MyActionListener2 myActionListener2 = new MyActionListener2();
textField.addActionListener(myActionListener2);
//设置替换编码
//textField.setEchoChar('*');
setVisible(true);
pack();
}
}
class MyActionListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println(e.getSource());
//回车出现java.awt.TextField[textfield0,8,31,120x23,text=123,editable,selection=3-3]
TextField field = (TextField)e.getSource();
System.out.println(field.getText());//就是回车之后获取到文本框里面的内容
field.setText("");//回车后再清空
}
}
计算器
oop原则:组合大于继承
class A extends B{
}
class A{
public B b;
}
普通理解版
public class Test_计算器 {
public static void main(String[] args) {
new Calculator();
}
}
class Calculator extends Frame{
public Calculator(){
super("计算器");
setLayout(new FlowLayout());
TextField num1 = new TextField(10);//字符数
TextField num2 = new TextField(10);
TextField num3 = new TextField(20);
Button button = new Button("=");
Label label = new Label("+");
add(num1);
add(label);
add(num2);
add(button);
add(num3);
button.addActionListener(new MyCalculatorListener(num1, num2, 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;
}
@Override
public void actionPerformed(ActionEvent e) {
String text1 = num1.getText();
String text2 = num2.getText();
String sum = (Integer.parseInt(text1) + Integer.parseInt(text2))+"";
num3.setText(sum);
}
}
完全面向对象
public class Test_计算器 {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame{
//属性
TextField num1,num2,num3;
Button button;
Label label;
//方法
public void loadFrame(){
//控件
num1 = new TextField(10);//字符数(长度)
num2 = new TextField(10);
num3 = new TextField(20);
button = new Button("=");
label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
//监听器
button.addActionListener(new MyCalculatorListener(this));
pack();
setVisible(true);
}
}
//监听器类
class MyCalculatorListener implements ActionListener{
//获取计算器对象, 在一个类中组合另外一个类
Calculator calculator = null;
public MyCalculatorListener(Calculator calculator){
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//获取数
String text1 = calculator.num1.getText();
String text2 = calculator.num2.getText();
//加之后赋给第三个框
String sum = (Integer.parseInt(text1) + Integer.parseInt(text2))+"";
calculator.num3.setText(sum);
}
}
内部类(更好的包装)
public class Test_计算器 {
public static void main(String[] args) {
new Calculator().loadFrame();
}
}
//计算器类
class Calculator extends Frame{
//属性
TextField num1,num2,num3;
Button button;
Label label;
//方法
public void loadFrame(){
//控件
num1 = new TextField(10);//字符数(长度)
num2 = new TextField(10);
num3 = new TextField(20);
button = new Button("=");
label = new Label("+");
//布局
setLayout(new FlowLayout());
add(num1);
add(label);
add(num2);
add(button);
add(num3);
//监听器
button.addActionListener(new MyCalculatorListener());
pack();
setVisible(true);
}
//监听器类属于内部类
//内部类最大的好处就是能直接访问外部的属性和方法
private class MyCalculatorListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获取数
String text1 = num1.getText();
String text2 = num2.getText();
//加之后赋给第三个框
String sum = (Integer.parseInt(text1) + Integer.parseInt(text2))+"";
num3.setText(sum);
}
}
}
Paint(画笔)
在frame中默认有
public class TestPaint {
public static void main(String[] args) {
new MyPaint().loadFrame();
}
}
class MyPaint extends Frame{
public void loadFrame() {
setBounds(200,200,600,400);
setVisible(true);
}
@Override
public void paint(Graphics g) {//画笔
//super.paint(g);
//画笔颜色
//g.setColor(Color.red);
//开始画 draw空心,fill实心
g.drawOval(100,100,100,100);//圆形
g.fillOval(200,100,100,100);
//养成习惯 画笔用户按还原到最初的颜色
//注销掉设置的颜色
}
鼠标监听
//鼠标监听事件
public class TestMouse {
public static void main(String[] args) {
new MyFrame("鼠标监听");
}
}
//写自己的类
class MyFrame extends Frame{
//画画需要画笔,需要监听鼠标当前位置,需要集合存储这个点
ArrayList points;
public MyFrame(String title){
super(title);
setBounds(100,100,500,400);
//存鼠标点击的点
points = new ArrayList();
setVisible(true);
//鼠标正对窗口
this.addMouseListener(new MyMouseListener());
}
//1. 监听器 监听鼠标点击的坐标
private class MyMouseListener extends MouseAdapter{
@Override
public void mousePressed(MouseEvent e) {
MyFrame myFrame = (MyFrame) e.getSource();
//点击鼠标 将当前鼠标点击的坐标存入point(点)类
Point point = new Point(e.getX(), e.getY());
//再将这个point对象存入集合
points.add(point);
//每次点击鼠标重画
myFrame.repaint();
}
}
@Override
public void paint(Graphics g) {
//2. 通过迭代器将集合中的点取出来
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point) iterator.next();
//2.1 将点的坐标取出作为实心圆画出 宽高10
g.setColor(Color.blue);
g.fillOval(point.x,point.y,10,10);
}
}
}
窗口监听
public class Window_窗口监听 {
public static void main(String[] args) {
new WindowFrame();
}
}
class WindowFrame extends Frame {
public WindowFrame(){
setTitle("开始");
setBackground(Color.red);
setBounds(100,100,200,200);
setVisible(true);
addWindowListener(new MyWindowListener());
}
class MyWindowListener extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
//setVisible(false);//隐藏窗口
System.exit(0);//程序结束 正常退出 1为非正常退出
}
@Override
public void windowActivated(WindowEvent e) {
WindowFrame frame = (WindowFrame) e.getSource();
frame.setTitle("重新获取到焦点");
}
@Override
public void windowDeactivated(WindowEvent e) {
WindowFrame frame = (WindowFrame) e.getSource();
frame.setTitle("失去焦点");
}
}
}
键盘监听
public class TestKeyListener {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends Frame{
public KeyFrame() {
setBounds(100,100,500,500);
setVisible(true);
addKeyListener(new KeyAdapter() {
//按下且不放会一直调用
@Override
public void keyTyped(KeyEvent e) {
int keyCode = e.getExtendedKeyCode();
if (keyCode == KeyEvent.VK_UP) {
System.out.println("按了方向键上2");
}
}
//键盘按下且不放会一直调用 优先级高于Typed
@Override
public void keyPressed(KeyEvent e) {
//e.getExtendedKeyCode()获取对应的键盘码
//System.out.println(e.getExtendedKeyCode());
int keyCode = e.getExtendedKeyCode();
if (keyCode == KeyEvent.VK_UP) {
System.out.println("按了方向键上");
}
}
//松开
@Override
public void keyReleased(KeyEvent e) {
System.out.println("keyReleased");
}
});
}
}
Swing
JFrame窗口
public class TestJFrame {
public static void main(String[] args) {
new TestJFrame().init();
}
//init(); 初始化
public void init(){
JFrame jFrame = new JFrame("JFrame窗口");
jFrame.setVisible(true);
jFrame.setBounds(100,100,200,200);
//设置颜色
//jFrame.setBackground(Color.red);//这样没有颜色
Container container = jFrame.getContentPane();
container.setBackground(Color.yellow);
//设置文字 JLabel
JLabel jLabel = new JLabel("JLabel设置文字");
//标签居中
jLabel.setHorizontalAlignment(SwingConstants.CENTER);//center就是0
//jLabel.setHorizontalAlignment(0);
//添加组件
//jFrame.add(jLabel);
container.add(jLabel);
//关闭事件
/*
DO_NOTHING_ON_CLOSE 0 关闭的时候什么都不做
HIDE_ON_CLOSE 1 隐藏 常用
DISPOSE_ON_CLOSE 2 关闭窗口。
EXIT_ON_CLOSE 3 关闭窗口,并结束所有线程。 常用
*/
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
Dialog(弹窗)
//主窗口
public class TestDialog extends JFrame {
public static void main(String[] args) {
new TestDialog();
}
public TestDialog(){
setVisible(true);
setSize(700,500);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//JFrame 放东西 需要容器
Container container = getContentPane();
//绝对布局 自己设置xy
container.setLayout(null);
//按钮
JButton button = new JButton("弹框");
button.setBounds(30,30,200,50);
//设计监听事件
button.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
//实现弹窗
new MyDialogDemo01();
}
});
//添加组件
container.add(button);
}
}
class MyDialogDemo01 extends JDialog{
public MyDialogDemo01() {
setVisible(true);
setBounds(100,100,400,400);
Container container = getContentPane();
container.add(new JLabel("弹窗123"));//解决中文乱码
}
}
JLabel(标签)
图标
public class IconDemo extends JFrame implements Icon {
private int width,height;
public IconDemo(){}//无参构造
public IconDemo(int width, int height) {
this.width = width;
this.height = height;
}
public void init(){
setBounds(100,100,300,300);
setVisible(true);
IconDemo iconDemo = new IconDemo(15, 15);
//图标可以放在标签和按钮上
JLabel label = new JLabel("icon", iconDemo, 0);
Container container = getContentPane();
container.add(label);
}
public static void main(String[] args) {
new IconDemo().init();
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x,y,width,height);
}
@Override
public int getIconWidth() {
return width;
}
@Override
public int getIconHeight() {
return height;
}
}
图片
public class ImageIconDemo extends JFrame {
public ImageIconDemo() {
setBounds(100,100,500,500);
setVisible(true);
Container container = getContentPane();
JLabel label = new JLabel("ImageIcon");
//获取图片的地址 因为图片和这个类在一起的直接获取当前类地址
URL url = ImageIconDemo.class.getResource("OnePower.jpg");
ImageIcon imageIcon = new ImageIcon(url);
label.setIcon(imageIcon);
container.add(label);
}
public static void main(String[] args) {
new ImageIconDemo();
}
}
JPanel(面板)
初
public class TestJPanel extends JFrame {
public TestJPanel() {
setVisible(true);
setBounds(100,100,400,400);
Container container = getContentPane();
container.setLayout(new GridLayout(2,1,10,10));//后面参数 间距
JPanel panel1 = new JPanel(new GridLayout(1,3));
JPanel panel2 = new JPanel(new GridLayout(1,2));
JPanel panel3 = new JPanel(new GridLayout(2,1));
JPanel panel4 = new JPanel(new GridLayout(3,2));
panel1.add(new JButton("1"));
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"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
panel4.add(new JButton("4"));
container.add(panel1);
container.add(panel2);
container.add(panel3);
container.add(panel4);
}
public static void main(String[] args) {
new TestJPanel();
}
}
JScrollPanel(能滚动的面板)
public class JScrollDemo_滚动面板 extends JFrame {
public JScrollDemo_滚动面板() {
setVisible(true);
setBounds(100,100,100,100);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container = getContentPane();
//文本域
JTextArea textArea = new JTextArea(20, 50);
textArea.setText("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");
//Scroll面板
JScrollPane scrollPane = new JScrollPane();
//添加组件
scrollPane.add(textArea);//1. 面板添加组件
container.add(scrollPane);//2. 容器添加面板
}
public static void main(String[] args) {
new JScrollDemo_滚动面板();
}
}
JButton(单多选按钮)
图片按钮
public class JButtonDemo_按钮 extends JFrame {
public static void main(String[] args) {
new JButtonDemo_按钮();
}
public JButtonDemo_按钮() {
setBounds(100,100,500,500);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container = getContentPane();
URL url = ImageIconDemo.class.getResource("OnePower.jpg");
ImageIcon icon = new ImageIcon(url);
JButton button = new JButton();
button.setIcon(icon);
button.setToolTipText("鼠标停留在按钮上会出现的文字");
container.add(button);
}
}
单选&多选
public class JButtonDemo_多选 extends JFrame {
public JButtonDemo_多选() {
setBounds(100,100,400,400);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Container container = getContentPane();
//单选框
JRadioButton radioButton1 = new JRadioButton("单选1");
JRadioButton radioButton2 = new JRadioButton("单选2");
JRadioButton radioButton3 = new JRadioButton("单选3");
//不分组就不能单选
ButtonGroup group = new ButtonGroup();
group.add(radioButton1);
group.add(radioButton2);
group.add(radioButton3);
//多选框
JCheckBox checkBox1 = new JCheckBox("checkBox1");
JCheckBox checkBox2 = new JCheckBox("checkBox2");
container.setLayout(new FlowLayout());
container.add(radioButton1);
container.add(radioButton2);
container.add(radioButton3);
container.add(checkBox1);
container.add(checkBox2);
}
public static void main(String[] args) {
new JButtonDemo_多选();
}
}
JCombobox(列表)
列表框
public class TestComboBox_列表 extends JFrame {
public TestComboBox_列表() {
Container container = getContentPane();
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//生成列表的内容
//String[] contents = {"1","2","3"};
Vector contents = new Vector();
contents.add("1");
//将内容放入列表对象
JList jList = new JList(contents);
contents.add("2");
contents.add("3");
container.add(jList);
}
public static void main(String[] args) {
new TestComboBox_列表();
}
}
下拉框
public class TestComboBox extends JFrame {
public TestComboBox() {
Container container = getContentPane();
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JComboBox comboBox = new JComboBox();
comboBox.addItem(null);
comboBox.addItem("AAA");
comboBox.addItem("123");
comboBox.addItem("中文");
container.add(comboBox);
}
public static void main(String[] args) {
new TestComboBox();
}
}
JTextField (文本框)
文本框
public TestTextDemo01_文本框() {
Container container = getContentPane();
JTextField textField1 = new JTextField("hello");
JTextField textField2 = new JTextField("中文",30);
container.add(textField1);
container.add(textField2);
container.setLayout(new FlowLayout());
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestTextDemo01_文本框();
}
}
密码框 JPasswordField
public class TestTextDemo02_密码框 extends JFrame {
public TestTextDemo02_密码框() {
Container container = getContentPane();
JPasswordField passwordField = new JPasswordField();//默认小圆点
//passwordField.setEchoChar('*');
container.add(passwordField);
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestTextDemo02_密码框();
}
}
小结 代码框架
public class Test extends JFrame {
public Test() {
Container container = getContentPane();
中间放代码
setVisible(true);
setSize(400,400);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Test();
}
}
本文详细介绍Java图形用户界面(GUI)编程,涵盖AWT和Swing两大核心库,包括容器、组件、布局管理器及事件监听等关键概念,提供丰富的代码实例,适合初学者和进阶者学习。
170

被折叠的 条评论
为什么被折叠?



