Java期末复习题之GUI

点击返回标题->23年Java期末复习-CSDN博客

第1题.

一、利用Swing包创建一个窗口,窗口位置为(220,160)、大小为320×240,并在窗口(20,80)、(120,80)、(220,80)处各设置一个按钮,按钮大小为80 X 40。

点击左按钮将窗口背景的红色分量增加10,点击中间按钮将窗口背景的绿色分量增加10,点击右按钮将窗口背景的蓝色分量增加10,上述三种分量大于255时变成0,下面面板的颜色同步改变,点击窗口关闭按钮时退出程序运行。

①分析布局

题目要求按钮的位置和大小,说明需要使用的布局是空布局,但JFrame窗口的内容面板默认布局是边界布局(BorderLayout),所以需要设置一下,注意是设置Jpanel类对象(容器)的布局,而不是窗口的布局。

pane.setLayout(null);

②关于颜色,

Color类提供一个有参构造,传入rgb三原色的参数,返回对应的颜色。在代码中我采取匿名对象的形式去实例化这个颜色对象。而r,g,b是我定义在主类中的成员变量,通过监听按下的按钮,对r,g,b三个变量的值进行修改,然后更新(setBackground)背景颜色。

pane.setBackground(new Color(r, g, b));

③事件处理,

点击按钮,会触发ActionEvent事件,这个事件会被ActionListener接收器接收到, 只需要重写ActionListener里的actionPerformed 方法,即可实现点击按钮后,做某件事。

拿"红色"按钮举例,添加监听事件的对象采取匿名内部类的方式(如果忘了见本篇Java内部类-CSDN博客的标题二的子标题④学习),实现其中的actionPerformed方法,其它细节在注释中已经详细阐述了。剩余两个按钮同理。

button1.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        r += 10;//让颜色分量r加10
        r = r > 255 ? 0 : r;//如果r超过10就赋值为0,否则就不变
        pane.setBackground(new Color(r, g, b));//重新设置背景颜色
    }
});

完整代码如下:

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


public class Main {

    int r = 90, g = 20, b = 180;

    public static void main(String[] args) {
        Main test = new Main();
        test.createGUI();
    }

    public void createGUI() {
        JFrame fr = new JFrame("这是主窗口");//通常直接在有参构造的时候命名,省得后续用setTitle()方法命名了。
        fr.setBounds(220, 160, 320, 240);
        fr.setVisible(true);//设置窗体可见,基本必写吧?
        fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗体关闭按钮响应事件为关闭此窗口。

        //创建容器和按钮组件,对按钮添加监听类对象,最后把按钮塞到容器中。
        JPanel pane = new JPanel();
        JButton button1 = new JButton("红色");
        JButton button2 = new JButton("绿色");
        JButton button3 = new JButton("蓝色");
        
        //给按钮组件设置位置、大小等参数,采用匿名内部类的方式实例化监听类对象并添加给按钮
        button1.setLocation(20, 80);
        button1.setSize(80, 40);
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                r += 10;//让颜色分量r加10
                r = r > 255 ? 0 : r;//如果r超过10就赋值为0,否则就不变
                pane.setBackground(new Color(r, g, b));//重新设置背景颜色
            }
        });

        button2.setLocation(120, 80);
        button2.setSize(80, 40);
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                g += 10;
                g = g > 255 ? 0 : g;
                pane.setBackground(new Color(r, g, b));
            }
        });

        button3.setLocation(220, 80);
        button3.setSize(80, 40);
        button3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                b += 10;
                b = b > 255 ? 0 : b;
                pane.setBackground(new Color(r, g, b));
            }
        });
        //把按钮添加到容器中
        pane.setLayout(null);//题目明确的指出了按钮的位置和大小 ,那么说明需要使用的布局是空布局(绝对布局)
        pane.add(button1);
        pane.add(button2);
        pane.add(button3);
        //把容器放在窗口中
        fr.add(pane);
    }
}

博客中不方便展示效果图,请自行复制到IDE中进行验证。


第2题.(建议略过)

二、用swing包和布局管理器设计如下图所示调色板界面。点击加减按钮能改变颜色值中各色值的分量,下面面板的颜色同步改变

 说实话这题难度有点大了,蒟蒻博主实在是花了很长很长的时间硬磕(与应付期末考的初心背道而驰🤦‍),没办法最后参考了大佬的写法,最终才潦草写出来(还有一堆bug不会改),这种情况下要我教学很难了(如果你也跟我一样是为了应对期末考,实在不建议多花一分钟在这题上,晦气(╯▔皿▔)╯),我只好贴个代码和原链接->Java图形用户界面设计_用swing包和布局管理器设计如下图所示调色板界面。点击加减按钮能改变颜色值中各-CSDN博客

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

public class Main extends JFrame {
    //三个标签
    Label l1, l2, l3;
    //六个按钮(三个➕,三个➖)
    Button add1, add2, add3, sub1, sub2, sub3;
    //三个文本框
    TextField tf1, tf2, tf3;
    int count1, count2, count3;
    Color c;
    //两个面板
    Panel p = new Panel();
    Panel p1 = new Panel();
    //设置布局
    GridBagLayout gbl = new GridBagLayout();
    GridBagConstraints gbc = new GridBagConstraints();

    //构造器
    public Main() {

        setSize(500, 400);
        p.setLayout(gbl);
        gbc.fill = GridBagConstraints.BOTH;
        this.setLabel();
        this.setButton_add();
        this.setTxetField();
        this.setButton_sub();
        this.setPanel();
        add(p);
        setVisible(true);
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

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

    private void setPanel() {
        gbc.weightx = 10;
        gbc.weighty = 10;
        gbc.gridx = 0;
        gbc.gridy = 4;
        gbc.gridwidth = 4;
        gbc.insets = new Insets(10, 10, 10, 10);
        p1.setBackground(new Color(220, 220, 220));
        gbl.setConstraints(p1, gbc);
        p.add(p1);

    }

    private void setButton_sub() {
        sub1 = new Button("-");
        sub2 = new Button("-");
        sub3 = new Button("-");
        sub1.setFont(new Font("宋体", Font.PLAIN, 20));
        sub2.setFont(new Font("宋体", Font.PLAIN, 20));
        sub3.setFont(new Font("宋体", Font.PLAIN, 20));
        gbc.gridx = 3;
        gbc.gridy = 0;
        gbl.setConstraints(sub1, gbc);
        gbc.gridy = 1;
        gbl.setConstraints(sub2, gbc);
        gbc.gridy = 2;
        gbl.setConstraints(sub3, gbc);
        p.add(sub1);
        p.add(sub2);
        p.add(sub3);
        sub1.addActionListener(new changeText());
        sub2.addActionListener(new changeText());
        sub3.addActionListener(new changeText());

    }

    private void setTxetField() {
        tf1 = new TextField(5);
        tf2 = new TextField(5);
        tf3 = new TextField(5);

        tf1.setText("220");
        tf2.setText("220");
        tf3.setText("220");

        count1 = Integer.parseInt(tf1.getText());
        count2 = Integer.parseInt(tf1.getText());
        count3 = Integer.parseInt(tf1.getText());

        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.gridx = 2;
        gbc.gridy = 0;
        gbl.setConstraints(tf1, gbc);
        gbc.gridy = 1;
        gbl.setConstraints(tf2, gbc);
        gbc.gridy = 2;
        gbl.setConstraints(tf3, gbc);

        p.add(tf1);
        p.add(tf2);
        p.add(tf3);

        tf1.addTextListener(new changeText());
        tf2.addTextListener(new changeText());
        tf3.addTextListener(new changeText());

        this.setKeyPress(tf1);
        this.setKeyPress(tf2);
        this.setKeyPress(tf3);
    }

    private void setKeyPress(TextField tf) {
        //具体看addKeyListener的使用方法和说明
        tf.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                char ch = e.getKeyChar();
                if (!(ch >= '0' && ch <= '9')) {
                    e.consume();
                }
            }
        });
    }

    private void setButton_add() {
        add1 = new Button("+");
        add2 = new Button("+");
        add3 = new Button("+");
        add1.setFont(new Font("宋体", Font.PLAIN, 20));
        add2.setFont(new Font("宋体", Font.PLAIN, 20));
        add3.setFont(new Font("宋体", Font.PLAIN, 20));
        gbc.insets = new Insets(10, 80, 10, 10);//组件间间距
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbl.setConstraints(add1, gbc);
        gbc.gridy = 1;
        gbl.setConstraints(add2, gbc);
        gbc.gridy = 2;
        gbl.setConstraints(add3, gbc);
        p.add(add1);
        p.add(add2);
        p.add(add3);
        add1.addActionListener(new changeText());
        add2.addActionListener(new changeText());
        add3.addActionListener(new changeText());
    }

    private void setLabel() {//设置3个标签
        l1 = new Label("红色", Label.CENTER);
        l2 = new Label("绿色", Label.CENTER);
        l3 = new Label("蓝色", Label.CENTER);
        //设置标签背景色
        l1.setBackground(Color.RED);
        l2.setBackground(Color.GREEN);
        l3.setBackground(Color.BLUE);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.insets = new Insets(10, 10, 10, 10);
        gbl.setConstraints(l1, gbc);
        gbc.gridy = 1;
        gbl.setConstraints(l2, gbc);
        gbc.gridy = 2;
        gbl.setConstraints(l3, gbc);
        p.add(l1);
        p.add(l2);
        p.add(l3);
    }

    //实现接口中的方法actionPerformed和textValueChanged
    private class changeText implements ActionListener, TextListener {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == add1) {
                count1++;
                count1 = count1 > 255 ? 0 : count1;//边界判断防止参数越界
                tf1.setText((count1) + "");
            }
            if (e.getSource() == add2) {
                count2++;
                count2 = count2 > 255 ? 0 : count2;//边界判断防止参数越界
                tf2.setText((count2) + "");
            }
            if (e.getSource() == add3) {
                count3++;
                count3 = count2 > 255 ? 0 : count3;//边界判断防止参数越界
                tf3.setText((count3) + "");
            }

            if (e.getSource() == sub1) {
                count1--;
                count1 = count1 < 0 ? 255 : count1;//边界判断防止参数越界
                tf1.setText((count1--) + "");
            }
            if (e.getSource() == sub2) {
                count2--;
                count2 = count2 < 0 ? 255 : count2;//边界判断防止参数越界
                tf2.setText((count2--) + "");
            }
            if (e.getSource() == sub3) {
                count3--;
                count3 = count3 < 0 ? 255 : count3;//边界判断防止参数越界
                tf3.setText((count3--) + "");
            }
            //字符串转整数,方便设置背景颜色参数
            int c1 = Integer.parseInt(tf1.getText());
            int c2 = Integer.parseInt(tf2.getText());
            int c3 = Integer.parseInt(tf3.getText());

            p1.setBackground(new Color(c1, c2, c3));//重新设置面板颜色
        }

        public void textValueChanged(TextEvent e) {
            c = new Color(Integer.parseInt(tf1.getText()), Integer.parseInt(tf2.getText()), Integer.parseInt(tf3.getText()));
            p1.setBackground(c);
        }
    }
}

 


第3题.

三、鼠标事件处理:要求创建一个按钮,鼠标选中按钮不放开,将按钮拖拽到窗口其它他位置后,放开鼠标

 

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;


public class Main extends JFrame {

    private JPanel contentPane;

    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(660, 500);
        setLocationRelativeTo(null);
        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        add(contentPane);

        JPanel panel = new JPanel();
        contentPane.add(panel, BorderLayout.CENTER);
        panel.setBorder(BorderFactory.createLineBorder(Color.orange, 2));
        panel.setLayout(null);

        JButton button = new JButton("拖动我");
        button.setBounds(82, 85, 80, 20);
        panel.add(button);

        MyListener m = new MyListener();
        button.addMouseListener(m);
        button.addMouseMotionListener(m);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    // 写一个类继承鼠标监听器的适配器,这样就可以免掉不用的方法。  
    class MyListener extends MouseAdapter {
        //这两组x和y为鼠标点下时在屏幕的位置和拖动时所在的位置  
        int newX, newY, oldX, oldY;
        //这两个坐标为组件当前的坐标  
        int startX, startY;

        @Override
        public void mousePressed(MouseEvent e) {
            //此为得到事件源组件  
            Component cp = (Component) e.getSource();
            //当鼠标点下的时候记录组件当前的坐标与鼠标当前在屏幕的位置  
            startX = cp.getX();
            startY = cp.getY();
            oldX = e.getXOnScreen();
            oldY = e.getYOnScreen();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            Component cp = (Component) e.getSource();
            //拖动的时候记录新坐标  
            newX = e.getXOnScreen();
            newY = e.getYOnScreen();
            //设置bounds,将点下时记录的组件开始坐标与鼠标拖动的距离相加  
            cp.setBounds(startX + (newX - oldX), startY + (newY - oldY), cp.getWidth(), cp.getHeight());
        }

    }
}  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/265471.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++哈希表的实现

C哈希表的实现 一.unordered系列容器的介绍二.哈希介绍1.哈希概念2.哈希函数的常见设计3.哈希冲突4.哈希函数的设计原则 三.解决哈希冲突1.闭散列(开放定址法)1.线性探测1.动图演示2.注意事项3.代码的注意事项4.代码实现 2.开散列(哈希桶,拉链法)1.概念2.动图演示3.增容问题1.拉…

互联网+建筑工地源码,基于微服务+Java+Spring Cloud +Vue+UniApp开发

一、智慧工地概念 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移动通讯、云计算、物联网等信息技术&#xff0c;通过人机交互、感知、决策、执行和…

【YOLOV8预测篇】使用Ultralytics YOLO进行检测、分割、姿态估计和分类实践

目录 一 安装Ultralytics 二 使用预训练的YOLOv8n检测模型 三 使用预训练的YOLOv8n-seg分割模型 四 使用预训练的YOLOv8n-pose姿态模型 五 使用预训练的YOLOv8n-cls分类模型 <

序列化和反序列化对比分析,序列化和反序列化输出十个学生信息截图

序列化和反序列化是数据处理中的两个相对的概念&#xff0c;通常用于对象的存储和传输。下面是对这两个过程的对比分析&#xff1a; 序列化&#xff08;Serialization&#xff09; 定义 目的&#xff1a; 将对象的状态信息转换成可以存储或传输的形式&#xff08;如XML, JSO…

算数平均数、调和平均数、几何平均数的计算方法与应用场合

一 定义 1、算数平均数&#xff1a;又称均值&#xff0c;是统计学中最基本&#xff0c;最常用的一种平均指标&#xff0c;分为简单算术平均数、加权算术平均数。 2、调和平均数&#xff1a;又称倒数平均数&#xff0c;是总体各统计变量倒数的算数平均数的倒数。分为数学调和平…

Yolov5水果分类识别+pyqt交互式界面

Yolov5 Fruits Detector Yolov5 是一种先进的目标检测算法&#xff0c;可以应用于水果分类识别任务。结合 PyQT 框架&#xff0c;可以创建一个交互式界面&#xff0c;使用户能够方便地上传图片并获取水果分类结果。以下将详细阐述 Yolov5 水果分类识别和 PyQT 交互式界面的实现…

什么是网络工程师? 就业前景好吗?

互联网发展日渐成熟&#xff0c;所有企业都依赖于网络管理&#xff0c;有企业的地方就需要网络工程师。 在一般人的概念里&#xff0c;网络工程师不过就是通过拨号上网&#xff0c;发个Email&#xff0c;聊聊天&#xff0c;计算机组装与维护&#xff0c;组建局域网就以为是网络…

Node.js安装部署

Node.js安装部署 在 Windows 上安装 Node.js1.使用安装程序2.使用包管理器 Chocolatey 安装 在 macOS 上安装 Node.js1.使用 Homebrew 安装 在 Linux 上安装 Node.js1.使用包管理器安装2.使用 Node.js 官方二进制包 安装完成验证 Node.js 是一个基于 Chrome V8 引擎的 JavaScri…

threejs中修改鼠标cursor不生效的问题修复

需求&#xff1a; 当鼠标hover一个元素时&#xff0c;cursor为自定义的图标 问题描述&#xff1a; threejs中修改canvas的鼠标cursor为自定义的图标不生效。 问题原因&#xff1a; 引入了dragcontrols&#xff0c;查看dragControls的代码&#xff0c;可以看到代码中有对cur…

XPM_CDC_PULSE

MACRO_GROUP: XPM MACRO_SUBGROUP: XPM_CDC 1、Introduction 此宏将源时钟域中的脉冲同步到目标时钟域。源时钟域中任何大小的脉冲&#xff0c;如果正确启动&#xff0c;将生成单个目标时钟周期大小的脉冲。 为了正确操作&#xff0c;输入数据必须由目标时钟采样两次或…

饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜

饥荒Mod 开发(二十)&#xff1a;显示打怪伤害值 源码 游戏中的物品栏容量实在太小了&#xff0c;虽然可以放在箱子里面但是真的很不方便&#xff0c;外出一趟不容易看到东西都不能捡。实在是虐心。 游戏中的食物还有变质机制&#xff0c;时间长了就不能吃了&#xff0c;玩这个游…

如何在Portainer部署一个web站点到Nginx容器并结合内网穿透远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder

现代大型语言模型&#xff08;LLM&#xff09;的演变进化树&#xff0c;如下图&#xff1a; https://arxiv.org/pdf/2304.13712.pdf 基于 Transformer 模型以非灰色显示&#xff1a; decoder-only 模型在蓝色分支&#xff0c; encoder-only 模型在粉色分支&#xff0c; encod…

国际站店铺装修外贸平台alibaba鼠标经过渐变的效果功能代码代码生成器店铺装修旺铺旺铺装修生成器阿里巴巴国际站店铺怎么装修首页进入装修后台自定义内容模块

国际站店铺装修外贸平台alibaba鼠标经过渐变的效果功能代码代码生成器店铺装修旺铺旺铺装修生成器阿里巴巴国际站店铺怎么装修首页进入装修后台自定义内容模块 鼠标经过有个渐变的效果功能

寒风中,新能源汽车续航严重打折,消费者重投燃油车怀抱

统计数据显示&#xff0c;12月12日至12月17日这一周&#xff0c;燃油车销量大幅反弹&#xff0c;燃油车的环比增速远高于新能源汽车领军者比亚迪&#xff0c;似乎显示出消费者再度青睐燃油车&#xff0c;导致如此结果在于新能源汽车在寒冬中的表现让人失望。 一、燃油车销量增速…

python读取Excel内容并展示成json

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 伙伴们&#xff0c;又是许久未曾见面了。最近也是在忙着加班&#xff0c;加上没有新技术的输入和产出&…

Linux Centos-7.5_64bit 系统等保测评内容

一、身份鉴别 a) 应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换 指引&#xff1a;1.观察管理员登录方式。2.查看系统配置&#xff0c;记录配置参数。&#xff08;more /etc/pam.d/system-auth、more /et…

C语言:差分

【模板】差分_牛客题霸_牛客网 (nowcoder.com) 上图中[1,2]4d[0]4,d[1]4,d[2]4,d[3]4...d[2]-4,d[3]-4... [3,3]-2d[2]-2,d[3]-2,d[4]-2....d[3]2,d[4]2... 通过求前缀和操作&#xff0c;相当于用另一个数组完成了差分操作&#xff0c;再将原数组加上该数组&#xff0c;即可得…

HTML+CSS做一个时尚柿子造型计时器

文章目录 💕效果展示💕代码展示HTMLJS💕效果展示 💕代码展示 HTML <!DOCTYPE html> <html lang

ABS210-ASEMI手机适配器整流桥ABS210

编辑&#xff1a;ll ABS210-ASEMI手机适配器整流桥ABS210 型号&#xff1a;ABS210 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 特性&#xff1a;贴片、整流桥 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 恢复时间&#xff1a;&#xff…