【java】GUI 各种组件使用方法与应用实例

本文介绍了Java GUI编程中JFrame、JPanel、JButton、JLabel等组件的使用方法,包括窗口设置、事件监听、布局管理器。还讨论了Swing与AWT的区别,以及JDialog、列表组件和文本输入组件的应用。并提到了使用鼠标和键盘监听实现画图功能,以及一个简单的贪吃蛇案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

JFrame 窗口

主要方法:设置窗口标题,弹出位置,大小,可见性,背景颜色,大小固定

import javax.swing.JFrame;

import java.awt.Color;

//创建界面对象,传入标题
		JFrame a=new JFrame("我的第一个界面");
		//设置标题 a.setTitle("标题");
		a.setBounds(50,50,500,500);//设置窗口信息,前两个为为弹出位置,后两个为窗口大小
		//自定义 a.pack();
		//设置弹出位置 a.setLocation(500,500); 设置窗口大小 a.setSize(100,100);
		
		//a.setBackground(Color.RED);//设置窗口背景颜色
		//a.setBackground(new Color(104, 243, 22));//设置窗口背景颜色
		//均设置失败

        /*java中如何对JFrame进行设置背景颜色和背景图片
        窗口背景颜色是指直接调用JFrame或者Frame的setBackground(Color color)方法设置后显示出来的颜色。
        其实,在你直接调用这个方法后,你的确设置了背景颜色,
        而你看到的却不是直接的JFrame或者Frame,而是JFrame.getContentPane().
        而JFrame上的contentPane默认是Color.WHITE的,
        所以,无论你对JFrame或者Frame怎么设置背景颜色,你看到的都只是contentPane.
        方法A:在完成初始化,调用getContentPane()方法得到一个contentPane容器,然后将其设置为不可见,即setVisible(false)。
        核心代码this.getContentPane().setVisible(false);//得到contentPane容器,设置为不可见
        方法B:将contentPane的颜色设置为你想要的颜色,而不是对JFrame本身设置,
        核心代码:this.getContentPane().setBackground(Color.red);//设置contentPane为红色
        将核心代码替换方法A核心代码即可实现
        方法C:为JFrame添加一个Panel或者JLabel等其他组件,设置其颜色为你想要的颜色,然后将其覆盖JFrame窗口即可
        JFrame默认是BorderLayoutJPanel默认是FlowLayout。
————————————————
版权声明:本文为优快云博主「Ryuka-fly」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/xlh1991/article/details/16986555
        */

        a.setResizable(false);//设置窗口大小固定,不可调整
		a.setVisible(true);//设置可见性

我们还有一个类是Frame,他们两个有什么区别呢 

1. JFrame是Frame的子类,JFrame在javax.swing包内,Frame在包java.awt包中

2.  关闭窗口的方式不同 后面有具体例子
   JFrame的关闭方式:setDefaultCloseOperation(EXIT_ON_CLOSE);

   Frame的关闭方式:利用窗口监听事件

 

GUI主要靠两个包实现:awt与swing

主要是Swing和awt的区别,例如JPanel与Panel,JButton和Button,JLable与Lable,JDialog与Dialog,JApplet与Applet。
awt是底层(不带J),swing是封装(带J),swing是awt的优化,它比awt多出一些功能,要根据实际情况进行使用。

awt:抽象窗口工具包,早期编写图形界面应用程序的包。使用本地方法实现,为重量级控件

swing :为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。不需要使用本地方法实现,为轻量级控件

swing上有四个顶级容器JFrame、JDialog、JApplet和JWindow。顶层容器类并不是轻量级组件,而是重量级组件

当轻量级组件和重量级组件一起使用时,如果组件区域有重叠,则“重量级”组件总是显示在最上面,因此这两种组件不建议一起使用。

 

JPanel 弹窗(作为JFrame中间容器)不能单独存在

主要方法同JFrame差不多,JPanel可以加到窗口上

import javax.swing.JPanel;

import java.awt.Color;

//创建弹窗对象,弹窗不能独立存在
		JPanel p=new JPanel();
		p.setBackground(Color.yellow);//设置弹窗颜色
		a.add(p);//将弹窗添加到界面去,此时窗口颜色变了

JButton 按钮与 事件监听 ActionListener

添加按钮到容器上,按钮主要是用于触发监听事件 

import javax.swing.JButton;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

//创建按钮
		JButton b=new JButton("我的按钮");
		/*a.add(b);//将按钮添加到窗口,整个窗口都是按钮*/
		p.add(b);//按钮在标签右边
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("触发事件");
			}});
		//添加按钮触发事件,此例子所触发的事件是每点一次按钮就会打印一次触发事件
	}

}

按钮还可以分为单选按钮和复选按钮

 

JLabel 标签

添加标签到容器上,可分为文本标签和图片标签

import javax.swing.JLabel; 

//创建标签
		JLabel l = new JLabel("Hello World");
		p.add(l);//将标签添加到弹窗,此时背景颜色为黄色,标签位于第一行正中间
	    //a.add(l);//将标签添加到窗口,此时背景颜色为默认颜色,标签位于窗口中间顶格

		

标签可设置图标,图片标签可添加到容器中也可添加到按钮中

首先我们要将图片拖动到我们的软件包包中,如下图

 

再编写代码如下 

public class Demo {
    public static void main(String[] args) {
        new myFrame("我的标题");
    }
}


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

public class myFrame extends JFrame {
    public myFrame(String title){
        super(title);
        setBounds(200,200,300,350);
        setVisible(true);
        Container container=getContentPane();//容器实例化
        container.setBackground(Color.CYAN);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

//文字标签
//        JLabel lable=new JLabel("hello world");
//        this.add(lable);
//        lable.setHorizontalAlignment(SwingConstants.CENTER);//让文本标签居中,设置水平对齐
//图标
        JLabel label=new JLabel();
        URL url=myFrame.class.getResource("微信图片_20220415104317.jpg");
        //类名.class.getResource() 由字节码对象调用,接受一个字符串参数,获取目录
        // 如果以”/”开头,就在classpath根目录下找(不会递归查找子目录)
        // 如果不以”/”开头,就在调用getResource的字节码对象所在目录下找
        ImageIcon imageIcon=new ImageIcon(url);
        /*图标可添加在标签上,
        label.setIcon(imageIcon);
        container.add(label);*/
        //也可添加在按钮上
        JButton jButton =new JButton();
        jButton.setIcon(imageIcon);
        container.add(jButton);
        
    }

}

布局管理器   

组件在窗口与面板上的布局,一般分为一下三种,主要是要搞清楚不同布局的设置与静态变量代表意义,不同布局可以嵌套使用 

import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.GridLayout;

流式布局 分为左右中

        p.setLayout(new FlowLayout());//流式布局,默认居中
		p.setLayout(new FlowLayout(FlowLayout.LEFT));//流式布局,LEFT左RIGHT右
		p.add(b);

边框布局 分为东西南北中

       p.setLayout(new BorderLayout());//边框布局,默认居中CENTER
       a.add(l,BorderLayout.EAST);//边框布局,东EAST西WEST南SOUTH北NOUTH中CENTER
       

表格布局 分为几行几列

        p.setLayout(new GridLayout(2,3));//两行三列
		JButton b1=new JButton("1");
		JButton b2=new JButton("2");
		JButton b3=new JButton("3");
		JButton b4=new JButton("4");
		JButton b5=new JButton("5");
		JButton b6=new JButton("6");
		p.add(b1);
		p.add(b2);
		p.add(b3);
		p.add(b4);
		p.add(b5);
		p.add(b6);

TextFiled 输入框 与 窗口关闭事件

输入框用于输入文本,可添加到容器中

窗口监听可以实现窗口关闭事件,我们有专门的监听事件类ActionListener(还有一个专门用于监听窗口的类WindowListener)与窗口触发事件类WindowAdapter,若是直接使用窗口触发事件类需要重写多个方法,为图方便也可以再多写一个类继承窗口触发事件类(适配器模式),这样就可以挑自己需要的方法重写

public class test {

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

        }

}



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

public class myFrame extends Frame {

    public myFrame(){
        JTextField t=new JTextField();//新建输入框
        add(t);//因为myFrame继承于Frame,因此可以直接用add方法
        setVisible(true);//设置可见性
        pack();//自定义窗口大小位置
        MyActionListener myActionListener=new MyActionListener();//添加监听
        t.addActionListener(myActionListener);//添加输入框触发事件
        addWindowListener(new myWindowAdapter());//添加窗口关闭事件
    }

}



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

public class myWindowAdapter extends WindowAdapter {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
}




public class MyActionListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        JTextField field=(JTextField)e.getSource();//事件源是输入框输入的文本,将事件源转化为输入框对象即可使用他的方法
        //用e.getSource()获得事件发起者
        System.out.println(field.getText());//打印得到的文本
        field.setText("");//敲下空格则全部消失,重新开始
    }
}

画笔 与 鼠标监听

实现鼠标画点

awt有画笔,swing有画图 

实现鼠标画点,我们要思考如何得到鼠标点击的点(鼠标监听器),如何存放收集到的点数据(ArrayList集合,Point对象),如何画点(使用迭代器遍历收集到的点数据,利用paint画笔画)

这些操作全部在同一个类中,因为鼠标点的数据要共用

//实现鼠标画点
public class PaintTest {
    public static void main(String[] args){
        new myPaint("画图");
    }
}




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

public class myPaint extends JFrame {
     ArrayList points;//集合存储画点

     public myPaint(String n){//构造方法

        setTitle(n);//将传入的字符串设置为标题
        setBounds(100,100,400,400);//设置窗口位置,大小
        add(new Paint());//添加面板
        setResizable(false);//设置大小固定
        setVisible(true);//最后设为可见
        points=new ArrayList<>();//创建一个ArrayList集合存储鼠标点击的点
        this.addMouseListener(new myMouseList());//鼠标监听器,针对窗口
        setDefaultCloseOperation(EXIT_ON_CLOSE);//窗口关闭
     }

    public void paint(Graphics g) {//画画方法,需要监听鼠标事件

       /* super.paint(g);//初始化
        g.setColor(Color.RED);//画笔颜色
        g.drawOval(100,100,50,50);//画空心圆
        //g.fillOval(20,20,30,50);//画实心圆
        g.fillRect(150,150,100,100);//画实心正方形
        */

        Iterator iterator = points.iterator();//迭代器

        while (iterator.hasNext()) {//当还有下一个点时,即该点不是最后一个点时
            Point point = (Point) iterator.next();
            g.setColor(Color.RED);//设置画笔颜色为红色
            g.fillOval(point.x, point.y, 20, 20);//画点
        }

    }


    public void addPaint(Point point) {//将点添加到集合
        points.add(point);
    }

    private class myMouseList extends MouseAdapter {//内部类

        public void mousePressed(MouseEvent e){//当鼠标按下时

            myPaint p=(myPaint) e.getSource();//当我们点击时,点击的地方会形成一个点作为事件源
            p.addPaint(new Point(e.getX(),e.getY()));//将点添加到面板
            p.repaint();//刷新重画

        }

    }

}

键盘监听

public class KeyDemo {
    public static void main(String[] args) {
        new myKeyFrame("键盘监听");
    }
}


import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import static javax.swing.WindowConstants.EXIT_ON_CLOSE;

public class myKeyFrame extends Frame {
    public myKeyFrame(String title){
        super(title);
        setBounds(100,100,300,300);
        setBackground(Color.CYAN);
        setResizable(false);
        setVisible(true);
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if(e.getKeyCode()==KeyEvent.VK_C){
                    System.out.println("you are press in C");
                }

            }
        });
    }
}

JDialog弹窗 自带窗口关闭事件

public class Demo {
    public static void main(String[] args) {
        new myFrame("我的标题");
    }
}



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

public class myFrame extends JFrame {
    public myFrame(String title){
        super(title);
        setBounds(200,200,300,350);
        setVisible(true);
        Container container=getContentPane();//容器实例化
        container.setBackground(Color.CYAN);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        container.setLayout(null);

        JButton button = new JButton("点击弹出对话框");
        button.setBounds(100,100,100,150);

        //使用监听事件,当按下按钮时弹出弹窗
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new myJDialog();
            }
        });

        container.add(button);

    }

}




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

public class myJDialog extends JDialog{

    //myJDialog.add(new JLabel("java"));不行

    public myJDialog() {
        setVisible(true);
        setBounds(100,100,500,500);
        //setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 默认已有这个功能
        Container container = this.getContentPane();
        container.add(new Label("hello world"));
    }

}

列表 分为 下拉框JComboBox 与 列表框JList

文本框JTextField 参照上文的TsxtField

文本域JTextArea 文本域可以换行,文本框不能换行

密码框 JPasswordField

贪吃蛇案例

待续

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛酸菜吃鸭子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值