{"id":15055614,"url":"https://github.com/alialkubaisi/fxtend","last_synced_at":"2025-08-17T08:06:32.889Z","repository":{"id":251033520,"uuid":"834144518","full_name":"alialkubaisi/FXtend","owner":"alialkubaisi","description":"An open-source JavaFX library with extended controls","archived":false,"fork":false,"pushed_at":"2025-03-06T13:33:25.000Z","size":2993,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-01T00:14:37.725Z","etag":null,"topics":["autocomplete","autocomplete-search","autocompletetextfield","chat-view","chatview","controls","custom-controls","custom-password-field","java","javafx","javafx-library","masked-password","password-field","passwordfield","timeline","timelineview"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alialkubaisi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-07-26T14:10:19.000Z","updated_at":"2025-04-27T05:26:54.000Z","dependencies_parsed_at":"2025-04-30T23:38:38.887Z","dependency_job_id":"30a3a535-0900-42f3-96f7-c25310afa711","html_url":"https://github.com/alialkubaisi/FXtend","commit_stats":null,"previous_names":["alialkubaisi/fxtend"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/alialkubaisi/FXtend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alialkubaisi%2FFXtend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alialkubaisi%2FFXtend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alialkubaisi%2FFXtend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alialkubaisi%2FFXtend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alialkubaisi","download_url":"https://codeload.github.com/alialkubaisi/FXtend/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alialkubaisi%2FFXtend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270820793,"owners_count":24651534,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-17T02:00:09.016Z","response_time":129,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autocomplete","autocomplete-search","autocompletetextfield","chat-view","chatview","controls","custom-controls","custom-password-field","java","javafx","javafx-library","masked-password","password-field","passwordfield","timeline","timelineview"],"created_at":"2024-09-24T21:44:56.947Z","updated_at":"2025-08-17T08:06:32.861Z","avatar_url":"https://github.com/alialkubaisi.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FXtend - Extending JavaFX Controls\n\n[![Maven Central](https://img.shields.io/maven-central/v/io.github.alialkubaisi/fxtend.svg?label=Maven%20Central)](https://central.sonatype.com/artifact/io.github.alialkubaisi/fxtend/1.0.2)\n![Java Version](https://img.shields.io/badge/Java-%3E%3D%2017-blue)\n![JavaFX Version](https://img.shields.io/badge/JavaFX-%2022-blue)\n![License](https://img.shields.io/badge/License-Apache%202.0-green)\n\nFXtend is an open-source JavaFX library that aims to provide additional, new, or improved controls for JavaFX\napplications. The library is designed to be easy to use and integrate seamlessly into existing JavaFX projects.\n\n## Features\n\n- 🚀 New JavaFX controls that extend the standard set of controls.\n- 🔄 Improved versions of existing JavaFX controls with added functionalities.\n- 🎨 Custom styles and themes for a unique look and feel.\n\n## Installation\n\nFXtend can be included in your JavaFX project as a dependency using Maven or Gradle.\n\n### Maven\n\n```xml\n\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.alialkubaisi\u003c/groupId\u003e\n    \u003cartifactId\u003efxtend\u003c/artifactId\u003e\n    \u003cversion\u003e1.0.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Gradle\n\n```\nimplementation 'io.github.alialkubaisi:fxtend:1.0.2'\n```\n\n## Controls\n\n### SecurePasswordField\n\nThe `SecurePasswordField` control in FXtend is an enhanced version of the default JavaFX `SecurePasswordField`. It\nincludes the following features:\n\n- **Eye Icon to Show/Hide Password:** Users can toggle the visibility of the password by clicking an eye icon.\n  ![SecurePasswordField](fxtend-demo/images/password_field_masked.png)\n  ![SecurePasswordField](fxtend-demo/images/password_field_unmasked.png)\n- **Password Strength Validation:** An optional popup can display the strength of the password as the user types.\n  ![SecurePasswordField](fxtend-demo/images/password_strength_popup.gif)\n\n### Usage\n\nTo use SecurePasswordField in your application, you can instantiate it with optional parameters to enable strength\nvalidation and set a minimum length:\n\n```java\n// Create a SecurePasswordField with default settings\nSecurePasswordField passwordField = new SecurePasswordField();\n\n// Create a SecurePasswordField with password strength validation enabled\nSecurePasswordField validationPasswordField = new SecurePasswordField(true, 12);\n```\n\n### AutoCompleteField\n\nThe `AutoCompleteField` control in FXtend provides a text field with autocomplete functionality. It includes\na `searchMode` parameter to determine whether suggestions should match based on \"contains\", \"start with\", or \"end\nwith\".\u003cbr /\u003e\n\n#### Usage\n\nTo use `AutoCompleteField` in your application, you can instantiate it with a list of suggestions and optionally specify\nthe search mode:\n\n```java\n// suggestions is a list of strings, with default search mode (contains)\nAutoCompleteField autoCompleteFieldContains = new AutoCompleteField(suggestions);\n// Create AutoCompleteField with \"contains\" search mode\nAutoCompleteField autoCompleteFieldContains = new AutoCompleteField(buildSuggestions(), SearchMode.CONTAINS);\n```\n\n![SecurePasswordField](fxtend-demo/images/auto_complete_fields.gif)\n\n### ChatView\n\nThe `ChatView` control provides an interactive chat interface similar to popular messaging applications. It includes\nfeatures such as:\n\n- **Send and Receive Messages:** Easily send and receive messages with built-in handling for both incoming and outgoing\n  messages.\n- **Customizable Styles:** Choose from several pre-defined styles (`DEFAULT`, `MODERN`, `DARK`) or create your own.\n- **Optional Logo for Received Messages:** Display a logo image on the received message bubbles.\n- **Timestamp Display:** Automatically display timestamps for each message, enhancing the chat experience.\n- **Message Status Indicators:** Display message statuses like \"Sent\", \"Received\", or \"Read\" with visual indicators.\n\n#### Usage\n\nYou can instantiate the `ChatView` in several ways, depending on your requirements:\n\n```java\nChatView chatView = new ChatView(); // Apply default style without adding header\nChatView chatViewWithTitle = new ChatView(\"title\"); // This will add a header in the chat view\nChatView chatViewModern = new ChatView(ChatView.Style.MODERN); // Apply modern style without adding header\nChatView chatViewDarkWithTitle = new ChatView(\"title\", ChatView.Style.DARK); // Apply dark style with title as header\n```\n\nMessages can be sent using the `TextField` within the `ChatView` or programmatically using the `sendMessage` method. To\nreceive messages, use the `receiveMessage` method.\n\n```java\nChatView chatView = new ChatView();\nchatView.sendMessage(\"Hello, this is a sent message!\");\nchatView.receiveMessage(\"Hi! This is a received message.\",new Image(\"/path/to/logo.png\")); // Received message with optional logo\n```\n![ChatViewDefault](fxtend-demo/images/chat_view_default.png)\n![ChatViewModern](fxtend-demo/images/chat_view_modern.png)\n![ChatViewModernWithHeader](fxtend-demo/images/chat_view_modern_header.png)\n![ChatViewDarkWithHeader](fxtend-demo/images/chat_view_dark_header.png)\n\n### TimelineView\n\nThe `TimelineView` is a versatile and customizable JavaFX control for displaying a chronological list of entries with \nflexible configuration options. It provides an intuitive way to visualize historical events, project changes, or user activities.\n\n#### Key Features\n\n- **Flexible Entry Rendering:** Customize how timeline entries are displayed using a TimelineCellFactory\n- **Automatic Day Grouping:** Optional date-based grouping of entries\n- **Expandable History:** Configurable initial history limit with show more/less functionality\n- **Internationalization Support:** Built-in support for translated text\n- **Vertical Timeline Visualization:** Entries are displayed along a vertical line with interactive knots\n\n#### Usage\n\nTo use `TimelineView` in your JavaFX application, instantiate it with a list of `TimelineEntry` objects:\n\n```java\n// Sample timeline entries\nList\u003cTimelineEntry\u003e events = List.of(\n    new TimelineEntry(TimelineTextConstants.CREATE, \"Alice\", \"Created the project repository.\", new Date()),\n    new TimelineEntry(TimelineTextConstants.UPDATE, \"Bob\", \"Updated project requirements.\", new Date())\n);\n\n// Create a TimelineView with default settings\nTimelineView\u003cTimelineEntry\u003e timeline = new TimelineView\u003c\u003e(\"Project History\", events);\n```\n##### Custom Cell Rendering\nFor advanced customization, you can define a TimelineCellFactory to control how each entry is displayed:\n\n```java\nTimelineCellFactory\u003cTimelineEntry\u003e cellFactory = (event, isNewDay) -\u003e {\n    GridPane cell = new GridPane();\n    cell.setHgap(10);\n\n    Label actionLabel = new Label(event.action().getTranslatedMessage());\n    Label userLabel = new Label(event.username());\n    Label dateLabel = new Label(new SimpleDateFormat(\"MMM dd, yyyy HH:mm\").format(event.date()));\n\n    cell.add(actionLabel, 0, 0);\n    cell.add(userLabel, 1, 0);\n    cell.add(dateLabel, 2, 0);\n\n    return cell;\n};\n\n// Create a TimelineView with custom rendering\nTimelineView\u003cTimelineEntry\u003e customTimeline = new TimelineView\u003c\u003e(\"Custom History\", events, cellFactory, TimelineEntry::date);\n```\n![TimelineView](fxtend-demo/images/timeline.gif)\n\n### InformationDecorator\nThe `InformationDecorator` control in FXtend is a versatile decorator component that enhances any JavaFX node by adding \nan information button with a popover. It wraps your target control and automatically displays context-sensitive help \nwhen the button is clicked.\n\n#### Key Features\n\n- **Decorator Pattern:** Wrap any JavaFX node to provide on-demand help.\n- **Customizable Button Position:** Place the info button on the left or right side (using Pos.CENTER_LEFT or Pos.CENTER_RIGHT).\n- **Stylish Popover:** A customizable popover displays the provided help text.\n- **Simplified Integration:** Use the InformationFactory for one-line decoration.\n- **Thread-Safe UI Updates:** Ensures popover toggling is executed on the JavaFX Application Thread.\n\n#### Usage\nWrap your node with the information decorator using the factory methods:\n\n```java \n// Decorate a TextField with an information button (default position: right)\nInformationDecorator decoratedField = InformationFactory.addInfoTo(myTextField, \"Enter your email address for account recovery.\");\n\n// Decorate a TextField with the information button on the left\nInformationDecorator decoratedFieldLeft = InformationFactory.addInfoTo(myTextField, \"Enter your full name as shown on official documents.\", Pos.CENTER_LEFT);\n```\n\n![InformationDecorator](fxtend-demo/images/info-decorator.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falialkubaisi%2Ffxtend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falialkubaisi%2Ffxtend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falialkubaisi%2Ffxtend/lists"}