{"id":37443895,"url":"https://github.com/rhwood/jsplitbutton","last_synced_at":"2026-01-16T06:47:14.003Z","repository":{"id":32659023,"uuid":"48914542","full_name":"rhwood/jsplitbutton","owner":"rhwood","description":"A split button control for Java Swing.","archived":false,"fork":false,"pushed_at":"2026-01-01T22:28:50.000Z","size":990,"stargazers_count":22,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-07T06:18:05.075Z","etag":null,"topics":["java","split-button","swing","swing-component","swing-gui"],"latest_commit_sha":null,"homepage":"http://rhwood.github.io/jsplitbutton/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"akuhtz/jsplitbutton","license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rhwood.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-01-02T15:44:52.000Z","updated_at":"2026-01-01T22:28:52.000Z","dependencies_parsed_at":"2025-12-03T17:01:03.257Z","dependency_job_id":null,"html_url":"https://github.com/rhwood/jsplitbutton","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/rhwood/jsplitbutton","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhwood%2Fjsplitbutton","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhwood%2Fjsplitbutton/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhwood%2Fjsplitbutton/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhwood%2Fjsplitbutton/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rhwood","download_url":"https://codeload.github.com/rhwood/jsplitbutton/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rhwood%2Fjsplitbutton/sbom","scorecard":{"id":774518,"data":{"date":"2025-08-19T20:30:23Z","repo":{"name":"github.com/rhwood/jsplitbutton","commit":"a8f23d518f4cb0e91c63be66dbb6516929c2b188"},"scorecard":{"version":"v5.2.1","commit":"ab2f6e92482462fe66246d9e32f642855a691dc1"},"score":8.4,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#binary-artifacts"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dependency-update-tool"}},{"name":"Code-Review","score":-1,"reason":"Found no human activity in the last 30 changesets","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:31","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:32","Info: jobLevel 'contents' permission set to 'read': .github/workflows/publish.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/build.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:24","Info: topLevel 'contents' permission set to 'read': .github/workflows/dependency-review.yml:13","Warn: no topLevel permission defined: .github/workflows/publish.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:18","Info: topLevel 'contents' permission set to 'read': .github/workflows/site.yml:10","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#token-permissions"}},{"name":"Maintained","score":10,"reason":"15 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#maintained"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":10,"reason":"all dependencies are pinned","details":["Info:  19 out of  19 GitHub-owned GitHubAction dependencies pinned","Info:   8 out of   8 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":4,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Info: 'stale review dismissal' is required to merge on branch 'main'","Warn: branch 'main' does not require approvers","Info: codeowner review is required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#packaging"}},{"name":"Contributors","score":6,"reason":"project has 2 contributing companies or organizations -- score normalized to 6","details":["Info: found contributions from: atos ag (schweiz), everfox"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"30 out of 30 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/ab2f6e92482462fe66246d9e32f642855a691dc1/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-08-23T03:10:57.102Z","repository_id":32659023,"created_at":"2025-08-23T03:10:57.102Z","updated_at":"2025-08-23T03:10:57.102Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477951,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["java","split-button","swing","swing-component","swing-gui"],"created_at":"2026-01-16T06:47:13.387Z","updated_at":"2026-01-16T06:47:13.998Z","avatar_url":"https://github.com/rhwood.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"JSplitButton\n============\n\nA split button control for Java Swing.\n\n[![JitPack](https://jitpack.io/v/rhwood/jsplitbutton.svg)](https://jitpack.io/#rhwood/jsplitbutton)\n[![Javadocs](https://jitpack.io/v/rhwood/jsplitbutton.svg?label=Javadocs)](https://jitpack.io/com/github/rhwood/jsplitbutton/latest/javadoc/)\n[![Build](https://github.com/rhwood/jsplitbutton/actions/workflows/build.yml/badge.svg)](https://github.com/rhwood/jsplitbutton/actions/workflows/build.yml)\n[![CodeQL](https://github.com/rhwood/jsplitbutton/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/rhwood/jsplitbutton/actions/workflows/codeql-analysis.yml)\n[![codecov](https://codecov.io/gh/rhwood/jsplitbutton/graph/badge.svg?token=gbIMA3aimP)](https://codecov.io/gh/rhwood/jsplitbutton)\n[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/rhwood/jsplitbutton/badge)](https://securityscorecards.dev/viewer/?uri=github.com/rhwood/jsplitbutton)\n\nA simple implementation of the split button control for Java Swing. This control raises two events:\n\n* ```buttonClicked(ActionEvent e)```\n* ```splitButtonClicked(ActionEvent e)```\n\nThe buttonClicked event is raised when the main, or left, part of the button is clicked, which will not trigger the popup menu.\nThe splitButtonClicked event is raised when the split, or right, part of the button is clicked and displays a popup menu.\n\nTo handle these events you need a listener that implements:\n\n* ```SplitButtonActionListener``` to handle both events in a single listener\n* ```ButtonClickedActionListener``` to handle just buttonClicked\n* ```SplitButtonClickedActionListener``` to handle just splitButtonClicked\n\nSee also http://naveedmurtuza.blogspot.ch/2010/11/jsplitbutton.html\n\n## Screenshots\n\n![alt tag](https://raw.github.com/rhwood/jsplitbutton/master/wiki/images/JSplitButton-GTK.png)\n\n![alt tag](https://raw.github.com/rhwood/jsplitbutton/master/wiki/images/JSplitButton-Nimbus.png)\n\n![alt tag](https://raw.github.com/rhwood/jsplitbutton/master/wiki/images/JSplitButton-Metal.png)\n\n## Using the Control\n\n```java\n//first instantiate the control\nJSplitButton splitButton = new JSplitButton();\n//register for listener\nsplitButton.addSplitButtonActionListener(new SplitButtonActionListener() {\n\n    public void buttonClicked(ActionEvent e) {\n        System.out.println(\"Button Clicked\");\n    }\n\n    public void splitButtonClicked(ActionEvent e) {\n        System.out.println(\"Split Part Clicked\");\n    }\n});\n//add popup menu\nsplitButton.add(popupMenu);\n//add this control to panel\npanel.add(splitButton);\n```\n\nor (using Java 8 lambda expressions):\n\n```java\n//first instantiate the control\nJSplitButton splitButton = new JSplitButton();\n//register for button listener\nsplitButton.addButtonClickedActionListener((ActionEvent e) -\u003e {\n    System.out.println(\"Button Clicked\");\n});\n//register for split button listener\nsplitButton.addSplitButtonClickedActionListener((ActionEvent e) -\u003e {\n    System.out.println(\"Split Part Clicked\");\n});\n//add popup menu\nsplitButton.add(popupMenu);\n//add this control to panel\npanel.add(splitButton);\n```\n\n## Including in your project\n\n### Gradle\n\n1. Add the Jitpack repository to `build.gradle`\n```\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\n2. Add the dependency\n```\ndependencies {\n    implementation 'com.github.rhwood:jsplitbutton:Tag'\n}\n```\n\n### Maven\n\n1. Add the Jitpack repository to `pom.xml`\n```\n\u003crepositories\u003e\n    \u003crepository\u003e\n        \u003cid\u003ejitpack.io\u003c/id\u003e\n        \u003curl\u003ehttps://jitpack.io\u003c/url\u003e\n    \u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\n2. Add the dependency\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.rhwood\u003c/groupId\u003e\n    \u003cartifactId\u003ejsplitbutton\u003c/artifactId\u003e\n    \u003cversion\u003eTag\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Supported Java versions\n\nJSplitButton is supported on Java LTS versions 17, 21, and 25. Non-LTS versions of Java are not supported and will receive best-effort support.\n\nSupport for Java versions 8 and 11 is depricated, and CI testing will not be performed on these versions, but source code compatibility will be retained through a minimum of November 2026 for Java 8 and November 2027 for Java 11.\n\n## Migrating from Version 1.x to 2.0 or Newer\n\n1. Add the Jitpack.io repositories shown above\n2. Change the Group ID in `pom.xml` or `build.gradle` from `com.alexandriasoftware.swing` to `com.github.rhwood.jsplitbutton`\n3. Change the package name in imports from `com.alexandriasoftware.swing` to `com.github.rhwood.jsplitbutton`\n\n## License\n\n- Versions 1.3.1 and newer are released under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0)\n- Version 1.3.0 is released under the [GNU Public License 2.0](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)\n\n## Prior History\n\n* [Original development](http://code.google.com/p/jsplitbutton) by Naveed Quadri in 2012\n* [Updated](https://github.com/akuhtz/jsplitbutton) by [Andreas Kuhtz](https://github.com/akuhtz) in 2015\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frhwood%2Fjsplitbutton","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frhwood%2Fjsplitbutton","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frhwood%2Fjsplitbutton/lists"}