首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在javafx上知道tableview的动态创建按钮的行

在JavaFX中,要知道TableView动态创建按钮的行,可以通过以下步骤实现:

  1. 创建一个TableView对象,并定义表格的列和数据模型。
  2. 创建一个TableColumn对象,设置列的标题和数据提供器。
  3. 创建一个Callback对象,用于自定义单元格的显示和编辑。
  4. 在Callback对象的call方法中,根据数据模型创建一个按钮,并设置按钮的事件处理程序。
  5. 将Callback对象设置为TableColumn的CellFactory,以便在每个单元格中显示按钮。
  6. 将TableColumn添加到TableView中。
  7. 将数据添加到TableView中。

下面是一个示例代码,演示如何在JavaFX中实现动态创建按钮的行:

代码语言:java
复制
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TableViewExample extends Application {

    public static class Person {
        private final SimpleStringProperty name;
        private final SimpleStringProperty action;

        public Person(String name, String action) {
            this.name = new SimpleStringProperty(name);
            this.action = new SimpleStringProperty(action);
        }

        public String getName() {
            return name.get();
        }

        public void setName(String name) {
            this.name.set(name);
        }

        public String getAction() {
            return action.get();
        }

        public void setAction(String action) {
            this.action.set(action);
        }
    }

    @Override
    public void start(Stage primaryStage) {
        TableView<Person> tableView = new TableView<>();
        ObservableList<Person> data = FXCollections.observableArrayList(
                new Person("John", "Edit"),
                new Person("Jane", "Delete"),
                new Person("Bob", "Save")
        );

        TableColumn<Person, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> param) {
                return param.getValue().name;
            }
        });

        TableColumn<Person, String> actionColumn = new TableColumn<>("Action");
        actionColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
            @Override
            public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> param) {
                return param.getValue().action;
            }
        });

        Callback<TableColumn<Person, String>, TableCell<Person, String>> cellFactory = new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
            @Override
            public TableCell<Person, String> call(TableColumn<Person, String> param) {
                final TableCell<Person, String> cell = new TableCell<Person, String>() {
                    final Button button = new Button();

                    @Override
                    public void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setGraphic(null);
                        } else {
                            button.setText(item);
                            setGraphic(button);
                        }
                    }
                };

                cell.getStylesheets().add(getClass().getResource("button-cell.css").toExternalForm());
                return cell;
            }
        };

        actionColumn.setCellFactory(cellFactory);

        tableView.getColumns().addAll(nameColumn, actionColumn);
        tableView.setItems(data);

        VBox vbox = new VBox(tableView);
        Scene scene = new Scene(vbox);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

在上述示例代码中,我们创建了一个TableView对象,其中包含两列:Name和Action。Name列显示人名,Action列显示按钮。我们使用Callback对象来自定义Action列的单元格显示和编辑,通过updateItem方法来更新单元格的内容。在updateItem方法中,我们创建了一个按钮,并根据数据模型设置按钮的文本。然后,我们将按钮设置为单元格的图形。最后,我们将Callback对象设置为Action列的CellFactory,以便在每个单元格中显示按钮。

请注意,示例代码中的CSS文件"button-cell.css"用于设置按钮的样式,你可以根据需要自定义按钮的外观。

这是一个简单的示例,演示了如何在JavaFX中实现动态创建按钮的行。你可以根据实际需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

何在矩阵显示“其他”【3】切片器动态筛选猫腻

往期推荐 如何在矩阵显示“其他”【1】 如何在矩阵显示“其他”【2】 正文开始 一篇文章末尾,我放了一张动图: 当年度切片器变换筛选时,子类别中显示种类和顺序是不相同,但不变是...但是我们仔细审视一下这张图,猜测一下它实现原理。 首先这张图是按照子类别排序,又能够实现动态排序,必然采用是“按列排序”。...比如说,对于桌子而言,对应排序有些年份是9,有些年份排名考前,是7: 这样的话,按列排序时,根本不知道桌子到底是9还是7,也就没法排序。...但是,按列排序并不考虑切片器特殊性,它考虑是全局性,因为一旦切片器进行了多选或者不选,那么就会出现桌子不知道是9还是7情况,所以干脆就不让你设置了。...%从高到低排序 所以,剩下问题就是如何在不显示子类别前面的年份前提下,让不同年份对应子类别不同,如下图所示: 关注【学谦数据运营】,下篇回答这个问题。

2.5K20
  • C++ Qt开发:TableView与TreeView组件联动

    本章我们继续实现表格联动效果,当读者点击TableView或TreeView中某一时,我们让其实现自动跟随功能,且当用户修改行中特定数据时也让其动态跟随改变,首先绘制一个主界面如图,分别放置两个组件框...,底部保留两个按钮按钮1用于该表表格行列个数,按钮2则用于设置TableView表格表头参数,整个表格我们将其设置为可编辑状态。...在MainWindow构造函数中,我们以此执行如下关键部分,来实现对主界面的初始化工作;创建模型和选择模型首先创建一个包含45列 QStandardItemModel 模型,并为其创建了一个 QItemSelectionModel...treeView将模型和选择模型关联到 tableView 和 treeView ,这样它们会共享同一份数据模型,也就是无论两个组件哪一个发生变化均会影响双方组件中内容。...继续创建一个包含三个字符串列表数组 DataList,每个列表代表一数据。然后使用嵌套循环遍历数组,将数据逐个添加到模型中。

    36910

    iOS逆向(8)-Monkey、Logos

    安装ldid(安装theos过程安装了ldid,跳过) brew install ldid 2.安装 你可以通过以下命令选择指定Xcode进行安装: sudo xcode-select -s /...1.创建一个简单工程 创建工程SimpleAppDemo,里面只有一个按钮,点击按钮弹出一个Alert。...#import 由于咱们手上有源码,所以可以直接跳过动态分析这一步,直接就知道按钮所处页面是叫做ViewController,按钮响应方法是: - (IBAction...delegate:nil cancelButtonTitle:@"我知道了" otherButtonTitles:nil, nil]; [alert show]; } %end 运行项目,发现按钮已经被成功...我们现在要做就是在这个页面的TableView最后一加上Cell,里面有个Switch,用于打开/关闭屏蔽广告功能(只是UI,这篇文章不牵扯到屏蔽广告具体实现,如果你需要,点个小心心,持续关注我哦

    1.8K20

    使用Java在Netbeans IDE开发JavaFX4个深坑总结,开发必看!

    netbeans教程太少了。最后还是去官方找了一段时间才找出来解决办法。当然,我们这篇文章主题是如何在netbeans上面开发javafx程序,不是情绪抱怨。我们开始吧。...我以为可以用这个直接创建javafx项目,折腾了半天又是装其他jdk版本,就是重下jfxsdk,哎,一点用都没有,后来找到一篇文章才知道,哎。...jar文件,不要点到目录文件夹一添加就完事了,那样添加不,必须添加到指定jar,选择完成后,我们再去点击add JAR/Folder 那个按钮它如果是这样状态,代表我们添加成功,然后点击ok接下来我们创建一个...javafx demo可以看到这个文档全部报错,是因为jar包不存在缘故也就是找不到类接下来我们在 libraries 右键 点击 add library...找到我们刚刚创建library openjfx...以上是关于如何在netbeans上面开发javafx项目的4个深坑总结。如果这篇文章对你有帮助请点赞收藏加关注哦!创作不易。也感谢大家阅读!

    2.7K00

    Java一分钟之-JavaFX:构建桌面GUI应用

    JavaFX简介 JavaFX是Java一个图形和多媒体处理库,它允许开发者设计、创建、测试、调试以及部署富客户端应用程序。...解决方案: 熟悉并合理使用JavaFX提供布局容器,HBox, VBox, BorderPane, GridPane等,它们可以帮助你更好地组织界面元素。...使用约束系统(GridPane中列宽和高约束)来精确控制组件位置和大小。 3. 事件处理不当 问题描述:事件监听器设置不正确,导致按钮点击或其他交互行为没有响应。...确保事件源(如按钮)和事件处理器之间有正确绑定关系。 如何避免这些问题 学习官方文档:JavaFX官方文档是最佳学习资源,涵盖了从基础到高级所有内容。...代码示例:一个简单JavaFX应用 下面是一个简单JavaFX示例,展示了一个包含一个按钮和文本显示区域应用,当点击按钮时,文本会更新。

    75820

    IOS开发之新浪围脖

    (2)我们要完成什么要任务呢?少说点吧,几张图最为直接 ?     ...我们根据博文文字多少来用代码动态改变垂直约束,至于如何用代码改变约束值,请参照以前博客IOS开发之绝对布局和相对布局(屏幕适配),在这就不做过多论述,下面主要讲如何给我们cell添加多个按钮...,然后在点击按钮时候我们知道是那个Cell那个button被点击了。       ...(1)为了区分按钮,我们需要给每个按钮设置tag,然后在TableViewController中获取Tag值,我们就知道是那个按钮被点击了。       ...(2)难点在于我们如何判断被点击按钮位于那个cell。这个得用block回调来解决问题啦。

    1.2K50

    iOS 9 Storyboard 教程(二下)

    但是当用户点击Done按钮时候,你应该创建创建一个新Player 对象并且填写它属性和更新�玩家清单....引用,可以传递到这个方法.它用来往玩家数组里添加新Player对象来作为数据源.然后它会告诉tableView添加了新(在底部),因为tableView和它数据源始终是同步....就数据源而言应该那样做.运行app然后点击Game.新Choose Game控制器将会滑出来.然而点击这些不会做任何事,那是因为这个控制器是在导航堆栈被弹出来.但是你却总可以点击返回按钮返回到...你没有写任何代码调用新控制器.你只是按住ctrl键并从静态table view cell拖拽出了新控制器.你写唯一代码就是填充tableView内容,这通常是更动态而不是硬编码列表....这个方法在点击之后就会取消选中.那使得它从灰色高亮褪色为正常白色.然后它就会从先前选中单元格移除对号标记,然后把对号放到刚刚点击那一.

    2.2K10

    JavaFX+Jfoenix 学习笔记(四)–MenuBar菜单栏

    { /** * Stage:就是你能看到整个软件界面(窗口) * Scene:就是除了窗口最上面有最大、最小化及关闭按钮那一及窗口边框外其它区域(场景) * 场景(Scene)...class MenuBar2 extends Application { /** * Stage:就是你能看到整个软件界面(窗口) * Scene:就是除了窗口最上面有最大、最小化及关闭按钮那一及窗口边框外其它区域...Menu不能作为一个菜单按钮来使用,所以我都是用MenuItem package zkh.javafx.learn.menubar; import javafx.application.Application...{ /** * Stage:就是你能看到整个软件界面(窗口) * Scene:就是除了窗口最上面有最大、最小化及关闭按钮那一及窗口边框外其它区域(场景) * 场景(Scene)是一个窗口(Stage...发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    2.5K20

    你可能需要为你 APP 适配 iOS11

    前言 前几天发现在做APP在iOS11系统动画有异常,在其他系统设备都是正常,动画操作是观察tableViewcontentOffset变化后执行,异常动画发生在tableView reloadData...如果有人看不清楚tab bar图标或文字,可以通过长按tab bar任意item,会将该item显示在HUD,这样可以清楚看清icon和text。...我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关属性来展示动态内容,实现了estimatedRowHeight属性后,得到初始contenSize...在测试Demo中,创建tableView到显示出来过程中,contentSize计算过程如下图: Self-Sizing在iOS11下是默认开启,Headers, footers, and cells...因为不会缓存正确高,tableView reloadData时候,会重新计算contentSize,就有可能会引起contentOffset变化。

    2.4K00

    躁!DJ 风格 Java 桌面音乐播放器

    ,你肯定会喜欢!...在 JavaFX 中,Stage 是应用程序窗口,其中包含称为 Scene 空间。Scene 包含界面的组件, UI 空间(按钮,输入框,复选框),容器等。...上面代码意思是:创建一个面板,然后在面板添加标签,输入框和按钮,并对按钮添加绑定事件,然后把这个面板添加到场景中,这个窗口就完成了。 五、最后 Java 桌面 DJ 音乐播放器是真的香!...不知道你对这款音乐播放器有什么感受,欢迎在评论区说说自己想法。人们都喜欢美的好事物,而今天这个项目是通过 Java 代码撸出来,难道你还不会不喜欢 Java 这门编程语言吗?...有了成品直观呈现,才能在视觉产生更强冲击,可能会更加能激发你学习动力!如果通过我内容分享,能让你对编程产生兴趣,我是真的开心。

    3.8K20

    iOS架构入门 - MVC模式实例演示

    image.png MVC模式目的是实现一种动态程序设计,使后续对程序修改和扩展简化,并且使程序某一部分重复利用成为可能。...reloadDatas]; }]; } ---- 基础MVC讲解完毕,其实本质就是让Controller减压,不该控制器管他别让他知道,如上基础MVC操作之后优势: MVC架构分明,在同一个模块内...,比如这里MNBaseDatas,之前我们举例DemoModel就无需声明 @interface DemoModel : MNBaseDatas /**继承自MNBaseDatas,父类有的就可以不用声明...,tableView应该算最常见控件之一,基本大多数界面都会用它展示数据,所以tableView也抽到基类中,当公告属性 有tableView 就跑不了数据源了,datas 同理,也抽到基类 同时,...就能拥有这个tableView,无需创建 这样,所有的UIViewController,只要继承自MNBaseViewController,都可以有如上函数和方法(可以根据需要扩充) >进阶

    1.3K00

    Java一分钟之-JavaFX控件:Button, TextField, Label等

    常见控件包括按钮(Button)、文本字段(TextField)和标签(Label),这些控件正确使用是构建高效、直观GUI关键。...调整控件属性,setFont(), setPrefSize()等。 2. 事件处理不当 问题描述:按钮点击或其他交互行为没有响应。...检查事件处理器是否已正确绑定到控件。 3. 布局管理 问题描述:控件位置或大小不正确,导致界面混乱。 解决方案: 使用适当布局容器,HBox, VBox, GridPane等。...调整布局容器属性,spacing, padding等,以及控件prefWidth, prefHeight属性。...通过调整布局和事件处理,你可以构建出更复杂交互逻辑。 总结 理解并熟练使用JavaFX基础控件是创建功能丰富、用户友好GUI关键。

    36010

    你可能需要为你APP适配iOS11

    WeTest 导读  iOS 11 为整个生态系统 UI 元素带来了一种更加大胆、动态新风格。...前言 前几天发现在做APP在iOS11系统动画有异常,在其他系统设备都是正常,动画操作是观察tableViewcontentOffset变化后执行,异常动画发生在tableView reloadData...我们知道在iOS8引入Self-Sizing 之后,我们可以通过实现estimatedRowHeight相关属性来展示动态内容,实现了estimatedRowHeight属性后,得到初始contenSize...在测试Demo中,创建tableView到显示出来过程中,contentSize计算过程如下图: Self-Sizing在iOS11下是默认开启,Headers, footers, and cells...因为不会缓存正确高,tableView reloadData时候,会重新计算contentSize,就有可能会引起contentOffset变化。

    81720

    【IOS开发基础系列】Storyboard专题

    1.2 程序加载         如果你以前创建过基于 nib app(译者注:Xcode 3.x),你可能知道MainWindow.xib 文件。...但在某些时候我们必须通过手动创建TabbarController,这样就必须知道在不使用模板时应该如何去做。         ...以这种方式,你可以创建超过 5 个ViewController 给TabBarController,它将自动在Tabbar 显示 More... 按钮。...不要奇怪,我们还没有提供数据源,因此表视图中不会显示任何。 2.3.3 创建PlayersViewController         加一个新 File 到项目中。...删除按钮出现在 cell ,但它同时也遮住了等级图片。实际是因为删除按钮占据了部分cell空间,而 cell 大小随之改变,ImageView 却没有改变。

    1K30

    手拉手JavaFX场景

    ()值摆放每一个子节点setHgrow(hbox,Priority.ALWAYS);javafx有4中控件来表示多项数据ListView:列表TreeView:树TableView:表格TreeTableView...:多列列表环境配置舞台Stage舞台(场景(布局(控件)))JavaFX需要继承:javafx.application.AppLication需要实现方法start创建main方法 调用launch需要...=stage; stage.setTitle("小应用测试"); //创建布局 HBox hbox = new HBox(); //创建控件...Override public void start(Stage primaryStage) throws Exception{ Button button = new Button("按钮...BorderPane顶部和底部区域允许可调整大小节点占用所有可用宽度。左边界区域和右边界区域占据顶部和底部边界之间可用垂直空间。默认情况下,所有边界区域尊重子节点首选宽度和高度。

    16100

    iOS开发之表视图爱上CoreData

    下面会通个代码给出他们相爱原因。就举一个IOS开发中经典demo:通讯录来说明问题。 1.在TableView没遇到CoreData时候我们怎么通过动态表视图来显示我们通讯录内容呢?...16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 /*  *手动创建我们在动态表视图上显示数据格式...和CoreData相爱过程啦,如何在storyboard中对TableViewcell进行配置在这儿就不赘述了,下面给出我们要通过TableView和CoreData来实现什么功能。     ...来修改或着添加数据时,TableView内容是不跟着CoreData变化而变化,接下来要做就是要绑定TableView和CoreData关系。...save:&error]) {             NSLog(@"%@", [error localizedDescription]);         }     } } ​    c.默认删除按钮显示

    2.2K80
    领券