javafx的ListView代入项目的使用

news2024/9/24 3:26:50

目录

1. 创建一个可观察的列表,用于存储ListView中的数据,这里的User是包装了用户的相关信息。

2.通过本人id获取friendid,及好友的id,然后用集合接送,更方便直观一点。

3.用for遍历集合,逐个添加。

4.渲染器(ImageCellFctoryFriendList)定制

5.渲染器具体方法如下:


1. 创建一个可观察的列表,用于存储ListView中的数据,这里的User是包装了用户的相关信息。

 // 创建一个可观察的列表,用于存储ListView中的数据
  ObservableList<User> friendList = FXCollections.observableArrayList();

记得把javafx的你需要使用的ListView命名

2.通过本人id获取friendid,及好友的id,然后用集合接送,更方便直观一点。

​
 List<User> ren = (List<User>) Connection.ois.readObject();//我的id,好友id及添加时间

​

3.用for遍历集合,逐个添加。

for (User user : ren) {  

sitItems展示我添加的好友信息(项目中我只展示了好友的头像,昵称及在线状态)

​
 this.friendListview.setItems(this.friendList);
                    this.friendList.add(person);

​

最后,通过setCellFctory(渲染器)展示控件的每个单元格,并且它可以允许你为每个单元格提供一个定制的渲染器,这里我定制的渲染器为ImageCellFctoryFriendList(方法名自定义),为自定义函数,格式需要一样,但是内容可以自定义。

 this.friendListview.setCellFactory(new ImageCellFactoryFriendList());

4.渲染器(ImageCellFctoryFriendList)定制

具体代码在本文章的最后!!!

这里先获取需要的用户信息,然后进行展示,两个50分别为展示头像的长和宽。

 //更新单元格内容
                    String username = listviewmember.name;//获取用户名
                    String imagePath = listviewmember.image;//获取用户头像
                    int online = listviewmember.online; // 获取用户在线状态
                    //显示头像
                    File imageFile = new File(imagePath);
                    Image images = new Image(imageFile.toURI().toString());
                    this.imageView.setFitWidth(50.0);
                    this.imageView.setFitHeight(50.0);
                    this.imageView.setImage(images);
                    this.setGraphic(this.imageView);
                    // 设置用户名
                    setText(username);
                    // 设置在线状态的颜色
                    if (online==1) {
                        setTextFill(Color.GREEN); // 在线状态为绿色
                        setText(username + " (在线)");
                    } else {
                        setTextFill(Color.RED); // 不在线状态为红色
                        setText(username + " (离线)");
                    }
                    this.setPrefHeight(-1.0);

设置右击菜单,这里右会出现两个按钮,

option1.setOnAction((event) -> {是设置点击按钮1,执行查看资料功能,内容可以直接设置。

注意:有几个按钮就需要添加几个进MenuItem。

          //设置右键菜单
                    ContextMenu contextMenu = new ContextMenu();
                    MenuItem option1 = new MenuItem("查看资料");
                    MenuItem option2 = new MenuItem("删除好友");
                    contextMenu.getItems().addAll(new MenuItem[]{option1,option2});
                    this.setContextMenu(contextMenu);
                    //查看资料
                    option1.setOnAction((event) -> {

最后显示之前设置的MenuItem。

//设置鼠标点击事件,当右键点击时,显示上述创建的ContextMenu
                    this.setOnMouseClicked((event) -> {
                        if (event.getButton() == MouseButton.SECONDARY) {
                            contextMenu.show(this, event.getScreenX(), event.getScreenY());
                        }
                    });

具体效果如下:

5.渲染器具体方法如下:

其中User为用户信息,MarkTool类是为了方便客户端,服务端传递信息的。


public class ImageCellFactoryFriendList implements Callback<ListView<User>, ListCell<User>> {
    public ImageCellFactoryFriendList() {
    }

    public ListCell<User> call(ListView<User> param) {
        return new ListCell<User>() {
            private ImageView imageView = new ImageView();
            protected void updateItem(User listviewmember, boolean empty) {
                super.updateItem(listviewmember, empty);
                if (!empty && listviewmember != null) {
                    //更新单元格内容
                    String username = listviewmember.name;//获取用户名
                    String imagePath = listviewmember.image;//获取用户头像
                    int online = listviewmember.online; // 获取用户在线状态
                    //显示头像
                    File imageFile = new File(imagePath);
                    Image images = new Image(imageFile.toURI().toString());
                    this.imageView.setFitWidth(50.0);
                    this.imageView.setFitHeight(50.0);
                    this.imageView.setImage(images);
                    this.setGraphic(this.imageView);
                    // 设置用户名
                    setText(username);
                    // 设置在线状态的颜色
                    if (online==1) {
                        setTextFill(Color.GREEN); // 在线状态为绿色
                        setText(username + " (在线)");
                    } else {
                        setTextFill(Color.RED); // 不在线状态为红色
                        setText(username + " (离线)");
                    }
                    this.setPrefHeight(-1.0);
                    //设置右键菜单
                    ContextMenu contextMenu = new ContextMenu();
                    MenuItem option1 = new MenuItem("查看资料");
                    MenuItem option2 = new MenuItem("删除好友");
                    contextMenu.getItems().addAll(new MenuItem[]{option1,option2});
                    this.setContextMenu(contextMenu);
                    //查看资料
                    option1.setOnAction((event) -> {
                        System.out.println("查看资料按钮!!");
                        LookPersonalData.id = listviewmember.id;
                        LookPersonalData.user=listviewmember;
                        FriendPersonalData.user = listviewmember;//???
                        URL url = this.getClass().getResource("LookPersonalData.fxml");
                        if (url == null) {
                            System.err.println("无法找到LookPersonalData.fxml资源文件");
                        } else {
                            Parent root = null;
                            try {
                                root = (Parent)FXMLLoader.load(url);
                            } catch (IOException var7) {
                                IOException e = var7;
                                e.printStackTrace();
                                return;
                            }
                            Stage stage = new Stage();
                            stage.setTitle("个人界面");
                            stage.initStyle(StageStyle.UTILITY);
                            Scene scene = new Scene(root, 800.0, 640.0);
                            stage.setScene(scene);
                            stage.show();
                        }
                    });
                    //删除好友
                    option2.setOnAction((event) -> {
                        System.out.println("删除好友按钮!!");
                           try {
                                String id = listviewmember.id;
                                String friendid = listviewmember.friendid;

                                User u = new User(id, friendid);
                                String Operation = MarkTool.DeleteFriend;
                                Connection.oos.writeObject(Operation);
                                Connection.oos.writeObject(u);
                                String response = Connection.ois.readObject().toString();
                                System.out.println(response + "删除成功与否结果已收到");//103    yes
                                if (response.equals(MarkTool.DeleteFriendfail)) {
                                    Alert alertxx = new Alert(Alert.AlertType.INFORMATION);
                                    alertxx.setTitle("错误");
                                    alertxx.setHeaderText((String)null);
                                    alertxx.setContentText("删除失败,看样子他不想失去你呢!");
                                    alertxx.showAndWait();
                                }else {
                                    Alert alertx = new Alert(Alert.AlertType.INFORMATION);
                                    alertx.setTitle("正确");
                                    alertx.setHeaderText((String) null);
                                    alertx.setContentText("删除成功,减少一位损友!");
                                    alertx.showAndWait();
                                }
                            }  catch (IOException var15) {
                                IOException exx = var15;
                                throw new RuntimeException(exx);
                            } catch (ClassNotFoundException var16) {
                                ClassNotFoundException ex = var16;
                                throw new RuntimeException(ex);
                            }
                    });
                    //设置鼠标点击事件,当右键点击时,显示上述创建的ContextMenu
                    this.setOnMouseClicked((event) -> {
                        if (event.getButton() == MouseButton.SECONDARY) {
                            contextMenu.show(this, event.getScreenX(), event.getScreenY());
                        }
                    });
                } else {
                    this.setText((String)null);
                    this.setGraphic((Node)null);
                    this.setPrefHeight(0.0);
                }

            }
        };
    }
}

6.打开界面的默认执行函数,显示好友

 //发来好友申请集合遍历
    void Friendagrees()throws IOException, ClassNotFoundException{
        this.friendList.clear();
        System.out.println("正在获取好友申请信息");//先通过我的id查询向我添加好友的的人的id
        User er = new User(idself);//j=就一个id
        String Operation = MarkTool.added;//90 yes
        Connection.oos.writeObject(Operation);
        Connection.oos.writeObject(er);
        String response = Connection.ois.readObject().toString();//93 yes
        if (response.equals(MarkTool.returnaddedsuccess)) {
            List<User> ren = (List<User>) Connection.ois.readObject();添加我的人的id,我id,是否同意(状态),添加时间
            System.out.println(ren);
            System.out.println("目前集合ren的个数为:" + ren.size());
            for (User user : ren) {            //遍历user集合,防止多个人添加
                if (user == null) break;
                User er1 = new User(user.id);
                String Operation1 = MarkTool.person;
                Connection.oos.writeObject(Operation1);//获取指定用户信息
                Connection.oos.writeObject(er1);
                String response1 = Connection.ois.readObject().toString();
                if (response1.equals(MarkTool.returnpersonsuccess)) { //然后获取它的全部信息
                    System.out.println("正在获取id为:" + user.id + "的消息");
                    User person;
                    person = (User) Connection.ois.readObject();
                    person.relation = user.relation;
                    person.time = user.time;
                    person.friendid = idself;
//                    System.out.println("other:" + person.id);
//                    System.out.println("my:" + person.friendid);
//                    System.out.println("签名:" + person.signature);
//                    System.out.println("生日:" + person.birthday);
//                    System.out.println("签名:" + person.name);
//                    System.out.println("性别:" + person.sex);
//                    System.out.println("头像:" + person.image);
//                    System.out.println("邮箱:" + person.email);
//                    System.out.println("申请时间:" + person.time);
//                    System.out.println("申请状态:" + person.relation);
                    LookPersonalData.user = person;//将添加人的信息全部传递给查看他人资料界面
                    this.friendlistveiw.setItems(this.friendList);
                    this.friendList.add(person);
                }
                System.out.println(user.id + "正在加入集合");
            }
            System.out.println("集合List遍历完毕");
            this.friendlistveiw.setCellFactory(new ImageCellFactorytz());
        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css各种使用案例合集(二)

1、hover动画 场景1&#xff1a;要求有旋转、变色&#xff0c;有变化过程 场景结果&#xff1a; 代码示例&#xff1a; <div class"box"><div class"headUp"></div><div class"head"></div><div class"mo…

全面整理人工智能(AI)学习路线图及资源推荐

在人工智能&#xff08;AI&#xff09;飞速发展的今天&#xff0c;掌握AI技术已经成为了许多高校研究者和职场人士的必备技能。从深度学习到强化学习&#xff0c;从大模型训练到实际应用&#xff0c;AI技术的广度和深度不断拓展。作为一名AI学习者&#xff0c;面对浩瀚的知识海…

FPC焊接座子和FPC线的线序问题,弄个转接口

焊接fpc底座 可以发现&#xff0c;也可以焊接上&#xff0c;但在原理图中的顺序连接不同可能导致顺序完全相反 FPC线顺序也可能不同 所以还是弄个转换接口&#xff0c;可是临时测试使用

智能制造有哪些发展阶段?企业推进数字化制造容易走进什么误区?

随着智能制造的浪潮席卷全球&#xff0c;我们正目睹一场前所未有的工业变革。智能制造这一集精益生产、柔性制造、敏捷制造和云制造等先进范式于一体的全新制造模式&#xff0c;正在重塑制造业的未来。 本文将深入探讨智能制造的三个发展阶段&#xff1a;数字化制造、网络化制…

Studying-代码随想录训练营day49| 42. 接雨水、84.柱状图中最大的矩形

第49天&#xff0c;单调栈part02&#xff0c;两个很经典的例题&#xff0c;编程语言&#xff1a;C 目录 42. 接雨水 84.柱状图中最大的矩形 总结&#xff1a; 42. 接雨水 文档讲解&#xff1a;代码随想录接雨水 视频讲解&#xff1a;手撕接雨水 题目&#xff1a; 42. 接雨…

轻松上手Scikit-learn——评估模型性能(准确率、精确率、召回率、ROC和AUC)

轻松上手Scikit-learn——评估模型性能&#xff08;准确率、精确率、召回率、ROC和AUC&#xff09; 安装scikit——learn pip install -U scikit-learn常用模型性能评估指标 在开始介绍之前先规定几个表示&#xff1a; 模型预测正确的正样本&#xff0c;称为真正样本&#…

AI会带来新的就业岗位吗?

最近&#xff0c;百度的首席执行官Roy在世界人工智能大会&#xff08;WAIC&#xff09;上提出了一个观点。他表示&#xff0c;大家无需过于担心人工智能会导致大量失业&#xff0c;相反&#xff0c;人工智能会创造一批新的就业岗位。他特别提到了几个核心的典型代表&#xff0c…

visual Studio怎么设置背景图片

想在visual Studio设置一个自己喜欢的背景图片&#xff0c;效果如下&#xff1a; 废话不多说&#xff0c;以Vs2022为例&#xff0c;操作步骤如下&#xff1a; 1.打开“扩展”>“管理扩展”>“搜索ClaudiaIDe”安装 或者直接下载官方安装版https://kbuchi.gallerycdn.vs…

网安科班精选!爱荷华大学教授的网络安全零基础入门教程!

网络就像一把双刃剑&#xff0c;给我们的生活、交流、工作和发展带来了便利&#xff0c;但同时也给信息安全以及个人隐私带来了威胁。网络和信息安全问题不仅影响了网络的普及和应用&#xff0c;还关系到企国家、军队、企业的信息安全和社会的经济安全&#xff0c;让人又爱又恨…

用栈实现队列(双栈思路 + 代码实现)

题目 ①双栈大体思路 1.切入点 栈先进后出&#xff0c;队列先进先出。 两个栈&#xff0c;其中一个栈可以用于颠倒顺序。顺序就跟队列一样 2.明确双栈作用 1.第一个栈接收输入&#xff08;输入栈&#xff09; 2.第二个栈转换顺序&#xff08;输出栈&#xff09; 3.四个功…

学习记录——day23 多进程编程

目录 一、多进程引入 1.1、引入目的 1.2、进程的概念 1.3、进程的种类 1.4、进程号的概念 1.5、特殊进程 0号 1号 2号 孤儿 僵尸 1.6、进程的相关命令 1&#xff09;查看进程信息的命令&#xff1a;ps 跟不同的选项&#xff0c;执行不同的状态 2&…

springboot的轻量替代框架-Solon

Java之所以是广泛使用的编程语言&#xff0c;不仅仅因为其具有跨平台性、面向对象、可靠性&#xff0c;还有很重要的一点是强大的生态系统&#xff0c;spring家族的一系列框架&#xff0c;对Java的崛起有着不可忽视的作用。 学Java的不可能不知道Spring&#xff0c;今天给大家…

品致差分探头和泰克差分探头的优势和特点分析

品致差分探头和泰克差分探头各有其独特的优势和特点&#xff0c;选择哪个更好主要取决于具体的应用场景、测试需求以及预算等因素。以下是对两个品牌差分探头的详细比较&#xff1a; 品致差分探头优势与特点&#xff1a; 高精度测量&#xff1a;品致差分探头具有高精度的测量…

docker(一):Develop faster. Run anywhere.

前言 在进行微服务部署时&#xff0c;首先需要进行部署环境的搭建。目前&#xff0c;Docker 已经成为了微服务部署的主流解决方案之一。Docker 可以帮助我们更快地打包、测试以及部署应用程序&#xff0c;从而缩短从编写到部署运行代码的周期。 在本文中&#xff0c;我们将对…

ChatGPT的高级语音功能“Her”终于上线啦!!

ChatGPT版“Her”突然开放&#xff0c;第一批体验报告来了&#xff01;用户们已经疯狂 刚刚&#xff0c;万众期待的GPT-4o语音功能&#xff0c;也就是被称为“Her”的功能&#xff0c;终于开始向用户陆续开放&#xff01; OpenAI官方推特表示&#xff0c;选中的Alpha用户们将在…

快速部署私有化大模型 毕昇(使用docker-compose方式)

docker安装 1. # Linux系统安装docker&#xff0c;以CentOS/RHEL为例&#xff0c;其他操作系统请参考docker官方安装方法 # 如果已经安装过docker 期望重装&#xff0c;先卸载 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \d…

【Vue】权限控制

权限管理 分类&#xff1a; 页面权限功能(按钮)权限接口权限 vue3-element-admin 的实现方案 一般我们在业务中将 路由可以分为两种&#xff0c;constantRoutes 和 asyncRoutes。 constantRoutes&#xff1a; 代表那些不需要动态判断权限的路由&#xff0c;如登录页、404(或…

机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(二)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

新兴材料中载流子迁移率的霍尔效应测量

这篇文章是发表在《自然电子学》&#xff08;Nature Electronics&#xff09;2024年7月刊上的一篇评论文章&#xff0c;标题为“Reporting Hall effect measurements of charge carrier mobility in emerging materials”&#xff0c;作者是Vladimir Bruevich和Vitaly Podzorov…

数据仓库及数仓架构概述

往期推荐 大数据HBase图文简介-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 目录 0. 前言 0.1 浅谈维度建模 0.2 数据分析模型 1. 何为数据仓库 1.1 为什么不直接用业务平台的数据而要建设数仓&#xff1f; 1.2 数据仓库特征 1.3 数据仓库和数据库区别 1.4 以…