草庐IT

【了解Java GUI编程】AWT和Swing的基本用法

锅小白 2024-01-03 原文

GUI :Graphical User Interface,图形用户界面,指在计算机出现后,在屏幕上使用图形界面来帮助用户(User)与机器(Machine)打交道用的界面接口(Interface)。简单地理解,就是电脑打开的各个界面及弹窗,用户可进行鼠标、键盘等操作。

目录

一、AWT

1.1 组件和容器

1.1.1 AWT常用组件

1.1.2 常用的容器

1.2 布局管理器

1.3 事件监听

1.4 简易计算器的应用案例

 二、Swing

 2.1 JDialog弹窗

2.2 图标

2.2.1 Icon图标

2.2.2 ImageIcon图像图标

 2.4 Panel面板

 2.4 按钮

2.4.1 JButton图片按钮

2.4.2 JRadioButton单选框按钮

2.4.3 JCheckBox多选框按钮

2.5 列表

2.5.1 JComboBox下拉框

2.5.2 列表框

2.6 Scroll滚动条


一、AWT

AWT:抽象窗口工具包 (Abstract Windowing Toolkit),是Java平台独立的窗口系统,图形和用户界面器件的工具包。AWT是Java基础类 (JFC)的一部分,为Java程序提供图形用户界面(GUI)的标准API。

java.awt包提供了基本的java程序的设计工具。主要包括下述三个概念:

  • 组件——Component

  • 容器——Container

  • 布局管理器——LayoutManager

1.1 组件和容器

1.1.1 AWT常用组件

组件名称

构造方法

使用说明

按钮(Button)

Button b=new Button("退出");

单击按钮产生ActionEvent事件,实现ActionListener接口并重写actionPerformed()方法监听和处理事件

复选框(Checkbox)

Checkbox ch=new Checkbox("one",true);

选中复选框产生ItemAction事件,实现ItemListener接口监听和处理事件

下拉菜单(Choice)

Choice colorChoose=new Choice();

实现ItemListener接口监听和处理事件;Add()方法可在下拉列表中添加选项

画布(Canvas)

public Canvas(GraphicsConfigurationconfig);

重写Canvas类的paint()方法实现完成图形处理;实现MouseListener和KeyListener接口监听Canvas组件的鼠标和键盘事件

文本框(TextField)

TextField ft=new TextField(16);

//宽度为16个字符

文本框只能显示一行,按Enter键时产生ActionEvent事件,通过ActionListener接口中的actionPerformed()方法处理事件

文本域(TextAera)

TextArea ta=new TextArea("Textarea",4,10);

//4行10列

可显示多行多列文本和滚动条

列表框(List)

List list=new List(4,false);

//4行,不允许多选

提供多个文本选项,支持滚动条,可以浏览多项

对话框(Dialog)

Window类的子类

文件对话框(FileDialog)

Filedialog fd=new Filedialog(frm,"fileddilog");

当用户想打开或存储文件时,可使用文件对话框进行操作

菜单栏(MenuBar)

MenuBar mb=new MenuBar();

通过frm.setMenuBar(mb)语句可将菜单mb设置为Frame对象frm的主菜单

下拉菜单(Menu)

Menu m=new Menu("Menu");

通过mb.add(m)可将m下拉列表添加到菜单栏中

菜单项(MenuItem)

MenuItem mi=new MenuItem("Openit");

通过mi.add(mi)将菜单项mi添加到下一个下拉列表m中。

颜色(Color)

//非构造方法,两种方法设置组件背景色

setBackground(Color.BLUE);

setBackground(newColor(100,100,100));

通过setForeground()方法设置组件前景色,通过setBackground()方法设置组件背景色。颜色值可使用Color类的颜色常量来设置,也可通过指定RGB颜色对象值设置

字体(Font)

Font font=new Font("宋体",Font.BOLD,10);

//宋体,10号,加粗

按顺序向Font()构造方法传递有关字体设置的参数

1.1.2 常用的容器

        主要有三类:Panel(面板), Frame(框架), Applet(小程序)

容器名称

构造方法

使用说明

面板(Panel)

Panel pnl = new Panel();面板是一种透明的容器,没有标题和边框,与Frame 不同,Panel不能作为最外层的容器单独存在,它首先必须作为一个组件放置在其他容器(一般为Frame)中。

框架(Frame)

Frame frm = new Frame("New Window");使用Window的子类Frame类进行窗口实例化,框架的外观就像平常Windows系统下的窗口,setSize()方法可以设置框架尺寸的大小,setVisibe()方法可以设置窗口的可见性。

小程序(Applet)

Applet apt = new Applet();Frame一般用作Java应用程序的窗口,而Applet是Java小程序的窗口。与Frame不同,Applet是在网页中显示的,也可以通过添加Panel进行组件布局。

        示例1:创建Frame窗口并设置属性

//创建一个AWT窗口

public class MyAWTDemo {
    public static void main(String[] args) {
        //创建一个frame框架
        Frame frame=new Frame();
        //设置Java窗体组件的名称
        frame.setTitle("JavaGUIComponent");
        //设置窗体的顶点位置及其大小
        frame.setBounds(20,30,300,280);
        //设置窗体是否可见
        frame.setVisible(true);
        //设置窗体背景颜色
        frame.setBackground(Color.gray);
        frame.add(new List());
        /*给窗体添加监听器的方法改变窗体状态,监听器的参数是一个内部类,
         *     内部类定义了窗体关闭的处理方法
         */
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
         
        //创建一个panel面板
        Panel panel=new Panel();
        //给panel面板添加文本框、文本域、列表、单选按钮、复选按钮、画布、标签、字体大小、事件、滚动条
        panel.add(new TextField(20));
        panel.add(new Button("Click me!"));
         
        frame.add(panel);
    }
}

        示例2:创建自己的Frame窗口类(继承extends

public class MyFrameDemo {

	public static void main(String[] args) {
		// 展示多个窗口
		MyFrame myFrame1 = new MyFrame(100,100,200,200,Color.red);
		MyFrame myFrame2 = new MyFrame(300,100,200,200,Color.yellow);
		MyFrame myFrame3 = new MyFrame(100,300,200,200,Color.green);
		MyFrame myFrame4 = new MyFrame(300,300,200,200,Color.blue);

	}

}

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);
		
	}
}

 

 1.2 布局管理器

        常见分类:

布局管理器类型

构造方法

使用说明

流布局管理器(FlowLayout) 

new FlowLayout();//默认构造方法,居中对齐,横向和纵向间隔均默认为5像素

new FlowLayout(FlowLayout.RIGHT,20,40);//右对齐,横向间隔20像素,纵向间隔40像素

FlowLayout是Panel 和 Applet 的默认布局管理器。在该布局管理器中,组件在容器中按照从上到下,从左到右的顺序进行排列,行满后则换行。
边界布局管理器(BorderLayout)frame.add(button1,BorderLayout.EAST);//将按钮button1放置在最右侧将容器分成North、South、East、West和Center 5个区域,每个区域只能放置一个组件,使用add()方法添加组件到容器指定区域。若容器大小发生变换,组件的相对位置不变。
网格布局管理器(GridLayout)GridLayout gl = new GridLayout(3,5); //3行5列网格式布局GridLayout 可使容器中的各个组件按照从上到下,从左到右的规律呈网格状布局,每个组件始终平均占据容器的空间。

         示例1:东西南北中的边界式布局按钮组件

package GUI;

import java.awt.*;

public class MyBorderLayout {

	public static void main(String[] args) {
		Frame frame = new Frame("MyBorderLayout");
		
		//组件-按钮
		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);

	}

}

        运行结果出现如下界面:

         示例2:表格式布局组件

package GUI;

import java.awt.*;

public class MyGridLayout {

	public static void main(String[] args) {
		Frame frame = new Frame("MyGridLayout");
		
		//组件-按钮
		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");
		
		//设置为表格式布局:3行2列
		frame.setLayout(new GridLayout(3,2));
		
		frame.add(btn1);
		frame.add(btn2);
		frame.add(btn3);
		frame.add(btn4);
		frame.add(btn5);
		frame.add(btn6);
		
		frame.pack();//Java的一个函数,自动最优布局(可以不写)
		frame.setVisible(true);

	}

}

        运行结果如下:

 1.3 事件监听

        通过ActionListener动作监听器接口实现组件的动作发生之后的事件处理。

        定义一个事件监听的类:

class  自定义监听类  implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {       //重写动作执行函数
        ......;
    }
}

         示例1:事件监听,实现按钮点击时可输出文字

package GUI;
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 TestActionEvent01 {

	public static void main(String[] args) {
		// 按下按钮,触发一些事件
		Frame frame = new Frame();
		Button button = new Button("button1");

		//因为addActionListener()需要一个ActionListener,所以我们需要构造一个ActionListener
		MyActionListener myActionListener = new MyActionListener();
		button.addActionListener(myActionListener);
		
		frame.add(button,BorderLayout.CENTER);
		frame.pack();
		
		windowClose(frame);//关闭窗口
		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("按下按钮了");
		
	}
	
}

        示例2:输入框(TextField)事件监听,实现输入密码,并在控制台得到密码的内容

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestText01 {

	public static void main(String[] args) {
		//启动
		new MyFrame2();
	}

}

class MyFrame2 extends Frame{
	public MyFrame2() {
		TextField textField = new TextField();
		add(textField);//在frame中添加文本框对象
		
		//监听这个文本框输入文字(密码)
		MyActionListener2 myActionListener2  =new MyActionListener2();
		//按下enter键,就会触发这个输入框的事件
		textField.addActionListener(myActionListener2);
		
		//设置替换编码(在输入框中输入的都以*来展示,而按下回车键后在控制台可以得到输入的内容)
		textField.setEchoChar('*');
		
		setVisible(true);
		pack();
	}
}

class MyActionListener2 implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent e) {
		//获得一些资源,返回的对象
		TextField field = (TextField) e.getSource();
		//获得输入框中的文本
		System.out.println(field.getText());
		//点击回车后,输出文本框的内容后,清空文本框
		field.setText("");//null:空;  "":空白字符串
	}
	
}

        运行结果:

        示例3 :鼠标监听事件,用鼠标画画

package GUI_2;
//鼠标监听事件:用鼠标画画

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

public class MouseListenerTest {

	public static void main(String[] args) {
		new MyFrame("画图");

	}

}

class MyFrame extends Frame{
	
	ArrayList points;
	
	//需要画笔,并监听鼠标当前的位置,需要集合来存储这个点
	public MyFrame(String title) {
		super(title);
		setBounds(200,200,400,300);
		
		//存鼠标点击的点
		points = new ArrayList<>();
		
		setVisible(true);
		
		//鼠标监听器,针对这个窗口
		this.addMouseListener((MouseListener) new MyMouseListener());
	}
	
	@Override
	public void paint(Graphics g) {
		//画画,监听鼠标的事件
		Iterator iterator = points.iterator();//使用迭代器画点
		while(iterator.hasNext()) {//如果鼠标指向下一个点,指针指向下一个
			Point point = (Point) iterator.next();
			g.setColor(Color.BLUE);
			g.fillOval(point.x, point.y, 10, 10);//画点
		}
	}
	
	//添加一个点到界面上
	public void addPaint(Point point) {
		points.add(point);
	}
	
	
	
	//适配器模式,否则需要重写MouseListener类的所有内置函数
	private class MyMouseListener extends MouseAdapter{
		//鼠标  按下,弹起,按住不放
		public void mousePressed(MouseEvent e) {//e为当前鼠标
			MyFrame myFrame = (MyFrame) e.getSource();
			//点击时,界面上会产生一个点,这个点就是鼠标的点
			myFrame.addPaint(new Point(e.getX(),e.getY()));
			new Point(e.getX(),e.getY());
			
			//每次点击鼠标都需要重新画一遍,刷新
			myFrame.repaint();
		}

	}
}

         示例4:窗口监听事件,关闭窗口

package GUI_2;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class WindowTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new WindowFrame();
	}

}

class WindowFrame extends Frame{
	public WindowFrame() {

		setBounds(100,100,200,200);
		setVisible(true);
		
		//addWindowListener(new MyWindowListener());//使用内部类关闭窗口
		this.addWindowListener(
				//匿名内部类关闭窗口
				new WindowAdapter() {
					@Override
					public void windowClosing(WindowEvent e) {
						System.out.println("你点击了关闭");//输出事件的响应
						System.exit(0);//正常退出;exit(1)为非正常退出
					}
					
					@Override
					public void windowActivated(WindowEvent e) {//激活窗口
						System.out.println("windowActivated");
					}
				}
				);
	}
	
	class MyWindowListener extends WindowAdapter{
		@Override
		public void windowClosing(WindowEvent e) {
			System.exit(0);//正常退出;exit(1)为非正常退出
		}
	}
}

1.4 简易计算器的应用案例

        案例1 :通过设计构造器(Calculator()),制作一个简易计算器

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//制作一个简易计算器

public class MyCalculation {

	public static void main(String[] args) {
		new Calculator();

	}

}

//计算器类
class Calculator extends Frame{
	//构造器,重写类的初始化
	public Calculator(){
		//3个文本框
		TextField num1 = new TextField(10);//字符数
		TextField num2 = new TextField(10);//字符数
		TextField num3 = new TextField(20);//字符数
		//1个按钮
		Button button = new Button("=");
		
		button.addActionListener(new MyCalculatorListener(num1,num2,num3));
		//1个标签
		Label label = new Label("+");
		
		//流式布局
		setLayout(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;
	}
	
	@Override
	public 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("");
	}
	
}

         运行结果:在前两个文本框输入两个数(如左图),点击“=”,得到加法运算结果(如右图)

        上述MyCalculation.java是通过设计构造器的一种面向过程的编程;对代码进行面向对象设计的优化,在主函数中直接调用方法来运行:

        案例2:简易计算器的优化设计

package GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//简易计算器MyCalculation的优化设计:改造为面向对象的方法设计

public class MyCalculation02 {

	public static void main(String[] args) {
		new Calculator02().loadFrame();//调用loadFrame()方法直接运行

	}

}

//计算器类
class Calculator02 extends Frame{
	//属性
	TextField num1,num2,num3;
	//方法
	public void loadFrame() {  //定义类的方法
		//3个文本框
		num1 = new TextField(10);//字符数
		num2 = new TextField(10);//字符数
		num3 = new TextField(20);//字符数
		//1个按钮
		Button button = new Button("=");
		
		button.addActionListener(new MyCalculatorListener02(this));
		//1个标签
		Label label = new Label("+");
		
		//流式布局
		setLayout(new FlowLayout());
		
		//按照排列的顺序添加控件
		add(num1);
		add(label);
		add(num2);
		add(button);
		add(num3);
		
		pack();
		setVisible(true);
	}

}

//监听器类
class MyCalculatorListener02 implements ActionListener{

	//获取计算器这个对象,在一个类中组合另一个类
	Calculator02 calculator = null;
	
	public MyCalculatorListener02(Calculator02 calculator) {
		this.calculator = calculator;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//1.获得加数和被加数
		//2.将这个值加法运算后,放到第三个(运算结果)框
		//3.清除前两个框
		int n1 = Integer.parseInt(calculator.num1.getText());
		int n2 = Integer.parseInt(calculator.num2.getText());
		calculator.num3.setText(""+(n1+n2));
		calculator.num1.setText("");
		calculator.num2.setText("");
	}
	
}

 二、Swing

        Swing 同样是一个为 Java 设计的 GUI 工具包,提供许多比 AWT 更好的屏幕显示元素,它们用纯 Java 写成,故同 Java 一样可以跨平台运行。与AWT相比,最直观的优点在于,Swing窗口可以通过一行命令直接关闭窗口。

        建立Swing窗口的格式

public  class  Swing窗口类  extends  JFrame{

    public Swing窗口类() {
        Container container = this.getContentPane();   //创建容器
        
        //新建需要的组件和面板元素变量
        ......;


        container.add( 组件 / 面板 );    //将组件或面板添加到容器中
        
        //JFrame 的基础设置:设置窗口大小、可见、可关闭
        this.setVisible(true);
        this.setBounds(100,100,300,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭窗口
    }
    public static void main(String[] args) {
        new Swing窗口类()

    }

}

 2.1 JDialog弹窗

        示例:点击按钮,出现弹窗

package GUI_3;
//JDialog弹窗

import java.awt.Container;
import java.awt.Dialog;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

//主窗口
public class DialogDemo extends JFrame{

	public DialogDemo(){
		//窗口最基本的设置
		this.setVisible(true);
		this.setSize(700,500);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		//JFrame放东西,容器
		Container container = this.getContentPane();
		//绝对布局
		container.setLayout(null);
		
		//按钮
		JButton button = new JButton("弹出一个对话框");//创建
		button.setBounds(30, 30, 200, 50);
		
		//点击这个按钮的时候,弹出一个弹窗
		button.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {//监听器
				//弹窗
				new MyDialogDemo();//用事件去绑定弹窗
			}
			
		});
		
		container.add(button);
	}
	
	public static void main(String[] args) {

		new DialogDemo();
	}

}

//弹窗的窗口
class MyDialogDemo extends JDialog{
	public MyDialogDemo() {
		this.setVisible(true);
		this.setBounds(100,100,500,500);
		//this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//主弹窗已经设置过关闭了,不用重复定义
		
		Container container = this.getContentPane();
		container.setLayout(null);
		
		Label label = new Label("欢迎学习Java");
		label.setBounds(100, 100, 200, 200);
		container.add(label);
		
	}
}

2.2 图标

2.2.1 Icon图标

package GUI_3;

import java.awt.*;
import javax.swing.Icon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

//图标:需要实现类,Frame继承
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(15,15);//初始化定义一个图标
		//图标放在标签(的中间),也可以放在按钮上
		JLabel jlabel = new JLabel("icontest",iconDemo,SwingConstants.CENTER);
		
		Container container = getContentPane();
		container.add(jlabel);
		
		//设置窗口可见及可关闭
		this.setVisible(true);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new IconDemo().init();

	}

	@Override
	public int getIconHeight() {
		return this.height;
	}

	@Override
	public int getIconWidth() {
		return this.width;
	}

	@Override
	public void paintIcon(Component c, Graphics g, int x, int y) {
		// TODO Auto-generated method stub
		g.fillOval(x, y, width, height);
	}

}

        运行结果,得到如下界面:

 2.2.2 ImageIcon图像图标

        注意:在使用前应将图片(这里的图片命名为“down.png”)放在该工作空间的地址下

package GUI_3;
//图像图标的使用

import java.awt.Container;
import java.net.URL;

import javax.swing.*;

public class ImageIconDemo extends JFrame{
	
	public ImageIconDemo() {
		
		JLabel label = new JLabel("ImageIcon");//界面中每一个图片都是一个带有地址的label
		//获取图片的地址
		URL url = ImageIconDemo.class.getResource("down.png");//通过类获得当前类下的地址
		
		ImageIcon imageIcon = new ImageIcon(url);
		label.setIcon(imageIcon);//居中放置图片
		label.setHorizontalAlignment(SwingConstants.CENTER);
		
		Container container = getContentPane();
		container.add(label);
		
		setBounds(100,100,200,200);
		setVisible(true);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new ImageIconDemo();

	}
}

        运行结果如下:

 2.4 Panel面板

package GUI_3;

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.*;

public class JPanelDemo extends JFrame{

	public JPanelDemo() {
		Container container = this.getContentPane();
		container.setLayout(new GridLayout(2,1,10,10));//设置为2行1列的表格式排版,后面两个参数的意思是间距
		
		JPanel panel1 = new JPanel(new GridLayout(1,3));
		
		panel1.add(new JButton("1"));
		panel1.add(new JButton("2"));
		panel1.add(new JButton("3"));
		
		container.add(panel1);
		
		this.setVisible(true);
		this.setSize(500, 500);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new JPanelDemo();

	}

}

 2.4 按钮

2.4.1 JButton图片按钮

package GUI_3;
//图片按钮
import java.awt.*;
import java.net.URL;
import javax.swing.*;

public class JButtonDemo01 extends JFrame{
	
	public JButtonDemo01() {
		Container container = this.getContentPane();
		//将一个图片变为图标
		URL resource = JButtonDemo01.class.getResource("down.png");
		Icon icon  = new ImageIcon(resource);
		
		//把这个图标放按钮上
		JButton button = new JButton();
		button.setIcon(icon);
		button.setToolTipText("图片按钮");
		
		//add
		container.add(button);
		
		this.setVisible(true);
		this.setSize(500, 300);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new JButtonDemo01();

	}

}

 2.4.2 JRadioButton单选框按钮

package GUI_3;
//单选框按钮
import java.awt.*;
import java.net.URL;
import javax.swing.*;

public class JButtonDemo02 extends JFrame{
	
	public JButtonDemo02() {
		Container container = this.getContentPane();
		//将一个图片变为图标
		URL resource = JButtonDemo01.class.getResource("down.png");
		Icon icon  = new ImageIcon(resource);
		
		//单选框
		JRadioButton radioButton1 = new JRadioButton("JRadioButton01");
		JRadioButton radioButton2 = new JRadioButton("JRadioButton02");
		JRadioButton radioButton3 = new JRadioButton("JRadioButton03");
		
		//由于单选框只能选择一个,分组,一个组中只能选择一个
		ButtonGroup group = new ButtonGroup();
		group.add(radioButton1);
		group.add(radioButton2);
		group.add(radioButton3);
		
		container.add(radioButton1,BorderLayout.CENTER);
		container.add(radioButton2,BorderLayout.NORTH);
		container.add(radioButton3,BorderLayout.SOUTH);
		
		this.setVisible(true);
		this.setSize(500, 300);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new JButtonDemo02();

	}

}

2.4.3 JCheckBox多选框按钮

package GUI_3;
//多选框按钮
import java.awt.*;
import java.net.URL;
import javax.swing.*;

public class JButtonDemo03 extends JFrame{
	
	public JButtonDemo03() {
		Container container = this.getContentPane();
		//将一个图片变为图标
		URL resource = JButtonDemo01.class.getResource("down.png");
		Icon icon  = new ImageIcon(resource);
		
		//多选框
		JCheckBox checkBox01  = new JCheckBox("checkBox01");
		JCheckBox checkBox02  = new JCheckBox("checkBox02");
		
		container.add(checkBox01,BorderLayout.NORTH);
		container.add(checkBox02,BorderLayout.SOUTH);
		
		this.setVisible(true);
		this.setSize(500, 300);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new JButtonDemo03();

	}

}

2.5 列表

2.5.1 JComboBox下拉框

package GUI_3;
//下拉框

import java.awt.*;
import javax.swing.*;

public class ComboboxDemo01 extends JFrame{
	
	public ComboboxDemo01() {
		
		Container container = this.getContentPane();
		
		JComboBox status = new JComboBox();
		status.addItem(null);
		status.addItem("即将上映");
		status.addItem("正在热映");
		status.addItem("已下架");
		
		container.add(status);
		
		this.setVisible(true);
		this.setSize(500,300);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new ComboboxDemo01();

	}

}

        运行结果:

 2.5.2 列表框

        注意:有静态列表和动态列表两种建立方式,一般选择通过定义向量变量,动态初始化列表

package GUI_3;
//列表框

import java.awt.*;
import java.util.Vector;

import javax.swing.*;

public class ComboboxDemo02 extends JFrame{
	
	public ComboboxDemo02() {
		
		Container container = this.getContentPane();

		//生成列表的内容  
		String[] contents = {"1","2","3"};//静态初始化
		
		Vector contents2 = new Vector();//动态初始化
		//列表中需要放入内容
		//JList list = new JList(contents);//静态列表
		
		JList list = new JList(contents2);//动态列表,,一般选择动态扩容!!
		contents2.add("zhangsan");
		contents2.add("lisi");
		contents2.add("wangwu");
		
		
		container.add(list);
		
		this.setVisible(true);
		this.setSize(500,300);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}

	public static void main(String[] args) {
		new ComboboxDemo02();
	}

}

2.6 Scroll滚动条

package GUI_3;

import java.awt.*;
import javax.swing.*;

public class JScrollDemo extends JFrame{

	public JScrollDemo() {
		Container container = this.getContentPane();
		
		//文本域
		JTextArea textArea = new JTextArea(20,50);
		textArea.setText("欢迎学习Java");
		
		//Scroll面板
		JScrollPane scrollPane = new JScrollPane(textArea);//创建一个带有文本域的Scroll面板
		container.add(scrollPane);//将面板添加到容器中
		
		//JFrame 的基础设置:设置窗口大小、可见、可关闭
		this.setVisible(true);
		this.setBounds(100,100,300,400);
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	}
	public static void main(String[] args) {
		new JScrollDemo();

	}

}

        运行结果:文本框出现了滚动条。

 

有关【了解Java GUI编程】AWT和Swing的基本用法的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  7. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

  8. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  9. Ruby 元编程问题 - 2

    我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一

  10. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

随机推荐