{"id":20207158,"url":"https://github.com/kreativekorp/ual","last_synced_at":"2025-07-25T05:33:02.022Z","repository":{"id":84078123,"uuid":"341829512","full_name":"kreativekorp/ual","owner":"kreativekorp","description":"Universal Application Library provides parts of the Java 9+ java.awt.desktop API for versions of Java as far back as 1.5.","archived":false,"fork":false,"pushed_at":"2023-02-23T07:27:49.000Z","size":52,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-03T10:13:47.519Z","etag":null,"topics":["adapter","apple","application","awt","com","com-apple-eawt","desktop","eawt","java","java-awt-desktop","layer","library","stub","translation","universal"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kreativekorp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2021-02-24T08:25:40.000Z","updated_at":"2023-02-23T07:27:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"d03db3a6-72ba-4d48-8c53-c68371f2db88","html_url":"https://github.com/kreativekorp/ual","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/kreativekorp/ual","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kreativekorp%2Fual","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kreativekorp%2Fual/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kreativekorp%2Fual/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kreativekorp%2Fual/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kreativekorp","download_url":"https://codeload.github.com/kreativekorp/ual/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kreativekorp%2Fual/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266961924,"owners_count":24012988,"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-07-25T02:00:09.625Z","response_time":70,"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":["adapter","apple","application","awt","com","com-apple-eawt","desktop","eawt","java","java-awt-desktop","layer","library","stub","translation","universal"],"created_at":"2024-11-14T05:27:40.627Z","updated_at":"2025-07-25T05:33:01.999Z","avatar_url":"https://github.com/kreativekorp.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Universal Application Library\n\nUniversal Application Library provides parts of the Java 9+ `java.awt.desktop` API for versions of Java as far back as 1.5.\nIt consists of four parts:\n\n* A stub library for the `java.awt.desktop` package\n* A stub library for the `com.apple.eawt` package\n* A translation layer between the `java.awt.desktop` and `com.apple.eawt` APIs\n* A universal application adapter that provides the lowest common denominator using whichever API is available\n\n## Usage\n\nImplement your application event handlers using the `java.awt.desktop` API (stubs are included) then use the `UniversalApplication` class to register them:\n\n```java\nimport java.awt.desktop.AboutHandler;\nimport java.awt.desktop.OpenFilesHandler;\nimport java.awt.desktop.PreferencesHandler;\nimport java.awt.desktop.PrintFilesHandler;\nimport java.awt.desktop.QuitHandler;\nimport com.kreative.ual.UniversalApplication;\n\npublic class Foo {\n  public static void main(String[] args) {\n    AboutHandler aboutHandler = new AboutHandler() { ... };\n    OpenFilesHandler openHandler = new OpenFilesHandler() { ... };\n    PreferencesHandler prefsHandler = new PreferencesHandler() { ... };\n    PrintFilesHandler printHandler = new PrintFilesHandler() { ... };\n    QuitHandler quitHandler = new QuitHandler() { ... };\n    new UniversalApplication()\n      .setAboutHandler(aboutHandler)\n      .setOpenFileHandler(openHandler)\n      .setPreferencesHandler(prefsHandler)\n      .setPrintFileHandler(printHandler)\n      .setQuitHandler(quitHandler)\n      .register();\n  }\n}\n```\n\nThe `UniversalApplication` class accesses the underlying `java.awt.desktop` and `com.apple.eawt` APIs using reflection, to avoid compile and link errors if those APIs are not available. The downside is that it is limited to the five events (About, OpenFiles, Preferences, PrintFiles, and Quit) supported by all APIs. For more functionality, you can use the `java.awt.desktop` API with the translation classes in the `com.kreative.ual.eawt` package as a fallback, but you'll have to use reflection yourself to ensure compatibility with earlier versions of Java.\n\n```java\ntry {\n  Class\u003c?\u003e cls = Class.forName(\"java.awt.Desktop\");\n  Method get = cls.getMethod(\"getDesktop\");\n  Object obj = get.invoke(null);\n  cls.getMethod(\"setAboutHandler\", AboutHandler.class).invoke(obj, aboutHandler);\n  cls.getMethod(\"setOpenURIHandler\", OpenURIHandler.class).invoke(obj, openURIHandler);\n  ...\n} catch (Exception e) {}\ntry {\n  Class\u003c?\u003e cls = Class.forName(\"com.kreative.ual.eawt.NewApplicationAdapter\");\n  Method get = cls.getMethod(\"getInstance\");\n  Object obj = get.invoke(null);\n  cls.getMethod(\"setAboutHandler\", AboutHandler.class).invoke(obj, aboutHandler);\n  cls.getMethod(\"setOpenURIHandler\", OpenURIHandler.class).invoke(obj, openURIHandler);\n  ...\n} catch (Exception e) {}\ntry {\n  Class\u003c?\u003e cls = Class.forName(\"com.kreative.ual.eawt.OldApplicationAdapter\");\n  Method get = cls.getMethod(\"getInstance\");\n  Object obj = get.invoke(null);\n  cls.getMethod(\"setAboutHandler\", AboutHandler.class).invoke(obj, aboutHandler);\n  // OldApplicationAdapter does not support setOpenURIHandler!\n  ...\n} catch (Exception e) {}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkreativekorp%2Fual","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkreativekorp%2Fual","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkreativekorp%2Fual/lists"}