常用窗体
JFrame
JFrame窗体是一个容器,是swing程序中各个组件的载体
以下实例是继承JFrame创建一个简单的窗体
import javax.swing.*;
import java.awt.*;
public class CreateJFrame extends JFrame {
public void createJF(String title){
JFrame jf = new JFrame(title);//实例化一个JFrame对象
Container container = jf.getContentPane();//获取一个容器
JLabel jl = new JLabel("这是一个JFrame窗体");//创建一个标签
jl.setHorizontalAlignment(SwingConstants.CENTER);//使标签文字在窗体中居中显示,等价于jl.setHorizontalAlignment(0);
container.add(jl);//将标签添加到容器中
container.setBackground(Color.cyan);//设置窗体背景颜色
jf.setVisible(true);//使窗体可见
jf.setSize(1400,700);//设置窗体大小
jf.setResizable(false);//设置窗体不能调整大小
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭方式,等价于jf.setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new CreateJFrame().createJF("创建一个窗体");
}
}
下面是效果图
窗口关闭方式有四种,在这里简单说一下区别(括号里是与之等价的书写方式)
WindowConstants.DO_NOTHING_ON_CLOSE(0)//控制台结束程序运行,窗体才会关闭
WindowConstants.HIDE_ON_CLOSE(1)//控制台一直运行
WindowConstants.DISPOSE_ON_CLOSE(2)//控制台延时结束运行
WindowConstants.EXIT_ON_CLOSE(3)//控制台立即结束运行
JDialog
JDialog窗体是Swing组件中的对话框,是从一个窗体中弹出另一个窗体
以下实例是以Jframe为基础,实现弹出窗体功能
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class MyJDialog extends JDialog {
public MyJDialog(MyJFrame m){
//实例化一个JDialog窗体,指定对话框的父类窗体(即有弹出按钮的那个窗体),标题及类型
super(m,"这是一个对话框",true);
Container container = getContentPane();//创建一个容器
container.add(new JLabel("这是一个对话框"));
setBounds(120,120,400,400);//设置对话框的坐标及大小
}
}
public class MyJFrame extends JFrame{
public MyJFrame(){
Container container = this.getContentPane();//this可以省略
container.setLayout(null);//取消布局管理器(后面会说)
JLabel jl = new JLabel("这是一个JFrame窗体");
jl.setHorizontalAlignment(0);
container.add(jl);
JButton jb = new JButton("弹出一个窗体");//创建一个按钮
jb.setBounds(10,10,300,20);//按钮的坐标位置以及大小
jb.addActionListener(new ActionListener() {//创建一个按钮的单击事件
@Override
public void actionPerformed(ActionEvent e) {
new MyJDialog(MyJFrame.this).setVisible(true);//设置JDialog窗体可视
}
});
container.add(jb);//创建的东西都需要添加到容器
setSize(700,350);
setVisible(true);
}
public static void main(String[] args) {
new MyJFrame();
}
}
下面是效果图
标签的使用
标签有五个常用构造方法
public class lable extends JFrame {
1.空白标签
public void lable0(){ JLabel l = new JLabel();//创建一个什么都不带的标签对象 l.setOpaque(true);//设置标签为不透明状态 JFrame jf = new JFrame("一个空白标签对象"); Container container = jf.getContentPane(); container.setBackground(Color.BLUE);//设置JFrame窗口的背景颜色 container.add(l); jf.setSize(500,500); jf.setVisible(true); jf.setDefaultCloseOperation(3); }
第一张图是将标签不透明那行注释了,显示的是窗体的背景颜色,第二张是设置了标签不透明,显示的是标签的颜色
main方法中:new lable().lable0();
2.带图标的标签对象(图标在标签结束后有实例代码)
public void lable1(Icon icon){ JLabel l = new JLabel(icon);//创建一个带图标的标签对象 JFrame jf = new JFrame("带有图标的标签对象"); Container container = jf.getContentPane(); container.setBackground(Color.yellow); container.add(l); jf.setSize(500,500); jf.setVisible(true); jf.setDefaultCloseOperation(3); }
main方法中:new lable().lable1(icon);
3.带图标并设置图标水平对齐方式
public void lable2(Icon icon,int aliament) { JLabel l = new JLabel(icon, aliament);//创建一个带图标的标签对象,并设置标签内容水平对齐方式 JFrame jf = new JFrame("带有图标的标签对象并设置标签内容水平对齐方式"); Container container = jf.getContentPane(); container.setBackground(Color.red); container.add(l); jf.setSize(500,500); jf.setVisible(true); jf.setDefaultCloseOperation(3); }
main方法中:new lable().lable2(icon,2);//设置图标水平居左
4.带文本并设置文字水平对齐方式
public void lable3(String text,int aliament){ JLabel l = new JLabel(text,aliament);//创建一个带文本标签对象,并设置标签内容水平对齐方式 JFrame jf = new JFrame(); Container container = jf.getContentPane(); container.setBackground(Color.green); container.add(l); jf.setSize(500,500); jf.setVisible(true); jf.setDefaultCloseOperation(3); }
main方法中:new lable().lable3(“带有文本的标签对象并设置标签内容水平对齐方式”,0);//文本居中
5.带文本、图标并设置标签内容水平对齐方式
public void lable4(Icon icon,String text,int aliament){ JLabel l = new JLabel(text,icon,aliament);//创建一个带文本,带图标的标签对象,并设置标签内容水平对齐方式 JFrame jf = new JFrame(); Container container = jf.getContentPane(); container.setBackground(Color.magenta); container.add(l); jf.setSize(500,500); jf.setVisible(true); jf.setDefaultCloseOperation(3); }
min方法中:new lable().lable4(icon,“带有文本和图标的标签并设置标签内容水平对齐方式”,0);//居中显示
补充:aliament的值所代表的位置
用值不当会报错:java.lang.IllegalArgumentException: horizontalAlignment,不要担心,换个数字再试试
图标的使用
图标是通过实现接口重写接口中三个重要方法绘制,用以下实例浅浅了解以下
class DrawIcon implements Icon{ private int width;//定义图标的宽 private int height;//定义图标的长 public DrawIcon(int width, int height) { this.width = width; this.height = height; } @Override public void paintIcon(Component c, Graphics g, int x, int y) { g.fillOval(x,y,width,height);//该方法是在坐标(x,y)上画一个圆 } @Override public int getIconWidth() { return this.width; } @Override public int getIconHeight() { return this.height; } }
具体使用方式,在标签的main方法中写在首行:DrawIcon icon = new DrawIcon(150,150);//150是图标的长宽尺寸
也可以用图片填充图标
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class Imageicon extends JFrame {
public Imageicon(){
Container container = getContentPane();
JLabel jl = new JLabel("这是一个JLabel窗体",JLabel.CENTER);//创建一个标签
URL url = Imageicon.class.getResource("icon.jpg");//获取图片所在的url(图片需手动复制到.class文件存放的文件夹中,图片不宜过大)
Icon icon = new ImageIcon(url);//实例化icon对象
jl.setIcon(icon);//为标签设置图片
jl.setHorizontalAlignment(0);//设置文字放在标签的中间
jl.setOpaque(true);//设置标签不透明
container.add(jl);
setSize(500,300);
setVisible(true);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new Imageicon();
}
}
java.lang.Class类中的getResource()方法可以获取资源文件的URL路径,这个路径是相对于类文件的(.class文件),所以可将图片文件与类文件放在同一目录中
以下是效果图:
常用布局管理器
1.绝对布局(硬性指定组件在容器中的位置和大小,可以使用绝对坐标的方式指定组件的位置)
//Container container = getContentPane();
//container.setLayout(null);//使窗体取消布局管理器的设置
//组件名.setBounds(x,y,width,height);//设置按钮的位置(坐标)和大小(宽高)
import javax.swing.*;
import java.awt.*;
public class layout extends JFrame {
public layout(){
Container container = getContentPane();
container.setLayout(null);//取消布局管理器的设置
JButton jb = new JButton("按钮1");
JButton jb2 = new JButton("按钮2");
jb.setBounds(50,45,400,200);
jb2.setBounds(500,45,200,100);
container.add(jb);
container.add(jb2);
setSize(1400,700);
setVisible(true);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new layout();
}
}
下图是以上代码的运行结果:
2.流布局管理器(按指定规则一行一行排列,根据窗体大小自动换行)
//public FlowLayout(摆放规则-->int,组件之间的水平间隔-->单位像素,组件之间的垂直间隔-->单位像素)
//摆放规则有三个值:left-->0(从左向右排列),center==>1(居中对齐排列),right==>2(从右向左排列),
import javax.swing.*;
import java.awt.*;
public class flowLayout extends JFrame {
public flowLayout(){
Container c = getContentPane();
setLayout(new FlowLayout(2,10,10));
for (int i = 0; i < 10; i++) {
c.add(new JButton("button"+i));
}
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new flowLayout();
}
}
3.边界布局管理器(默认的布局)
//边界划分为:东(east)南(south)西(west)北(north)中(center)五大块
import javax.swing.*;
import java.awt.*;
public class borderLayout extends JFrame {
//定义组件摆放位置的数组
String[] border = {BorderLayout.CENTER,BorderLayout.NORTH,BorderLayout.SOUTH,BorderLayout.WEST,BorderLayout.EAST};
//定义按钮的名字
String[] button = {"CENTER","NORTH","SOUTH","WEST","EAST"};
public borderLayout(){
Container c = getContentPane();
setLayout(new BorderLayout());
for (int i = 0; i <border.length; i++) {
c.add(border[i],new JButton(button[i]));
}
setVisible(true);
setSize(600,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new borderLayout();
}
}
4.网格布局管理器
//public GridLayout(行,列,水平间距,垂直间距)-->全部是int类型的参数
import javax.swing.*;
import java.awt.*;
public class gridLayout extends JFrame {
public gridLayout(){
Container c = getContentPane();
setLayout(new GridLayout(3,3,10,10));
for (int i = 0; i < 8; i++) {
c.add(new JButton("button"+i));
}
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new gridLayout();
}
}
改变窗体大小,按钮也会跟着缩小
常用面板
1.JPanel面板
JPanel面板可以聚集一些组件来布局,也是一种容器,用一张图来理解:
下图是n行n列的网格布局中,每个单元格存放一个面板,面板中有使用了n行n列的网格布局,存放组件
用代码书写一个小程序
import javax.swing.*;
import java.awt.*;
public class jPanel extends JFrame {
public jPanel(){
Container c = getContentPane();
//将整个容器(即窗体)设置为2行1列的网格布局,水平和垂直间隙均为10像素
c.setLayout(new GridLayout(2,1,10,10));
//初始化面板,设置为网格布局
JPanel p1 = new JPanel(new GridLayout(1,3,10,10));
JPanel p2 = new JPanel(new GridLayout(1,2,10,10));
JPanel p3 = new JPanel(new GridLayout(1,2,10,10));
JPanel p4 = new JPanel(new GridLayout(2,1,10,10));
//为面板添加组件
p1.add(new JButton("1"));
p1.add(new JButton("2"));
p1.add(new JButton("3"));
p2.add(new JButton("4"));
p2.add(new JButton("5"));
p3.add(new JButton("6"));
p3.add(new JButton("7"));
p4.add(new JButton("8"));
p4.add(new JButton("9"));
//将面板添加到窗体
c.add(p1);
c.add(p2);
c.add(p3);
c.add(p4);
//设置窗体
setVisible(true);
setSize(700,350);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jPanel();
}
}
上面代码的组件是按照面板布局一一添加,可自行复制修改来加深理解
2.JScrollPane面板
JScrollPane面板是自带滚动条的面板,一个JScrollPane面板只能添加一个组件。如果需要添加多个组件,可以将组件布置在JPanel面板上,然后将JPanel面板添加到JScrollPane面板中(只能添加一个)。
import javax.swing.*;
import java.awt.*;
public class jScrollPane extends JFrame {
public jScrollPane(){
Container c = getContentPane();
//创建一个20行50列的文本域组件
JTextArea jt = new JTextArea(20,50);
JScrollPane j = new JScrollPane(jt);//等于j.add(jt)
c.add(j);
setVisible(true);
setSize(200,200);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jScrollPane();
}
}
按钮组件
1.提交按钮组件
JButton组件的构造方法参数有text和icon,下面例子在窗体中指定一个带文本和图标的按钮
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
public class jButton extends JFrame {
public jButton(){
Container c = getContentPane();
URL url = Imageicon.class.getResource("icon.jpg");
Icon icon = new ImageIcon(url);
setLayout(new GridLayout(1,3,10,10));
JButton jb1 = new JButton("这是一个带有图标的按钮1",icon);
JButton jb2 = new JButton("这是一个带有图标的按钮2",icon);
jb2.setEnabled(false);//设置按钮不可用
JButton jb3 = new JButton();
jb3.setMaximumSize(new Dimension(434,101));//设置图片与按钮相同大小
jb3.setIcon(icon);//为按钮设置图标
jb3.setToolTipText("图片按钮");
jb3.setHideActionText(true);//设置隐藏文本控件
jb3.setBorderPainted(false);//设置按钮边界不显示
jb3.addActionListener(new ActionListener() {//为按钮添加一个监听事件
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null,"弹出对话框");
}
});
c.add(jb1);
c.add(jb2);
c.add(jb3);
setVisible(true);
setSize(2000,700);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jButton();
}
}
2.单选按钮组件
JRadioButton默认是圆形图标,有text,icon,selected(默认选中)三个参数
下面写一个小例子
import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class jRadioButton extends JFrame {
public jRadioButton(){
Container c = getContentPane();
URL url = Imageicon.class.getResource("icon.jpg");
Icon icon = new ImageIcon(url);
setLayout(new GridLayout(4,1,10,10));
JRadioButton j1 = new JRadioButton();
JRadioButton j2 = new JRadioButton("单选按钮2");
JRadioButton j3 = new JRadioButton("单选按钮3",true);//默认选中
JRadioButton j4 = new JRadioButton("单选按钮4",icon);
ButtonGroup bg1 = new ButtonGroup();//按钮组
ButtonGroup bg2 = new ButtonGroup();
bg1.add(j1);
bg1.add(j2);
bg2.add(j3);
bg2.add(j4);
//将按钮添加到窗体容器
c.add(j1);
c.add(j2);
c.add(j3);
c.add(j4);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jRadioButton();
}
}
3.复选框组件
JCheckBox有text,icon,checked三个参数,下面用边界布局管理器写一个小实例
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
public class jCheckBox extends JFrame {
public jCheckBox(){
Container c = getContentPane();
setLayout(new BorderLayout());
URL url = Imageicon.class.getResource("icon.jpg");
Icon icon = new ImageIcon(url);
JCheckBox jc1 = new JCheckBox("1");
JCheckBox jc2 = new JCheckBox();
JCheckBox jc3 = new JCheckBox("3",true);
JCheckBox jc4 = new JCheckBox("4",icon,true);
JTextArea jt = new JTextArea(5,30);
JScrollPane js = new JScrollPane(jt);
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
p2.add(js);
p1.add(jc1);
p1.add(jc2);
p1.add(jc3);
p1.add(jc4);
c.add(p1,BorderLayout.SOUTH);
c.add(p2,BorderLayout.NORTH);
jc1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jc1.isSelected()){
jt.append("复选框1被选中\n");
}else{
jt.append("复选框1取消选中\n");
}
}
});
jc2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jc2.isSelected()){
jt.append("复选框2被选中\n");
}else{
jt.append("复选框2取消选中\n");
}
}
});
jc3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jc3.isSelected()){
jt.append("复选框3被选中\n");
}else{
jt.append("复选框3取消选中\n");
}
}
});
jc4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (jc4.isSelected()){
jt.append("复选框4被选中\n");
}else{
jt.append("复选框4取消选中\n");
}
}
});
setVisible(true);
setSize(400,200);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jCheckBox();
}
}
刚开始写代码重复量非常大,熟悉之后可利用数组+循环提交代码实用
列表组件
1.下拉列表框组件
JComboBoxd的常用参数:ComboBoxModel模型,数组,Vector
import javax.swing.*;
import java.awt.*;
public class jComboBox extends JFrame {
JComboBox<String> j = new JComboBox<>(new Myjc());
JLabel jl = new JLabel("请选择:");
public jComboBox(){
Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(jl);
c.add(j);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jComboBox();
}
}
class Myjc extends AbstractListModel<String> implements ComboBoxModel<String>{
String selectedItem = null;
String[] text = {
"选项1",
"选项2",
"选项3",
"选项4"
};
@Override
public void setSelectedItem(Object anItem) {
selectedItem = (String)anItem;
}
@Override
public Object getSelectedItem() {
return selectedItem;
}
@Override
public int getSize() {
return text.length;
}
@Override
public String getElementAt(int index) {
return text[index];
}
}
这个例子传入的是一个ComboBoxModel模型数据
2.列表框组件
JList在窗体上占用固定大小,如果需要带有滚动条,可以将其放入盾冬面板中。有数组,Vector,ListModel模型三个可选参数
import javax.swing.*;
import java.awt.*;
import java.util.Vector;
public class jList extends JFrame {
//本实例使用Vecoto类型数据作为列表框初始化参数
public jList(){
Container c = getContentPane();
Vector v = new Vector();
JList l = new JList(v);
v.add("列表1");
v.add("列表2");
v.add("列表3");
v.add("列表4");
c.add(l);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jList();
}
}
可以修改以下代码实现单击将选中的选项在文本框中显示
import javax.swing.*;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class jList2 extends JFrame {
//本实例使用Listodel对象作为参数,并做滚动条效果
public jList2(){
Container c = getContentPane();
JTextField jf = new JTextField(20);
c.setLayout(null);
JList<String> l = new JList<>(new listModel());
l.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (l.getValueIsAdjusting()) jf.setText(l.getSelectedValue()+"被选中");
}
});
JScrollPane js = new JScrollPane(l);
js.setBounds(10,10,100,100);//指定组件的位置和大小
jf.setBounds(10,200,200,40);//指定组件的位置和大小
c.add(js);
c.add(jf);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jList2();
}
}
class listModel extends AbstractListModel<String>{
private String[] text = {
"选项1", "选项2", "选项3", "选项4","选项5", "选项6", "选项7", "选项8", "选项9", "选项0",
};
@Override
public int getSize() {
return text.length;
}
@Override
public String getElementAt(int index) {
if (index<text.length) return text[index++];
return null;
}
}
import javax.swing.*;
import java.awt.*;
public class jList3 extends JFrame {
//本实例使用DefaultListModel
public jList3(){
Container c = getContentPane();
String[] text = {"选项1", "选项2", "选项3", "选项4","选项5", "选项6"};
DefaultListModel df = new DefaultListModel();
JList jl = new JList(df);
for (int i = 0; i < text.length; i++) {
df.addElement(text[i]);//为模型添加数据
}
c.add(jl);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jList3();
}
}
列表框的其他功能就靠自己一个一个试啦!
文本组件
1.文本框组件
上面的例子2中用到了JTextField,和文本域相比,文本框是单行的
xx.setText(“内容”);用代码来修改文本内容
文本框.requestFocus();文本框获取焦点
2.密码框组件
JPasswordField,和文本框/文本域初始化方式相同
密码框.setEchoChar(‘回显字符’);//指定回显字符,默认是圆点
3.文本域组件
JTextArea,上文用到过
文本框.setLineWrap(true);//设置文本框自动换行
常用事件监听器
Swing事件模型中由3个分离的对象完成对事件的处理,分别是–>事件源,事件以及监听程序
1.动作事件监听
事件名称 ActionEvent
事件源 JButton JList JTextField等
监听接口 ActionListener
添加(删除)监听 add(remove)ActionListener()
2.焦点事件监听
**事件名称 FocusEvent
事件源 Component及派生类
监听接口 FocusListener
添加或删除和动作时间监听一致
一个小实例就看得明白啦
import javax.swing.*;
import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
public class jdsj extends JFrame {
public jdsj(){
Container c = getContentPane();
JTextField j1 = new JTextField("框1");
JTextField j2 = new JTextField();
j1.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
j2.setText("框1得到焦点");
}
@Override
public void focusLost(FocusEvent e) {
j2.setText("框1失去焦点");
}
});
setLayout(null);
j1.setBounds(10,10,200,40);
j2.setBounds(10,100,200,40);
c.add(j1);
c.add(j2);
setVisible(true);
setSize(500,500);
setDefaultCloseOperation(3);
}
public static void main(String[] args) {
new jdsj();
}
}
小结
**本章主要讲解Swing基本要素,包括各种常用的组件、窗体、布局、事件监听等。**