需要先学习面对对象中的一些东西,构造函数,继承,接口什么的------
java类库包含一组Swing的包,让你能够提供GUI(图形用户界面),并接受来自键盘,鼠标和其他输入设备的用户输入
Swing包含以下GUI组件的应用程序:
1.框架:可以包含标题栏,菜单栏以及最大化,最小化和关闭按钮的窗口
2.容器:可包含其他组件的界面元素
3.按钮:可单击的区域,包含指出其用途的文本或图形
4.标签:提供信息的文本或图形
5.文本框或文本区域:接收键盘输入以及让用户能够编辑文本的窗口
6.下拉式列表:可从下拉式菜单或滚动窗口中选择的一组相关项
7.复选框和单选按钮:小框或圆圈,可被选中或取消选中
8.图标:可加入到按钮,标签,和其他组件中的图形
9.可滚动的窗格:用于放置用户界面容纳不下的组件,包含滚动条,可用于查看全部组件
swing组件位于javax.swing包中,这个包是java类库的标准组成部分。要通过Swing类的名称(即无须指定包名)引用它们,必须使用import语句导入该类或采用
import javax.swing.*;
用于支持GUI的其他两个包是:java.awt,java.awt.event处理用户输入的事件处理类
1. 使用Swing组件时,实际操纵的是该组件类的对象,你可以通过构造函数来创建组件,然后调用相应的方法来正确设置组件
2. 所有Swing组件都是抽象类JComponent 的子类,后者包含用于设置组件大小,修改背景颜色,定义文本字体以及工具提示。
3. 组件必须添加到容器(container)中,才能显示在用户界面上。容器是可以放置其他组件的组件。Swing容器是java.awt.Container的子类,包含用于在容器中添加或删除组件,使用布局管理器来排列组件以及设置容器边框的方法。容器通常可放置到其他容器内。
一:创建界面
要创建Swing应用程序,首先要创建一个表示主GUI的类。这个类的对象将用作容器,用于放置要显示的其他所有组件。
在很多项目中,主界面的对象都是框架JFrame类。【包含标题栏,菜单栏以及最大化,最小化和关闭按钮的窗口】
public class Main extends JFrame{
//body of class
public Main(){//这个类的构造函数
}
}
这个类的构造函数需要完成:
1.调用超类的构造函数,给框架指定标题及其他 setTitle();指定标题
2.设置框架大小,指定宽度和高度(单位:像素)setSize(int 宽,int 高)或Dimension(int 宽,int 高),或pack():将框架要包含的组件加入其中再调用pack().如果框架过大,pack()将其缩小到刚好能显示其中的组件;pack()将其扩大到刚好能显示其中的组件
3.决定用户关闭窗口怎么办
eg.setDeaultCloseOperation(JFrame.EXIT_ON_CLOSE);
EXIT_ON_CLOSE:框架关闭时退出程序
DO_NOTHING_ON_CLOSE 让框架打开并继续运行程序
HIDE_ON_CLOSE 关闭框架并继续运行程序
DISPOSE_ON_CLOSE 框架关闭时释放Java虚拟机(JVM)内存中的框架对象,并继续运行应用程序
4.显示框架setVisible(true);
二:创建组件
要使用界面组件,可以创建该组件类的一个对象,刚刚创建过的容器类JFrame
组件JButton:可单击的按钮
按钮类的构造函数有三项:
1.JButton(String):创建一个带指定文本的按钮
2.JButton(Icon):创建一个包含指定文本和图标的按钮
3.JButton(String,Icon):创建一个包含指定文本和图标的按钮
eg.创建一个带指定文本为Play的按钮
JButton play=new JButton("Play");
三:将组件加入到容器内
最简单的容器是面板JPanel
JButton quit=new JButton("QUit");
JPanel panel=new JPanel();
panel.add(quit);
以上三行代码:创建一个按钮并把它加到面板中
package com.company;
import javax.swing.*;
public class Main extends JFrame{
JButton load=new JButton("Load");
JButton save=new JButton("Save");
JButton unsubscribe=new JButton("Unsubscribe");
public Main(){
super("Button Frame");//框架的标题
setSize(340,170);//框架的宽340,高170像素
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//框架关闭时退出程序
JPanel panel=new JPanel();//创建一个JPanel对象
panel.add(load);//,调用add()方法,将load按钮加入panel中
panel.add(save);
panel.add(unsubscribe);
add(panel);//将panel加入框架JFrame中
setVisible(true);//使JFrame可见
}
public static void main(String[] args) {
Main bf=new Main();
}
}
四.使用组件
注意:将组件加入面板和其他容器之前,务必设置好组件的所有属性
我的文件是Main.java/company
package com.company;
import javax.swing.*;
import java.awt.*;
public class Main{
public static void main(String[] args){
JFrame f=new JFrame("窗体标题"); //建立一个窗体窗体的标题为"窗体标题"
f.setVisible(true);//设置窗体可见
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
// f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
/*EXIT_ON_CLOSE(按关闭那把×之后,隐藏窗口,并停止程序
DO_NOTHING_ON_CLOSE 无任何操作,按什么都没用
HIDE_ON_CLOSE 隐藏窗体,但不停止程序
DISPOSE_ON_CLOSE释放窗体资源,所以关闭窗体之后过一会程序也结束
*/
f.setSize(300,200)//设置窗体的大小,宽300像素,高200像素
f.setLocation(200,200);//设置坐标x:200,y:200.单位:像素
// 以上两行可以写成这一个 f.setBounds(200,200,300,200);
// 200,200,是坐标x,y,300,200是大小宽高 width,height
Container c=f.getContentPane();//获取窗体容器
c.setBackground(Color.white);//设置背景颜色
JLabel label=new JLabel("这是一个窗体");//建立一个label,label的内容为这是一个窗体
c.add(label);//添加label组件到容器内
//c.remove(label);//删除容器内的label组件
c.validate();//验证容器中的组件
// f.setResizable(false);设置窗体是否可以改变大小
System.out.println("x="+f.getX()+" y="+f.getY());
}
}
实际上开发是下面的这种
1.JFrame窗体
public class Main extends JFrame{//继承,让Main类成为子类,也成为窗体
public Main{
//把上面的代码删除所有的"f."
//eg.
setVisible(true);
setBounds(200,200,300,200);
setTile("窗体的标题");
}
public static void main(){
new Main();
}
}
package com.company;
import javax.swing.*;
import java.awt.*;
public class Main extends JFrame{
public Main(){
setTitle("窗体标题");
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,200);
setLocation(200,200);
//setBounds(200,200,300,200);
Container c=getContentPane();
c.setBackground(Color.white);
JLabel l=new JLabel("this is a jframe");
c.add(l);
//c.remove(l);
c.validate();
// setResizable(false);
System.out.println("x="+getX()+" y="+getY());
}
public static void main(String[] args){
new Main();
}
}
2.JDialog对话框窗体
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main extends JDialog{
public Main(JFrame frame){
super(frame,"对话框标题",true);
//super(父参数对象,对话框标题,是否阻塞父窗体);
Container c=getContentPane();//获取窗体容器
c.add(new JLabel("这是一个对话框"));//在容器内加label组件
setBounds(100,100,100,100);
}
public static void main(String[] args){
JFrame f=new JFrame("父窗体");//建立一个窗体
f.setBounds(50,50,300,300);
Container c=f.getContentPane();//获取窗体容器
JButton btn=new JButton("弹出对话框");//建立一个button
c.setLayout(new FlowLayout());//设置布局使用流布局
c.add(btn); //把button增加到在容器内
f.setVisible(true); //窗体可见
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
btn.addActionListener(new ActionListener() {//按钮的监听事件
@Override
public void actionPerformed(ActionEvent e) {
Main m=new Main(f);//一点击按钮就跳到Main的方法去,把父窗体f传进去
m.setVisible(true);
}
});
}
}
3.JLabel标签
标签是一个包含说明性文字,图标或两者兼有的用户组件
创建标签:
用构造函数:
1.JLabel(String):带指定文本的标签
2.JLabel(String,int)带指定文本和对齐方式的标签
3.JLabel(String,Icon,int )带指定文本,图标和对齐方式的标签
标签的对齐方式决定了其文本和图标窗口的占据区域的对齐关系。SwingConstants接口的三个静态类变量用于指定对齐方式:LEFT,CENTER,RIGHT。
标签的内容可以使用方法setText(String)或setIcon(Icon)来设置,
还可以使用getText()和getIcon()来获取这些内容
JLabel f=new JLabel("feeds: ",SwingConstants.LEFT);左对齐
JLabel s=new JLabel("URL: ",SwingConstants.CENTER);居中
JLabel w=new JLabel("DATA: ",SwingConstants.RIGHT);右对齐
panel.add(f);
panel.add(s);
panel.add(w);
package com.company;
import javax.swing.*;
import java.awt.*;
public class Main extends JFrame{
public Main(){
setBounds(100,100,100,100);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
setVisible(true);
JLabel label =new JLabel("这是一个标签");//建立一个标签的内容为这是一个标签
label.setText("更改标签内容"); //将标签内容为更改标签内容
System.out.println(label.getText());//输出标签的内容
label.setFont(new Font("楷体",Font.BOLD,15));//标签的字类型,加粗,字号为15
label.setForeground(Color.GREEN);//标签的字体的颜色,更改前景色
c.add(label);//将标签label加到容器内
}
public static void main(String[] args){
new Main();
}
}
4.Jlabel中添加图片
//JLabel picture添加图片用JLabel添加
package com.company;
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class Main extends JFrame{
public Main(){
setBounds(100,100,500,350);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
JLabel label=new JLabel("这是一个展示图片的标签");
URL url=Main.class.getResource("java.jpg");//方法一:获取图片URL路径
Icon icon=new ImageIcon(url);//获取相应路径下的图片文件
label.setIcon(icon);//添加图片
c.add(label);
setVisible(true);
label.setSize(20,20);//即使设置标签的大小,也不会改变图片大小
}
public static void main(String[] args) {
new Main();
}
}
方法一:
URL url=Main.class.getResource("java.jpg");//方法一:获取图片URL路径
Icon icon=new ImageIcon(url);//获取相应路径下的图片文件
label.setIcon(icon);//添加图片
方法二:
Icon icon=new ImageIcon("D:\\idea code\\src\\com\\company\\java.jpg");//获取相应路径下的图片文件
label.setIcon(icon);//添加图片
我把图片保存在src中名字为javahe格式为jpg
我用的是我室友的表情包哈哈哈哈哈哈哈哈哈哈,她看到会打死我感觉
要想看图片的路径,可以右键图片java.jpg然后点Copy Path即可粘贴到第二种方法的路径下
5.JComboBox下拉框
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main extends JFrame{
public Main(){
setBounds(100,100,190,120);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);//空布局
JComboBox<String> comboBox=new JComboBox<>(); //第一种方法
String items[]={"identity card","student card","employee.card"}; //第一种方法
ComboBoxModel cm=new DefaultComboBoxModel<>(items); //第一种方法
comboBox.setModel(cm); //第一种方法
setVisible(true);
JButton btn=new JButton("打印");
btn.addActionListener(new ActionListener() {//按下按钮发生以下事件输出下拉框选中的索引和选中的值
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("选中的索引:"+comboBox.getSelectedIndex());
System.out.println("选中的值:"+comboBox.getSelectedItem());
}
});
btn.setBounds(100,10,60,20);
c.add(btn);
comboBox.setBounds(10,10,80,21);
c.add(comboBox);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
选中combobox中的内容按打印按钮输出的结果:
选中的索引:0
选中的值:identity card
选中的索引:1
选中的值:student card
选中的索引:2
选中的值:employee.card
方法:添加combobox中的内容
方法一:
JComboBox<String> comboBox=new JComboBox<>();
String items[]={"identity card","student card","employee.card"};
ComboBoxModel cm=new DefaultComboBoxModel<>(items); //创建一个下拉列表模型
comboBox.setModel(cm);//向列表中添加数据模型
方法二:
String items[]={"identity card","student card","employee.card"};
JComboBox<String> comboBox=new JComboBox<>(items);//使用String添加下拉列表元素
方法三:
JComboBox<String> comboBox=new JComboBox<>();
comboBox.addItem("identity card");
comboBox.addItem("student card");
comboBox.addItem("employee.card");
加一行comboBox.setEditable(true);是否可以编辑,可以写下拉框的值,但是输出的索引为-1,是模型外的一种
6.JList下拉框
package com.company;
import javax.swing.*;
import java.awt.*;
public class Main extends JFrame{
public Main(){
setBounds(100,100,217,16);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);
String items[]={"first","second","third","forth","fifth","sixth","seventh"};
JList<String> jl=new JList<>(items);//给JList添加内容的第一种方法
jl.setBounds(10,10,100,100);
c.add(jl);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
/给JList添加内容的方法:
第一种;
String items[]={"first","second","third","forth","fifth","sixth","seventh"};
JList<String> jl=new JList<>(items);
第二种:
DefaultListModel<String> model =new DefaultListModel<>();//列表框的数据模型
for(String tmp:items){
model.addElement(tmp);
}
JList<String> jl=new JList<>();
// model.addElement("添加元素");//添加元素
jl.setModel(model);//列表载入数据模型
可以看到列表框的有些内容都没有显示出来
所以下面加滚动条使可以看到所有的内容
上面的代码改成下面的
String items[]={"first","second","third","forth","fifth","sixth","seventh"};
JList<String> jl=new JList<>(items);
JScrollPane js=new JScrollPane(jl);//为列表添加滚动条
js.setBounds(10,10,100,100);//不需要给JList设置坐标和大小
c.add(js);
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main extends JFrame{
public Main() {
setBounds(100,100,217,167);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(null);
String items[]={"first","second","third","forth","fifth","sixth"};
DefaultListModel<String> model =new DefaultListModel<>();//用的是第二种方法
for(String tmp:items){
model.addElement(tmp);
}
JList<String> jl=new JList<>();
jl.setModel(model);
JScrollPane js=new JScrollPane(jl);
js.setBounds(10,10,100,100);
c.add(js);
/*
1.SINGLE_SELECTION 单选模型 一次只能选择一个
2.SINGLE_INTERVAL_SELECTION只能连续选择相邻的元素
3.MULTIPLE_INTERVAL_SELECTION随便选
*/
jl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置选择模式
JButton btn=new JButton("affirm");
btn.setBounds(120,90,70,25);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
java.util.List<String> values=jl.getSelectedValuesList();
for(String tmp:values){
System.out.println(tmp);
}
System.out.println("-------end---------");
}
});
c.add(btn);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
选择third之后按affirm出来third
7.JTextField文本框
文本框是界面上的一片区域,用户通过键盘输入,修改其中的内容。能够处理一行输入。
JTextField():空文本框
JTextField(int):指定宽度的文本框
JTextField(String,int):指定宽度,包含指定字符窜的文本框
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main extends JFrame{
public Main(){
setBounds(100,100,250,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());//流布局
JTextField jt=new JTextField();//建立文本框
jt.setColumns(20);//设置文本框长度为20个长度
jt.setText("aa");//设置文本内容初始为aa
jt.setFont(new Font("楷体",Font.BOLD,20));//设置字体格式
JButton btn=new JButton("affirm!");//一按确认键,输出文本内容,将文本框清空,获取焦点在文本框
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("文本框内容为:"+jt.getText());//得到文本框内容
jt.setText("");//设置文本框的内容为空,清空文本框
jt.requestFocus();//清空之后,想再输入将鼠标放进框内点击,但是用了requestFocus自动获取焦点,获取光标
}
});
c.add(btn);
c.add(jt);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
8.JPasswordField密码框
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main extends JFrame{
public Main() {
setBounds(100,100,400,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());//流布局
JPasswordField jp=new JPasswordField();//建立密码框
jp.setColumns(20);//设置密码框的长度为20个字符
jp.setFont(new Font("Arial",Font.BOLD,18));//设置字体,第一个参数是默认值
jp.setEchoChar('#');//不写这一行输入的密码就是小圆点,设置回显字符
/*
列如:我想要输出的密码为小星星样式[自己可以随意修改]
注释掉 jp.setFont(new Font("Arial",Font.BOLD,18));
写jp.setEchoChar('\u2605');
*/
//添加动作监听-回车执行
jp.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
char ch[]=jp.getPassword();//获取密码的字符数组
String str=new String(ch);//将字符数组变成字符窜
System.out.println(str);//输出字符窜也就是你输入的密码
}
});
c.add(jp);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
9.JTextArea文本区域
文本区域是能处理多行输入的可编辑文本框。
JTextArea(int,int);行数和列数 为指定值的文本区域
JTextArea(String,int ,int )行数和列数 为指定值且包含指定文本的文本区域
getText()
getSelectedText()
setText(String)
append(String)将指定文本加到当前文本的末尾
insert(String,int)将指定文本插到指定位置
setLineWrap(boolean):指定文本在达到组件边界时,是否自动换行,如果为true,则自动换行
setWrapStyleWord(boolean)指定如何换行:是将当前单词(参数为true时)还是当前字符(参数为false)换到下一行
package com.company;
import javax.swing.*;
public class Main extends JFrame{
JTextField username=new JTextField(15);
JPasswordField password=new JPasswordField(15);
JTextArea comments=new JTextArea(4,15);
JButton ok=new JButton("OK");
JButton cancel=new JButton("Cancel");
public Main(){
super("Account Information");
setSize(300,220);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane =new JPanel();
JLabel usernameLabel=new JLabel("Username: ");
JLabel passwordLabel=new JLabel("Password: ");
JLabel commentsLabel=new JLabel("Comments: ");
comments.setLineWrap(true);
comments.setWrapStyleWord(true);
pane.add(usernameLabel);
pane.add(username);
pane.add(passwordLabel);
pane.add(password);
pane.add(commentsLabel);
pane.add(comments);
pane.add(ok);
pane.add(cancel);
add(pane);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
package com.company;
import javax.swing.*;
import java.awt.*;
public class Main extends JFrame{
public Main(){
setBounds(100,100,100,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());
JTextArea area=new JTextArea();
area.setText("这是文本域");//设定文本内容
area.setRows(5);//设定行
area.setColumns(20);//设定列数,也就是宽
area.append("添加内容");//添加内容
area.insert("插入",2);//在第二个字符后面插入内容“插入”
area.setFont(new Font("楷体",Font.BOLD,20));//设置字体
JScrollPane js=new JScrollPane(area);//给文本域添加滚动条
c.add(js);
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
10.ImageIcon图标
图标是一个小图片,可被放置在按钮,标签或其他用户界面元素上
要创建ImageIcon对象,可调用其构造函数,并将图形文件名作为参数传递给它。
ImageIcon s=new ImageIcon("java.gif");
//很自然地认为当前类文件和图片在同一路径下即可。
//其实所谓的相对路径起点是工程的根目录,即project。
JButton btn=new JButton(s);
JPanel pane=new JPanel();
pane.add(button);
add(pane);
setVisible(true);
以上是加载文件java.gif中的图标,并创建了一个以该图标作为标签的JButton
package com.company;
import javax.swing.*;
public class Main extends JFrame{
public Main(){
super("Icon Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new JPanel();
//create Icons
ImageIcon loadIcon=new ImageIcon("D:\\idea code\\src\\com\\company\\Load.png");
ImageIcon saveIcon=new ImageIcon("D:\\idea code\\src\\com\\company\\Save.png");
ImageIcon subscribeIcon=new ImageIcon("D:\\idea code\\src\\com\\company\\Subscribe.gif");
ImageIcon unsubscribeIcon=new ImageIcon("D:\\idea code\\src\\com\\company\\Unsubscribe.gif");
//creates buttons
JButton load=new JButton("Load",loadIcon);
JButton save=new JButton("Save",saveIcon);
JButton subscribe=new JButton("Subscribe",subscribeIcon);
JButton unsubscribe=new JButton("Unsubscribe",unsubscribeIcon);
//add buttons to panel
panel.add(load);
panel.add(save);
panel.add(subscribe);
panel.add(unsubscribe);
//add the panel to a frame
add(panel);
pack();
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
}
11.监听事件
监听和事件
监听Listener ->盯着 事件Event
KeyListener 键盘 KeyEvent
MouseListener 鼠标 MouseEvent
WindowListener 窗体 WindowEvent
ActionListener 动作 ActionEvent
动作事件监听器
ActionListener 组件.addActionListener();
actionPerformed(ActionEvent e) 组件发生操作时调用的方法
ActionEvent为动作事件