{"id":19600,"date":"2022-11-07T05:22:21","date_gmt":"2022-11-06T23:52:21","guid":{"rendered":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/"},"modified":"2022-11-07T05:22:21","modified_gmt":"2022-11-06T23:52:21","slug":"solved-java-8-method-references-with-javafx","status":"publish","type":"post","link":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/","title":{"rendered":"[Solved] Java 8 method references with javafx"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div id=\"answer-36664548\" class=\"answer js-answer accepted-answer js-accepted-answer\" data-answerid=\"36664548\" data-parentid=\"36664453\" data-score=\"2\" data-position-on-page=\"1\" data-highest-scored=\"1\" data-question-has-accepted-highest-score=\"1\" itemprop=\"acceptedAnswer\" itemscope itemtype=\"https:\/\/schema.org\/Answer\">\n<div class=\"post-layout\">\n<div class=\"votecell post-layout--left\"><\/div>\n<div class=\"answercell post-layout--right\">\n<div class=\"s-prose js-post-body\" itemprop=\"text\">\n<p>If you just want to define a method for creating a <code>MenuItem<\/code>, then it&#8217;s easy enough: you just need to decide on the functional interface you will need for the parameter that takes the method reference (or lambda, etc). E.g. if the method signature takes no parameters and has <code>void<\/code> return type, you could use <code>Runnable<\/code>:<\/p>\n<pre><code>public MenuItem createItem(String text, Runnable handler) {\n    MenuItem item = new MenuItem(text);\n    item.setOnAction(e -&gt; handler.run());\n}\n<\/code><\/pre>\n<p>You probably want the menu item event handler to have access to the table item in the row, in which case it would need a reference to the row:<\/p>\n<pre><code>public &lt;T&gt; MenuItem createItem(String text, TableRow&lt;T&gt; row, Consumer&lt;T&gt; handler) {\n    MenuItem item = new MenuItem(text);\n    item.setOnAction(e -&gt; handler.accept(row.getItem()));\n}\n<\/code><\/pre>\n<p>Then you can do<\/p>\n<pre><code>TableView&lt;InterfaceModel&gt; table = new TableView&lt;&gt;();\nContextMenuHelper helper = new ContextMenuHelper();\ntable.setRowFactory(t -&gt; {\n    TableRow&lt;InterfaceModel&gt; row = new TableRow&lt;&gt;();\n    ContextMenu menu = new ContextMenu();\n    row.setContextMenu(menu);\n    menu.getItems().addItem(helper.createItem(\"Edit\", row, this::edit));\n    \/\/ etc...\n});\n<\/code><\/pre>\n<p>with<\/p>\n<pre><code>private void edit(InterfaceModel model) {\n    \/\/ ...\n}\n<\/code><\/pre>\n<p>What you didn&#8217;t actually ask, but I&#8217;m sort of guessing you really want, is for the &#8220;helper&#8221; class to actually set the row factory and create all the menus, etc. This is a bit harder to structure, because you need to entirely build the context menu inside the row factory, so you need to know all the menu items before you can actually set the row factory. For this, you probably want to consider a builder pattern:<\/p>\n<pre><code>import java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Consumer;\n\nimport javafx.scene.control.ContextMenu;\nimport javafx.scene.control.MenuItem;\nimport javafx.scene.control.TableRow;\nimport javafx.scene.control.TableView;\nimport javafx.util.Callback;\n\npublic class TableRowContextMenuBuilder&lt;T&gt; {\n    private final List&lt;MenuItemConfig&lt;T&gt;&gt; items ;\n    private boolean built ;\n\n    public TableRowContextMenuBuilder() {\n        this.items = new ArrayList&lt;&gt;();\n    }\n\n\n    public static &lt;T&gt; TableRowContextMenuBuilder&lt;T&gt; create(Class&lt;T&gt; type) {\n        return new TableRowContextMenuBuilder&lt;&gt;();\n    }\n\n    public TableRowContextMenuBuilder&lt;T&gt; addItem(String text, Consumer&lt;T&gt; handler) {\n        if (built) {\n            throw new IllegalStateException(\"Row factory is already built: cannot add new items\");\n        }\n        items.add(new MenuItemConfig&lt;T&gt;(text, handler));\n        return this ;\n    }\n\n    public TableRowContextMenuBuilder&lt;T&gt; addItem(String text, Runnable handler) {\n        return addItem(text, t -&gt; handler.run());\n    }\n\n    public Callback&lt;TableView&lt;T&gt;, TableRow&lt;T&gt;&gt; build() {\n        if (built) {\n            throw new IllegalStateException(\"Cannot build row factory more than once\");\n        }\n        built = true ;\n        return t -&gt; {\n            TableRow&lt;T&gt; row = new TableRow&lt;&gt;();\n            ContextMenu menu = new ContextMenu();\n            row.setContextMenu(menu);\n            items.stream()\n                .map(config -&gt; config.asMenuItem(row))\n                .forEach(menu.getItems()::add);\n            return row ;\n        };\n    }\n\n    public void buildForTable(TableView&lt;T&gt; table) {\n        table.setRowFactory(build());\n    }\n\n\n    private static class MenuItemConfig&lt;T&gt; {\n        private final String text ;\n        private final Consumer&lt;T&gt; handler ;\n        MenuItemConfig(String text, Consumer&lt;T&gt; handler) {\n            this.text = text;\n            this.handler = handler;\n        }\n        MenuItem asMenuItem(TableRow&lt;T&gt; row) {\n            MenuItem item = new MenuItem(text);\n            item.setOnAction(e -&gt; handler.accept(row.getItem()));\n            return item ;\n        }\n    }\n}\n<\/code><\/pre>\n<p>And now you can do<\/p>\n<pre><code>TableView&lt;InterfaceModel&gt; table = new TableView&lt;&gt;();\nTableViewContextMenuBuilder.create(InterfaceModel.class)\n    .menuBuilder.addItem(\"Edit\", this::edit);\n    .menuBuilder.addItem(\"Item 2\", this::handleOtherItem);\n    \/\/ ...\n    .buildForTable(table);\n<\/code><\/pre>\n<p>with the appropriate methods defined:<\/p>\n<pre><code>private void edit(InterfaceModel model) { \/* ... *\/}\nprivate void handleOtherItem(InterfaceModel model) { \/* ... *\/}\n<\/code><\/pre>\n<\/p><\/div>\n<div class=\"mt24\"><\/div>\n<\/div>\n<p>            <span class=\"d-none\" itemprop=\"commentCount\">1<\/span> <\/p><\/div>\n<\/div>\n<p>[ad_2]<\/p>\n<p>solved Java 8 method references with javafx <\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] If you just want to define a method for creating a MenuItem, then it&#8217;s easy enough: you just need to decide on the functional interface you will need for the parameter that takes the method reference (or lambda, etc). E.g. if the method signature takes no parameters and has void return type, you could &#8230; <a title=\"[Solved] Java 8 method references with javafx\" class=\"read-more\" href=\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\" aria-label=\"More on [Solved] Java 8 method references with javafx\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[320],"tags":[323,549,1489,995,4649],"class_list":["post-19600","post","type-post","status-publish","format-standard","hentry","category-solved","tag-java","tag-java-8","tag-javafx","tag-lambda","tag-method-reference"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[Solved] Java 8 method references with javafx - JassWeb<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[Solved] Java 8 method references with javafx - JassWeb\" \/>\n<meta property=\"og:description\" content=\"[ad_1] If you just want to define a method for creating a MenuItem, then it&#8217;s easy enough: you just need to decide on the functional interface you will need for the parameter that takes the method reference (or lambda, etc). E.g. if the method signature takes no parameters and has void return type, you could ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\" \/>\n<meta property=\"og:site_name\" content=\"JassWeb\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-06T23:52:21+00:00\" \/>\n<meta name=\"author\" content=\"Kirat\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kirat\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\"},\"author\":{\"name\":\"Kirat\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\"},\"headline\":\"[Solved] Java 8 method references with javafx\",\"datePublished\":\"2022-11-06T23:52:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\"},\"wordCount\":192,\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"keywords\":[\"java\",\"java-8\",\"javafx\",\"lambda\",\"method-reference\"],\"articleSection\":[\"Solved\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\",\"url\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\",\"name\":\"[Solved] Java 8 method references with javafx - JassWeb\",\"isPartOf\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#website\"},\"datePublished\":\"2022-11-06T23:52:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jassweb.com\/solved\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[Solved] Java 8 method references with javafx\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jassweb.com\/solved\/#website\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"name\":\"JassWeb\",\"description\":\"Build High-quality Websites\",\"publisher\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jassweb.com\/solved\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jassweb.com\/solved\/#organization\",\"name\":\"Jass Web\",\"url\":\"https:\/\/jassweb.com\/solved\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"contentUrl\":\"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png\",\"width\":693,\"height\":132,\"caption\":\"Jass Web\"},\"image\":{\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31\",\"name\":\"Kirat\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775193939\",\"contentUrl\":\"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775193939\",\"caption\":\"Kirat\"},\"sameAs\":[\"http:\/\/jassweb.com\"],\"url\":\"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[Solved] Java 8 method references with javafx - JassWeb","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/","og_locale":"en_US","og_type":"article","og_title":"[Solved] Java 8 method references with javafx - JassWeb","og_description":"[ad_1] If you just want to define a method for creating a MenuItem, then it&#8217;s easy enough: you just need to decide on the functional interface you will need for the parameter that takes the method reference (or lambda, etc). E.g. if the method signature takes no parameters and has void return type, you could ... Read more","og_url":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/","og_site_name":"JassWeb","article_published_time":"2022-11-06T23:52:21+00:00","author":"Kirat","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Kirat","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/#article","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/"},"author":{"name":"Kirat","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31"},"headline":"[Solved] Java 8 method references with javafx","datePublished":"2022-11-06T23:52:21+00:00","mainEntityOfPage":{"@id":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/"},"wordCount":192,"publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"keywords":["java","java-8","javafx","lambda","method-reference"],"articleSection":["Solved"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/","url":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/","name":"[Solved] Java 8 method references with javafx - JassWeb","isPartOf":{"@id":"https:\/\/jassweb.com\/solved\/#website"},"datePublished":"2022-11-06T23:52:21+00:00","breadcrumb":{"@id":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jassweb.com\/solved\/solved-java-8-method-references-with-javafx\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jassweb.com\/solved\/"},{"@type":"ListItem","position":2,"name":"[Solved] Java 8 method references with javafx"}]},{"@type":"WebSite","@id":"https:\/\/jassweb.com\/solved\/#website","url":"https:\/\/jassweb.com\/solved\/","name":"JassWeb","description":"Build High-quality Websites","publisher":{"@id":"https:\/\/jassweb.com\/solved\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jassweb.com\/solved\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jassweb.com\/solved\/#organization","name":"Jass Web","url":"https:\/\/jassweb.com\/solved\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/","url":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","contentUrl":"https:\/\/jassweb.com\/wp-content\/uploads\/2021\/02\/jass-website-logo-1.png","width":693,"height":132,"caption":"Jass Web"},"image":{"@id":"https:\/\/jassweb.com\/solved\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/65c9c7b7958150c0dc8371fa35dd7c31","name":"Kirat","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jassweb.com\/solved\/#\/schema\/person\/image\/","url":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775193939","contentUrl":"https:\/\/jassweb.com\/solved\/wp-content\/litespeed\/avatar\/1261af3c9451399fa1336d28b98ea3bb.jpg?ver=1775193939","caption":"Kirat"},"sameAs":["http:\/\/jassweb.com"],"url":"https:\/\/jassweb.com\/solved\/author\/jaspritsinghghumangmail-com\/"}]}},"_links":{"self":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/19600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/comments?post=19600"}],"version-history":[{"count":0,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/posts\/19600\/revisions"}],"wp:attachment":[{"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/media?parent=19600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/categories?post=19600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jassweb.com\/solved\/wp-json\/wp\/v2\/tags?post=19600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}