├── .gitignore ├── README.md ├── TimingFramework-0.55.jar ├── build.xml ├── build ├── built-jar.properties └── classes │ └── com │ └── raven │ ├── event │ ├── EventTimeChange.class │ ├── EventTimePicker.class │ └── EventTimeSelected.class │ └── swing │ ├── TimeComponent$1.class │ ├── TimeComponent$2.class │ ├── TimeComponent$3.class │ ├── TimeComponent.class │ ├── TimePicker$1.class │ ├── TimePicker$10.class │ ├── TimePicker$2.class │ ├── TimePicker$3.class │ ├── TimePicker$4.class │ ├── TimePicker$5.class │ ├── TimePicker$6.class │ ├── TimePicker$7.class │ ├── TimePicker$8.class │ ├── TimePicker$9.class │ ├── TimePicker.class │ ├── TimePickerButton$1.class │ ├── TimePickerButton$2.class │ ├── TimePickerButton.class │ ├── TimePickerLabel.class │ └── TimePickerMenu.class ├── lib ├── TimingFramework-0.55.jar └── swing-time-picker.jar ├── manifest.mf ├── nbproject ├── build-impl.xml ├── genfiles.properties ├── private │ ├── private.properties │ └── private.xml ├── project.properties └── project.xml ├── src └── com │ └── raven │ ├── event │ ├── EventTimeChange.java │ ├── EventTimePicker.java │ └── EventTimeSelected.java │ └── swing │ ├── TimeComponent.java │ ├── TimePicker.form │ ├── TimePicker.java │ ├── TimePickerButton.java │ ├── TimePickerLabel.java │ └── TimePickerMenu.java └── test └── testing ├── Main.form └── Main.java /.gitignore: -------------------------------------------------------------------------------- 1 | /nbproject/private/ 2 | /build/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # java-swing-timepicker 2 | Date : 29/08/2021
3 | For more Visit my youtube : https://www.youtube.com/c/HelloWorld-Raven/featured 4 |

5 | ![2021-08-29_170847](https://user-images.githubusercontent.com/58245926/131247117-f42003c0-a497-49ea-8ec5-0d4cde5f3e09.png) 6 | 7 | ## Method 8 | Method Name | Description 9 | ----------- | ------------ 10 | public void now(); | Set time picker to current time now 11 | public String getSelectedTime(); | Get time picker selected 12 | public void setDisplayText(JTextField displayText); | display currnet time picker to jtextfield 13 | public void setForeground(Color color); | set color to time picker 14 | public void setSelectedTime(Date date); | set time picker selected time to specific time 15 | public void addEventTimePicker(EventTimePicker event); | this event run when time selected change 16 | public void addActionListener(ActionListener event); | this event run when time picker is current show popup and user click ok 17 | public void showPopup(Component com, int x, int y); | to popup time picker 18 | public void set24hourMode(boolean value); | value true for 24 hour mode 19 |
20 | Support me by subscribe youtube channel 21 |
22 | -------------------------------------------------------------------------------- /TimingFramework-0.55.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/TimingFramework-0.55.jar -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Builds, tests, and runs the project swing-time-picker. 12 | 13 | 73 | 74 | -------------------------------------------------------------------------------- /build/built-jar.properties: -------------------------------------------------------------------------------- 1 | #Thu, 29 Jun 2023 17:15:04 +0700 2 | 3 | 4 | E\:\\Raven\\git\\java-swing-timepicker= 5 | -------------------------------------------------------------------------------- /build/classes/com/raven/event/EventTimeChange.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/event/EventTimeChange.class -------------------------------------------------------------------------------- /build/classes/com/raven/event/EventTimePicker.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/event/EventTimePicker.class -------------------------------------------------------------------------------- /build/classes/com/raven/event/EventTimeSelected.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/event/EventTimeSelected.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimeComponent$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimeComponent$1.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimeComponent$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimeComponent$2.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimeComponent$3.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimeComponent$3.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimeComponent.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimeComponent.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$1.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$10.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$10.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$2.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$3.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$3.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$4.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$4.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$5.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$5.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$6.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$6.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$7.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$7.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$8.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$8.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker$9.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker$9.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePicker.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePicker.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePickerButton$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePickerButton$1.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePickerButton$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePickerButton$2.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePickerButton.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePickerButton.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePickerLabel.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePickerLabel.class -------------------------------------------------------------------------------- /build/classes/com/raven/swing/TimePickerMenu.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/build/classes/com/raven/swing/TimePickerMenu.class -------------------------------------------------------------------------------- /lib/TimingFramework-0.55.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/lib/TimingFramework-0.55.jar -------------------------------------------------------------------------------- /lib/swing-time-picker.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DJ-Raven/java-swing-timepicker/98c7611afc05c8d50441772e26098bc22410ccb4/lib/swing-time-picker.jar -------------------------------------------------------------------------------- /manifest.mf: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | X-COMMENT: Main-Class will be added automatically by build 3 | 4 | -------------------------------------------------------------------------------- /nbproject/build-impl.xml: -------------------------------------------------------------------------------- 1 | 2 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | Must set src.dir 292 | Must set test.src.dir 293 | Must set build.dir 294 | Must set dist.dir 295 | Must set build.classes.dir 296 | Must set dist.javadoc.dir 297 | Must set build.test.classes.dir 298 | Must set build.test.results.dir 299 | Must set build.classes.excludes 300 | Must set dist.jar 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | Must set javac.includes 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | No tests executed. 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | Must set JVM to use for profiling in profiler.info.jvm 834 | Must set profiler agent JVM arguments in profiler.info.jvmargs.agent 835 | 836 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 | Must select some files in the IDE or set javac.includes 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1157 | 1158 | 1159 | 1160 | 1161 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 1196 | 1197 | 1198 | 1199 | 1200 | To run this application from the command line without Ant, try: 1201 | 1202 | java -jar "${dist.jar.resolved}" 1203 | 1204 | 1205 | 1206 | 1207 | 1208 | 1209 | 1210 | 1211 | 1212 | 1213 | 1214 | 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | 1221 | 1222 | 1223 | 1224 | 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | 1240 | 1241 | 1242 | 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | 1255 | 1256 | 1257 | 1258 | 1259 | 1264 | 1265 | 1266 | 1267 | 1268 | 1269 | 1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | 1288 | 1289 | 1290 | 1291 | 1292 | 1293 | 1294 | 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 1307 | 1308 | 1309 | 1310 | 1311 | 1312 | 1313 | 1314 | 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 1336 | 1337 | 1338 | 1339 | 1340 | Must select one file in the IDE or set run.class 1341 | 1342 | 1343 | 1344 | Must select one file in the IDE or set run.class 1345 | 1346 | 1347 | 1352 | 1353 | 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | 1365 | 1366 | 1367 | 1368 | 1369 | 1370 | 1371 | Must select one file in the IDE or set debug.class 1372 | 1373 | 1374 | 1375 | 1376 | Must select one file in the IDE or set debug.class 1377 | 1378 | 1379 | 1380 | 1381 | Must set fix.includes 1382 | 1383 | 1384 | 1385 | 1386 | 1387 | 1388 | 1393 | 1396 | 1397 | This target only works when run from inside the NetBeans IDE. 1398 | 1399 | 1400 | 1401 | 1402 | 1403 | 1404 | 1405 | 1406 | Must select one file in the IDE or set profile.class 1407 | This target only works when run from inside the NetBeans IDE. 1408 | 1409 | 1410 | 1411 | 1412 | 1413 | 1414 | 1415 | 1416 | This target only works when run from inside the NetBeans IDE. 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | This target only works when run from inside the NetBeans IDE. 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 1450 | 1451 | 1452 | 1453 | 1454 | 1455 | 1456 | 1457 | 1458 | 1459 | 1460 | 1461 | 1462 | 1463 | Must select one file in the IDE or set run.class 1464 | 1465 | 1466 | 1467 | 1468 | 1469 | Must select some files in the IDE or set test.includes 1470 | 1471 | 1472 | 1473 | 1474 | Must select one file in the IDE or set run.class 1475 | 1476 | 1477 | 1478 | 1479 | Must select one file in the IDE or set applet.url 1480 | 1481 | 1482 | 1483 | 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 1497 | 1498 | 1499 | 1500 | 1501 | 1502 | 1503 | 1504 | 1505 | 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 1515 | 1516 | 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | 1525 | 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | 1534 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 1565 | 1566 | 1567 | 1568 | 1569 | 1570 | 1571 | 1572 | 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | 1615 | 1616 | 1617 | Must select some files in the IDE or set javac.includes 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | Some tests failed; see details above. 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | Must select some files in the IDE or set test.includes 1655 | 1656 | 1657 | 1658 | Some tests failed; see details above. 1659 | 1660 | 1661 | 1662 | Must select some files in the IDE or set test.class 1663 | Must select some method in the IDE or set test.method 1664 | 1665 | 1666 | 1667 | Some tests failed; see details above. 1668 | 1669 | 1670 | 1675 | 1676 | Must select one file in the IDE or set test.class 1677 | 1678 | 1679 | 1680 | Must select one file in the IDE or set test.class 1681 | Must select some method in the IDE or set test.method 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1690 | 1691 | 1692 | 1693 | 1694 | 1699 | 1700 | Must select one file in the IDE or set applet.url 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1712 | 1713 | Must select one file in the IDE or set applet.url 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 1739 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 1772 | -------------------------------------------------------------------------------- /nbproject/genfiles.properties: -------------------------------------------------------------------------------- 1 | build.xml.data.CRC32=40fcb46f 2 | build.xml.script.CRC32=958daa81 3 | build.xml.stylesheet.CRC32=f85dc8f2@1.106.0.48 4 | # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. 5 | # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. 6 | nbproject/build-impl.xml.data.CRC32=40fcb46f 7 | nbproject/build-impl.xml.script.CRC32=94e862d4 8 | nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.106.0.48 9 | -------------------------------------------------------------------------------- /nbproject/private/private.properties: -------------------------------------------------------------------------------- 1 | compile.on.save=true 2 | user.properties.file=C:\\Users\\RAVEN\\AppData\\Roaming\\NetBeans\\17\\build.properties 3 | -------------------------------------------------------------------------------- /nbproject/private/private.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | file:/E:/Raven/git/java-swing-timepicker/test/testing/Main.java 7 | file:/E:/Raven/git/java-swing-timepicker/src/com/raven/swing/TimePicker.java 8 | file:/E:/Raven/git/java-swing-timepicker/src/com/raven/swing/TimeComponent.java 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /nbproject/project.properties: -------------------------------------------------------------------------------- 1 | annotation.processing.enabled=true 2 | annotation.processing.enabled.in.editor=false 3 | annotation.processing.processor.options= 4 | annotation.processing.processors.list= 5 | annotation.processing.run.all.processors=true 6 | annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output 7 | build.classes.dir=${build.dir}/classes 8 | build.classes.excludes=**/*.java,**/*.form 9 | # This directory is removed when the project is cleaned: 10 | build.dir=build 11 | build.generated.dir=${build.dir}/generated 12 | build.generated.sources.dir=${build.dir}/generated-sources 13 | # Only compile against the classpath explicitly listed here: 14 | build.sysclasspath=ignore 15 | build.test.classes.dir=${build.dir}/test/classes 16 | build.test.results.dir=${build.dir}/test/results 17 | # Uncomment to specify the preferred debugger connection transport: 18 | #debug.transport=dt_socket 19 | debug.classpath=\ 20 | ${run.classpath} 21 | debug.modulepath=\ 22 | ${run.modulepath} 23 | debug.test.classpath=\ 24 | ${run.test.classpath} 25 | debug.test.modulepath=\ 26 | ${run.test.modulepath} 27 | # Files in build.classes.dir which should be excluded from distribution jar 28 | dist.archive.excludes= 29 | # This directory is removed when the project is cleaned: 30 | dist.dir=dist 31 | dist.jar=${dist.dir}/swing-time-picker.jar 32 | dist.javadoc.dir=${dist.dir}/javadoc 33 | dist.jlink.dir=${dist.dir}/jlink 34 | dist.jlink.output=${dist.jlink.dir}/swing-time-picker 35 | excludes= 36 | file.reference.TimingFramework-0.55.jar=TimingFramework-0.55.jar 37 | includes=** 38 | jar.compress=false 39 | javac.classpath=\ 40 | ${file.reference.TimingFramework-0.55.jar} 41 | # Space-separated list of extra javac options 42 | javac.compilerargs= 43 | javac.deprecation=false 44 | javac.external.vm=true 45 | javac.modulepath= 46 | javac.processormodulepath= 47 | javac.processorpath=\ 48 | ${javac.classpath} 49 | javac.source=1.8 50 | javac.target=1.8 51 | javac.test.classpath=\ 52 | ${javac.classpath}:\ 53 | ${build.classes.dir} 54 | javac.test.modulepath=\ 55 | ${javac.modulepath} 56 | javac.test.processorpath=\ 57 | ${javac.test.classpath} 58 | javadoc.additionalparam= 59 | javadoc.author=false 60 | javadoc.encoding=${source.encoding} 61 | javadoc.html5=false 62 | javadoc.noindex=false 63 | javadoc.nonavbar=false 64 | javadoc.notree=false 65 | javadoc.private=false 66 | javadoc.splitindex=true 67 | javadoc.use=true 68 | javadoc.version=false 69 | javadoc.windowtitle= 70 | # The jlink additional root modules to resolve 71 | jlink.additionalmodules= 72 | # The jlink additional command line parameters 73 | jlink.additionalparam= 74 | jlink.launcher=true 75 | jlink.launcher.name=swing-time-picker 76 | main.class=swing.time.picker.SwingTimePicker 77 | manifest.file=manifest.mf 78 | meta.inf.dir=${src.dir}/META-INF 79 | mkdist.disabled=false 80 | platform.active=default_platform 81 | run.classpath=\ 82 | ${javac.classpath}:\ 83 | ${build.classes.dir} 84 | # Space-separated list of JVM arguments used when running the project. 85 | # You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. 86 | # To set system properties for unit tests define test-sys-prop.name=value: 87 | run.jvmargs= 88 | run.modulepath=\ 89 | ${javac.modulepath} 90 | run.test.classpath=\ 91 | ${javac.test.classpath}:\ 92 | ${build.test.classes.dir} 93 | run.test.modulepath=\ 94 | ${javac.test.modulepath} 95 | source.encoding=UTF-8 96 | src.dir=src 97 | test.src.dir=test 98 | -------------------------------------------------------------------------------- /nbproject/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.netbeans.modules.java.j2seproject 4 | 5 | 6 | swing-time-picker 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/com/raven/event/EventTimeChange.java: -------------------------------------------------------------------------------- 1 | package com.raven.event; 2 | 3 | public interface EventTimeChange { 4 | 5 | public void timeChange(boolean isHour); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/raven/event/EventTimePicker.java: -------------------------------------------------------------------------------- 1 | package com.raven.event; 2 | 3 | public interface EventTimePicker { 4 | 5 | public void timeSelected(String time); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/raven/event/EventTimeSelected.java: -------------------------------------------------------------------------------- 1 | package com.raven.event; 2 | 3 | public interface EventTimeSelected { 4 | 5 | public void hourSelected(int hour); 6 | 7 | public void minuteSelected(int minute); 8 | } 9 | -------------------------------------------------------------------------------- /src/com/raven/swing/TimeComponent.java: -------------------------------------------------------------------------------- 1 | package com.raven.swing; 2 | 3 | import com.raven.event.EventTimeChange; 4 | import com.raven.event.EventTimeSelected; 5 | import java.awt.BasicStroke; 6 | import java.awt.Color; 7 | import java.awt.Dimension; 8 | import java.awt.FontMetrics; 9 | import java.awt.Graphics; 10 | import java.awt.Graphics2D; 11 | import java.awt.RenderingHints; 12 | import java.awt.Shape; 13 | import java.awt.event.MouseAdapter; 14 | import java.awt.event.MouseEvent; 15 | import java.awt.event.MouseMotionAdapter; 16 | import java.awt.geom.Arc2D; 17 | import java.awt.geom.Rectangle2D; 18 | import java.text.DecimalFormat; 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | import javax.swing.JComponent; 22 | import javax.swing.SwingUtilities; 23 | import org.jdesktop.animation.timing.Animator; 24 | import org.jdesktop.animation.timing.TimingTarget; 25 | import org.jdesktop.animation.timing.TimingTargetAdapter; 26 | 27 | public class TimeComponent extends JComponent { 28 | 29 | public int getTime_minute() { 30 | return time_minute; 31 | } 32 | 33 | public void setTime_minute(int time_minute) { 34 | this.time_minute = time_minute; 35 | } 36 | 37 | public int getTime_hour() { 38 | return time_hour; 39 | } 40 | 41 | public void setTime_hour(int time_hour) { 42 | this.time_hour = time_hour; 43 | } 44 | 45 | public void setEventTimeChange(EventTimeChange eventTimeChange) { 46 | this.eventTimeChange = eventTimeChange; 47 | } 48 | 49 | public Color getColor() { 50 | return color; 51 | } 52 | 53 | public void setColor(Color color) { 54 | this.color = color; 55 | } 56 | 57 | private static final float RAD_PER_NUM = (float) (Math.PI / -6); 58 | private static final int OFFSET_24HOUR = 27; 59 | private Color color = new Color(237, 88, 207); 60 | private int time_minute = 0; 61 | private int time_hour = 0; 62 | private int currentSelected = 12; 63 | private int selectedHour = 12; 64 | private final Animator animator; 65 | private float hourAnimat = 12; 66 | private float betweenHour = 0; 67 | private int targetHour = 12; 68 | private float lastTarget; 69 | private boolean isHour = true; 70 | private List events; 71 | private EventTimeChange eventTimeChange; 72 | private boolean m_24hourclock = false; 73 | 74 | public TimeComponent() { 75 | events = new ArrayList<>(); 76 | setBackground(Color.WHITE); 77 | setForeground(new Color(50, 50, 50)); 78 | setPreferredSize(new Dimension(201, 201)); 79 | setFont(new java.awt.Font("sansserif", 0, 14)); 80 | addMouseListener(new MouseAdapter() { 81 | @Override 82 | public void mouseReleased(MouseEvent me) { 83 | if (SwingUtilities.isLeftMouseButton(me)) { 84 | if (isHour) { 85 | setTime_hour(getSelectedHour(me)); 86 | if (getTime_hour() == -1) { 87 | setTime_hour(currentSelected); 88 | } 89 | runEvent(getTime_hour()); 90 | changeToMinute(); 91 | } else { 92 | checkMouseSelect(me); 93 | } 94 | } 95 | } 96 | }); 97 | 98 | addMouseMotionListener(new MouseMotionAdapter() { 99 | @Override 100 | public void mouseDragged(MouseEvent me) { 101 | if (SwingUtilities.isLeftMouseButton(me)) { 102 | checkMouseSelectDragged(me); 103 | } 104 | } 105 | }); 106 | TimingTarget target = new TimingTargetAdapter() { 107 | @Override 108 | public void timingEvent(float fraction) { 109 | hourAnimat = lastTarget + betweenHour * fraction; 110 | repaint(); 111 | } 112 | 113 | @Override 114 | public void end() { 115 | selectedHour = targetHour; 116 | lastTarget = hourAnimat; 117 | if (isHour) { 118 | setTime_hour(selectedHour); 119 | } else { 120 | setTime_minute(selectedHour); 121 | } 122 | repaint(); 123 | runEvent(selectedHour); 124 | } 125 | }; 126 | animator = new Animator(200, target); 127 | animator.setResolution(0); 128 | } 129 | 130 | private void checkMouseSelect(MouseEvent me) { 131 | int width = getWidth(); 132 | int height = getHeight(); 133 | int size = Math.min(width, height); 134 | int x = (width - size) / 2; 135 | int y = (height - size) / 2; 136 | int space = isHour ? 30 : 6; 137 | int start = 90; 138 | int max = isHour ? 12 : 59; 139 | for (int i = isHour ? 1 : 0; i <= max; i++) { 140 | int add12hour = 0; 141 | if (isHour) { 142 | Shape s24 = new Arc2D.Double(x+OFFSET_24HOUR, y+OFFSET_24HOUR, size - 2*OFFSET_24HOUR, size-2*OFFSET_24HOUR, start - (space * i) - (space / 2), space, Arc2D.PIE); 143 | if (s24.contains(me.getPoint())) { 144 | add12hour=12; 145 | } 146 | } 147 | 148 | Shape s = new Arc2D.Double(x, y, size, size, start - (space * i) - (space / 2), space, Arc2D.PIE); 149 | if (s.contains(me.getPoint())) { 150 | i += add12hour; 151 | currentSelected = i; 152 | if (i != selectedHour) { 153 | targetHour = i; 154 | if (animator.isRunning()) { 155 | animator.stop(); 156 | lastTarget = convertLastTarget(lastTarget); 157 | } else { 158 | lastTarget = selectedHour; 159 | } 160 | betweenHour = calulateHour(lastTarget, targetHour); 161 | animator.start(); 162 | } 163 | break; 164 | } 165 | } 166 | } 167 | 168 | private void checkMouseSelectDragged(MouseEvent me) { 169 | int width = getWidth(); 170 | int height = getHeight(); 171 | int size = Math.min(width, height); 172 | int x = (width - size) / 2; 173 | int y = (height - size) / 2; 174 | int space = isHour ? 30 : 6; 175 | int start = 90; 176 | int max = isHour ? 12 : 59; 177 | for (int i = isHour ? 1 : 0; i <= max; i++) { 178 | int add12hour = 0; 179 | if (isHour) { 180 | Shape s24 = new Arc2D.Double(x+OFFSET_24HOUR, y+OFFSET_24HOUR, size - 2*OFFSET_24HOUR, size-2*OFFSET_24HOUR, start - (space * i) - (space / 2), space, Arc2D.PIE); 181 | if (s24.contains(me.getPoint())) { 182 | add12hour=12; 183 | } 184 | } 185 | Shape s = new Arc2D.Double(x, y, size, size, start - (space * i) - (space / 2), space, Arc2D.PIE); 186 | if (s.contains(me.getPoint())) { 187 | if (animator.isRunning()) { 188 | animator.stop(); 189 | } 190 | i+= add12hour; 191 | currentSelected = i; 192 | if (i != selectedHour) { 193 | hourAnimat = i; 194 | selectedHour = i; 195 | if (isHour) { 196 | time_hour = i; 197 | } else { 198 | time_minute = i; 199 | } 200 | runEvent(selectedHour); 201 | repaint(); 202 | } 203 | break; 204 | } 205 | } 206 | } 207 | 208 | private int getSelectedHour(MouseEvent me) { 209 | int width = getWidth(); 210 | int height = getHeight(); 211 | int size = Math.min(width, height); 212 | int x = (width - size)/ 2; 213 | int y = (height - size) / 2; 214 | int space = isHour ? 30 : 6; 215 | int start = 90; 216 | int max = isHour ? 12 : 59; 217 | 218 | for (int i = isHour ? 1 : 0; i <= max; i++) { 219 | int add12hour = 0; 220 | if (isHour) { 221 | Shape s24 = new Arc2D.Double(x+OFFSET_24HOUR, y+OFFSET_24HOUR, size - 2*OFFSET_24HOUR, size-2*OFFSET_24HOUR, start - (space * i) - (space / 2), space, Arc2D.PIE); 222 | 223 | if (s24.contains(me.getPoint())) { 224 | add12hour=12; 225 | } 226 | } 227 | 228 | Shape s = new Arc2D.Double(x, y, size, size, start - (space * i) - (space / 2), space, Arc2D.PIE); 229 | 230 | if (s.contains(me.getPoint())) { 231 | return i + add12hour == 24 ? 0 : i+add12hour; 232 | } 233 | } 234 | return -1; 235 | } 236 | 237 | private float calulateHour(float currentHour, int targetHour) { 238 | float t = targetHour - currentHour; 239 | if (t > (isHour ? 6 : 30)) { 240 | t = -((isHour ? 12 : 60) - t); 241 | } else if (t <= -(isHour ? 6 : 30)) { 242 | t += (isHour ? 12 : 60); 243 | } 244 | return t; 245 | } 246 | 247 | 248 | @Override 249 | protected void paintComponent(Graphics grphcs) { 250 | int width = getWidth(); 251 | int height = getHeight(); 252 | int size = Math.min(width, height); 253 | int x = (width - size) / 2; 254 | int y = (height - size) / 2; 255 | Graphics2D g2 = (Graphics2D) grphcs; 256 | g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 257 | g2.setColor(getBackground()); 258 | g2.fillOval(x, y, size, size); 259 | int centerX = width / 2; 260 | int centerY = height / 2; 261 | int centerSize = 7; 262 | g2.setColor(color); 263 | g2.fillOval(centerX - centerSize / 2, centerY - centerSize / 2, centerSize, centerSize); 264 | drawLineHour(g2, hourAnimat); 265 | createNumber(g2); 266 | 267 | g2.dispose(); 268 | super.paintComponent(grphcs); 269 | } 270 | 271 | private void createNumber(Graphics2D g2) { 272 | DecimalFormat df = new DecimalFormat("00"); 273 | int width = getWidth(); 274 | int height = getHeight(); 275 | int size = Math.min(width, height); 276 | int centerX = width / 2; 277 | int centerY = height / 2; 278 | for (int i = 12; i >= 1; i--) { 279 | String number; 280 | if (isHour) { 281 | number = i + ""; 282 | } else { 283 | number = df.format(i == 12 ? 0 : (i * 5)); 284 | } 285 | Dimension stringSize = getStringSize(g2, number); 286 | float angle = RAD_PER_NUM * i; 287 | float sine = (float) Math.sin(angle); 288 | float cosine = (float) Math.cos(angle); 289 | int dx = (int) ((size / 2 - 13) * -sine); 290 | int dy = (int) ((size / 2 - 13) * -cosine); 291 | if (convertLastTargetToHour(hourAnimat) == i * (isHour ? 1 : 5)) { 292 | g2.setColor(Color.WHITE); 293 | } else { 294 | g2.setColor(getForeground()); 295 | } 296 | g2.drawString(number, dx + centerX - (stringSize.width / 2), dy + centerY + 5); 297 | if (isHour && m_24hourclock) { 298 | number = df.format(i == 12 ? 0 : i+12); 299 | stringSize = getStringSize(g2, number); 300 | if (convertLastTargetToHour(hourAnimat) == (i == 12 ? 0 : i+12) ) { 301 | g2.setColor(Color.WHITE); 302 | } else { 303 | g2.setColor(getForeground()); 304 | } 305 | int dx2 = (int) ((size / 2 - 13 - OFFSET_24HOUR) * -sine); 306 | int dy2 = (int) ((size / 2 - 13 - OFFSET_24HOUR) * -cosine); 307 | 308 | g2.drawString(number, dx2 + centerX - (stringSize.width / 2), dy2 + centerY + 5); 309 | } 310 | } 311 | } 312 | 313 | private void drawLineHour(Graphics2D g2, float hour) { 314 | int width = getWidth(); 315 | int height = getHeight(); 316 | int centerX = width / 2; 317 | int centerY = height / 2; 318 | int size = Math.min(width, height) / 2 - 13; 319 | double rhours = (hour * (isHour ? 30 : 6)) * (Math.PI) / 180; 320 | // we have a 24 hour clock we need to modify some values 321 | if (isHour && m_24hourclock) { 322 | hour = getSelectedHour(); 323 | if (hour > 12 || hour == 0) { 324 | size -= OFFSET_24HOUR; 325 | if (hour > 12) 326 | rhours = ((hour-12) * 30) * (Math.PI) / 180; 327 | else // hour == 0; 328 | rhours = 0; 329 | } 330 | } 331 | int toX = centerX + (int) (size * Math.cos(rhours - (Math.PI / 2))); 332 | int toY = centerY + (int) (size * Math.sin(rhours - (Math.PI / 2))); 333 | g2.setStroke(new BasicStroke(2f)); 334 | g2.drawLine(centerX, centerY, toX, toY); 335 | int ovalSize = 23; 336 | g2.fillOval(toX - (ovalSize / 2), toY - (ovalSize / 2), ovalSize, ovalSize); 337 | } 338 | 339 | private Dimension getStringSize(Graphics2D g2, String text) { 340 | FontMetrics ft = g2.getFontMetrics(); 341 | Rectangle2D r2 = ft.getStringBounds(text, g2); 342 | return new Dimension((int) r2.getWidth(), (int) r2.getHeight()); 343 | } 344 | 345 | private int convertLastTargetToHour(float lastTarget) { 346 | int value = isHour ? (m_24hourclock ? 24 : 12) : 60; 347 | if (lastTarget <= 0) { 348 | lastTarget += value; 349 | } else if (lastTarget > value) { 350 | lastTarget -= value; 351 | } 352 | if (isHour && m_24hourclock) 353 | return getSelectedHour(); 354 | else 355 | return Math.round(lastTarget); 356 | } 357 | 358 | private float convertLastTarget(float lastTarget) { 359 | int value = isHour ? (m_24hourclock ? 24 : 12) : 60; 360 | if (lastTarget <= 0) { 361 | lastTarget += value; 362 | } else if (lastTarget > value) { 363 | lastTarget -= value; 364 | } 365 | return lastTarget; 366 | } 367 | 368 | private int convertHourToTargetMinute(int hour) { 369 | 370 | if ((!m_24hourclock && hour == 12) || (m_24hourclock && hour == 24)) { 371 | return 0; 372 | } else { 373 | return (hour % 12) * 5; 374 | } 375 | } 376 | 377 | private int convertMinuteToTargetHour(int minute) { 378 | if (minute == 0) { 379 | return 12; 380 | } else { 381 | return minute / 5; 382 | } 383 | } 384 | 385 | public void set24hour(boolean clock24hour) { 386 | m_24hourclock = clock24hour; 387 | } 388 | 389 | public int getSelectedHour() { 390 | return selectedHour; 391 | } 392 | 393 | public void setSelectedHour(int time_hour, int time_minute) { 394 | this.time_hour = time_hour; 395 | this.time_minute = time_minute; 396 | currentSelected = isHour ? time_hour : time_minute; 397 | if (currentSelected != selectedHour) { 398 | targetHour = currentSelected; 399 | if (animator.isRunning()) { 400 | animator.stop(); 401 | lastTarget = convertLastTarget(lastTarget); 402 | } else { 403 | lastTarget = selectedHour; 404 | } 405 | betweenHour = calulateHour(lastTarget, targetHour); 406 | animator.start(); 407 | } 408 | } 409 | 410 | public void addEventTimeSelected(EventTimeSelected evnet) { 411 | this.events.add(evnet); 412 | } 413 | 414 | public void runEvent(int hour) { 415 | for (EventTimeSelected event : events) { 416 | if (isHour) { 417 | event.hourSelected(hour); 418 | } else { 419 | event.minuteSelected(hour); 420 | } 421 | } 422 | } 423 | 424 | public void changeToMinute() { 425 | if (isHour) { 426 | eventTimeChange.timeChange(false); 427 | isHour = false; 428 | targetHour = time_minute; 429 | selectedHour = convertHourToTargetMinute(selectedHour); 430 | if (animator.isRunning()) { 431 | animator.stop(); 432 | lastTarget = convertLastTarget(lastTarget); 433 | } else { 434 | lastTarget = selectedHour; 435 | } 436 | betweenHour = calulateHour(lastTarget, targetHour); 437 | animator.start(); 438 | } 439 | } 440 | 441 | public void changeToHour() { 442 | if (!isHour) { 443 | eventTimeChange.timeChange(true); 444 | isHour = true; 445 | targetHour = time_hour; 446 | selectedHour = convertMinuteToTargetHour(selectedHour); 447 | if (animator.isRunning()) { 448 | animator.stop(); 449 | lastTarget = convertLastTarget(lastTarget); 450 | } else { 451 | lastTarget = selectedHour; 452 | } 453 | betweenHour = calulateHour(lastTarget, targetHour); 454 | animator.start(); 455 | } 456 | } 457 | } 458 | -------------------------------------------------------------------------------- /src/com/raven/swing/TimePicker.form: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 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 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | -------------------------------------------------------------------------------- /src/com/raven/swing/TimePicker.java: -------------------------------------------------------------------------------- 1 | package com.raven.swing; 2 | 3 | import com.raven.event.EventTimeChange; 4 | import com.raven.event.EventTimePicker; 5 | import com.raven.event.EventTimeSelected; 6 | import java.awt.Color; 7 | import java.awt.Component; 8 | import java.awt.event.ActionListener; 9 | import java.text.DecimalFormat; 10 | import java.text.SimpleDateFormat; 11 | import java.util.ArrayList; 12 | import java.util.Calendar; 13 | import java.util.Date; 14 | import java.util.List; 15 | import javax.swing.JPopupMenu; 16 | import javax.swing.JTextField; 17 | import javax.swing.SwingUtilities; 18 | import javax.swing.border.EmptyBorder; 19 | 20 | public class TimePicker extends javax.swing.JPanel { 21 | 22 | private final SimpleDateFormat formatampm = new SimpleDateFormat("hh:mm aa"); 23 | private final SimpleDateFormat format24h = new SimpleDateFormat("HH:mm"); 24 | private final DecimalFormat numberFormat = new DecimalFormat("00"); 25 | private JTextField displayText; 26 | private List events; 27 | private JPopupMenu menu; 28 | private SimpleDateFormat format = formatampm; 29 | 30 | public TimePicker() { 31 | initComponents(); 32 | init(); 33 | } 34 | 35 | private void init() { 36 | events = new ArrayList<>(); 37 | now(); 38 | panel.setVisible(!jCB24hour.isSelected()); 39 | EventTimeSelected event = new EventTimeSelected() { 40 | @Override 41 | public void hourSelected(int hour) { 42 | cmdHour.setText(numberFormat.format(hour)); 43 | displayOnText(); 44 | runEvent(); 45 | } 46 | 47 | @Override 48 | public void minuteSelected(int minute) { 49 | cmdMinute.setText(numberFormat.format(minute)); 50 | displayOnText(); 51 | runEvent(); 52 | } 53 | }; 54 | timeComponent.addEventTimeSelected(event); 55 | timeComponent.setEventTimeChange(new EventTimeChange() { 56 | @Override 57 | public void timeChange(boolean isHour) { 58 | if (isHour) { 59 | cmdHour.setForeground(Color.WHITE); 60 | cmdMinute.setForeground(new Color(178, 178, 178)); 61 | } else { 62 | cmdMinute.setForeground(Color.WHITE); 63 | cmdHour.setForeground(new Color(178, 178, 178)); 64 | } 65 | displayOnText(); 66 | runEvent(); 67 | } 68 | }); 69 | setForeground(new Color(37, 88, 207)); 70 | } 71 | 72 | private void changeAM(boolean am) { 73 | if (am) { 74 | cmdAM.setForeground(Color.WHITE); 75 | cmdPM.setForeground(new Color(178, 178, 178)); 76 | } else { 77 | cmdPM.setForeground(Color.WHITE); 78 | cmdAM.setForeground(new Color(178, 178, 178)); 79 | } 80 | displayOnText(); 81 | runEvent(); 82 | } 83 | 84 | private void displayOnText() { 85 | if (displayText != null) { 86 | if (jCB24hour.isSelected()) { 87 | displayText.setText(cmdHour.getText() + ":" + cmdMinute.getText()); 88 | } else { 89 | displayText.setText(cmdHour.getText() + ":" + cmdMinute.getText() + " " + (cmdAM.getForeground() == Color.WHITE ? "AM" : "PM")); 90 | } 91 | } 92 | } 93 | 94 | @SuppressWarnings("unchecked") 95 | // //GEN-BEGIN:initComponents 96 | private void initComponents() { 97 | 98 | header = new javax.swing.JPanel(); 99 | panelHeader = new javax.swing.JPanel(); 100 | lbSplit = new com.raven.swing.TimePickerLabel(); 101 | panel = new javax.swing.JPanel(); 102 | cmdAM = new com.raven.swing.TimePickerButton(); 103 | cmdPM = new com.raven.swing.TimePickerButton(); 104 | cmdHour = new com.raven.swing.TimePickerButton(); 105 | cmdMinute = new com.raven.swing.TimePickerButton(); 106 | cmdOK = new com.raven.swing.TimePickerButton(); 107 | cmdCancel = new com.raven.swing.TimePickerButton(); 108 | jCB24hour = new javax.swing.JCheckBox(); 109 | bg = new javax.swing.JPanel(); 110 | timeComponent = new com.raven.swing.TimeComponent(); 111 | 112 | setBackground(new java.awt.Color(255, 255, 255)); 113 | 114 | header.setBackground(new java.awt.Color(37, 88, 207)); 115 | header.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 116 | public void mouseDragged(java.awt.event.MouseEvent evt) { 117 | headerMouseDragged(evt); 118 | } 119 | }); 120 | header.addMouseListener(new java.awt.event.MouseAdapter() { 121 | public void mousePressed(java.awt.event.MouseEvent evt) { 122 | headerMousePressed(evt); 123 | } 124 | }); 125 | 126 | panelHeader.setOpaque(false); 127 | 128 | lbSplit.setForeground(new java.awt.Color(178, 178, 178)); 129 | lbSplit.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); 130 | lbSplit.setText(":"); 131 | lbSplit.setFont(new java.awt.Font("sansserif", 0, 48)); // NOI18N 132 | 133 | panel.setOpaque(false); 134 | 135 | cmdAM.setBackground(new java.awt.Color(37, 88, 207)); 136 | cmdAM.setBorder(null); 137 | cmdAM.setForeground(new java.awt.Color(255, 255, 255)); 138 | cmdAM.setText("AM"); 139 | cmdAM.setFont(new java.awt.Font("sansserif", 1, 15)); // NOI18N 140 | cmdAM.addActionListener(new java.awt.event.ActionListener() { 141 | public void actionPerformed(java.awt.event.ActionEvent evt) { 142 | cmdAMActionPerformed(evt); 143 | } 144 | }); 145 | 146 | cmdPM.setBackground(new java.awt.Color(37, 88, 207)); 147 | cmdPM.setBorder(null); 148 | cmdPM.setForeground(new java.awt.Color(255, 255, 255)); 149 | cmdPM.setText("PM"); 150 | cmdPM.setFont(new java.awt.Font("sansserif", 1, 15)); // NOI18N 151 | cmdPM.addActionListener(new java.awt.event.ActionListener() { 152 | public void actionPerformed(java.awt.event.ActionEvent evt) { 153 | cmdPMActionPerformed(evt); 154 | } 155 | }); 156 | 157 | javax.swing.GroupLayout panelLayout = new javax.swing.GroupLayout(panel); 158 | panel.setLayout(panelLayout); 159 | panelLayout.setHorizontalGroup( 160 | panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 161 | .addComponent(cmdPM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 162 | .addComponent(cmdAM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 163 | ); 164 | panelLayout.setVerticalGroup( 165 | panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 166 | .addGroup(panelLayout.createSequentialGroup() 167 | .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 168 | .addComponent(cmdAM, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 169 | .addGap(3, 3, 3) 170 | .addComponent(cmdPM, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 171 | .addGap(8, 8, 8)) 172 | ); 173 | 174 | cmdHour.setBackground(new java.awt.Color(37, 88, 207)); 175 | cmdHour.setForeground(new java.awt.Color(255, 255, 255)); 176 | cmdHour.setText("07"); 177 | cmdHour.setFont(new java.awt.Font("sansserif", 0, 48)); // NOI18N 178 | cmdHour.addActionListener(new java.awt.event.ActionListener() { 179 | public void actionPerformed(java.awt.event.ActionEvent evt) { 180 | cmdHourActionPerformed(evt); 181 | } 182 | }); 183 | 184 | cmdMinute.setBackground(new java.awt.Color(37, 88, 207)); 185 | cmdMinute.setForeground(new java.awt.Color(178, 178, 178)); 186 | cmdMinute.setText("30"); 187 | cmdMinute.setFont(new java.awt.Font("sansserif", 0, 48)); // NOI18N 188 | cmdMinute.addActionListener(new java.awt.event.ActionListener() { 189 | public void actionPerformed(java.awt.event.ActionEvent evt) { 190 | cmdMinuteActionPerformed(evt); 191 | } 192 | }); 193 | 194 | javax.swing.GroupLayout panelHeaderLayout = new javax.swing.GroupLayout(panelHeader); 195 | panelHeader.setLayout(panelHeaderLayout); 196 | panelHeaderLayout.setHorizontalGroup( 197 | panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 198 | .addGroup(panelHeaderLayout.createSequentialGroup() 199 | .addContainerGap() 200 | .addComponent(cmdHour, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 201 | .addGap(3, 3, 3) 202 | .addComponent(lbSplit, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 203 | .addGap(3, 3, 3) 204 | .addComponent(cmdMinute, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 205 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 206 | .addComponent(panel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 207 | .addContainerGap()) 208 | ); 209 | panelHeaderLayout.setVerticalGroup( 210 | panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 211 | .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelHeaderLayout.createSequentialGroup() 212 | .addContainerGap(9, Short.MAX_VALUE) 213 | .addGroup(panelHeaderLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 214 | .addComponent(cmdMinute, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) 215 | .addComponent(lbSplit, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) 216 | .addComponent(cmdHour, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) 217 | .addComponent(panel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 218 | .addContainerGap()) 219 | ); 220 | 221 | javax.swing.GroupLayout headerLayout = new javax.swing.GroupLayout(header); 222 | header.setLayout(headerLayout); 223 | headerLayout.setHorizontalGroup( 224 | headerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 225 | .addGroup(headerLayout.createSequentialGroup() 226 | .addContainerGap(35, Short.MAX_VALUE) 227 | .addComponent(panelHeader, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 228 | .addContainerGap(35, Short.MAX_VALUE)) 229 | ); 230 | headerLayout.setVerticalGroup( 231 | headerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 232 | .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, headerLayout.createSequentialGroup() 233 | .addGap(0, 0, Short.MAX_VALUE) 234 | .addComponent(panelHeader, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 235 | ); 236 | 237 | cmdOK.setForeground(new java.awt.Color(37, 88, 207)); 238 | cmdOK.setText("OK"); 239 | cmdOK.setFont(new java.awt.Font("sansserif", 1, 12)); // NOI18N 240 | cmdOK.addActionListener(new java.awt.event.ActionListener() { 241 | public void actionPerformed(java.awt.event.ActionEvent evt) { 242 | cmdOKActionPerformed(evt); 243 | } 244 | }); 245 | 246 | cmdCancel.setForeground(new java.awt.Color(37, 88, 207)); 247 | cmdCancel.setText("Cancel"); 248 | cmdCancel.setFont(new java.awt.Font("sansserif", 1, 12)); // NOI18N 249 | cmdCancel.addActionListener(new java.awt.event.ActionListener() { 250 | public void actionPerformed(java.awt.event.ActionEvent evt) { 251 | cmdCancelActionPerformed(evt); 252 | } 253 | }); 254 | 255 | jCB24hour.setText("24hour"); 256 | jCB24hour.addActionListener(new java.awt.event.ActionListener() { 257 | public void actionPerformed(java.awt.event.ActionEvent evt) { 258 | jCB24hourActionPerformed(evt); 259 | } 260 | }); 261 | 262 | bg.setOpaque(false); 263 | 264 | timeComponent.setBackground(new java.awt.Color(242, 242, 242)); 265 | 266 | javax.swing.GroupLayout bgLayout = new javax.swing.GroupLayout(bg); 267 | bg.setLayout(bgLayout); 268 | bgLayout.setHorizontalGroup( 269 | bgLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 270 | .addComponent(timeComponent, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 271 | ); 272 | bgLayout.setVerticalGroup( 273 | bgLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 274 | .addComponent(timeComponent, javax.swing.GroupLayout.DEFAULT_SIZE, 193, Short.MAX_VALUE) 275 | ); 276 | 277 | javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); 278 | this.setLayout(layout); 279 | layout.setHorizontalGroup( 280 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 281 | .addComponent(header, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 282 | .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 283 | .addContainerGap() 284 | .addComponent(jCB24hour) 285 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 286 | .addComponent(cmdCancel, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) 287 | .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 288 | .addComponent(cmdOK, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) 289 | .addContainerGap()) 290 | .addComponent(bg, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 291 | ); 292 | layout.setVerticalGroup( 293 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 294 | .addGroup(layout.createSequentialGroup() 295 | .addComponent(header, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 296 | .addGap(15, 15, 15) 297 | .addComponent(bg, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 298 | .addGap(13, 13, 13) 299 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 300 | .addComponent(cmdOK, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 301 | .addComponent(cmdCancel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 302 | .addComponent(jCB24hour)) 303 | .addGap(10, 10, 10)) 304 | ); 305 | }// //GEN-END:initComponents 306 | 307 | private void cmdHourActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdHourActionPerformed 308 | timeComponent.changeToHour(); 309 | }//GEN-LAST:event_cmdHourActionPerformed 310 | 311 | private void cmdMinuteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdMinuteActionPerformed 312 | timeComponent.changeToMinute(); 313 | }//GEN-LAST:event_cmdMinuteActionPerformed 314 | 315 | private void cmdAMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdAMActionPerformed 316 | changeAM(true); 317 | }//GEN-LAST:event_cmdAMActionPerformed 318 | 319 | private void cmdPMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdPMActionPerformed 320 | changeAM(false); 321 | }//GEN-LAST:event_cmdPMActionPerformed 322 | 323 | private void cmdCancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdCancelActionPerformed 324 | if (menu != null) { 325 | menu.setVisible(false); 326 | } 327 | }//GEN-LAST:event_cmdCancelActionPerformed 328 | 329 | private void cmdOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdOKActionPerformed 330 | if (menu != null) { 331 | menu.setVisible(false); 332 | } 333 | }//GEN-LAST:event_cmdOKActionPerformed 334 | private int x; 335 | private int y; 336 | private void headerMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_headerMousePressed 337 | x = evt.getX(); 338 | y = evt.getY() + 6; 339 | }//GEN-LAST:event_headerMousePressed 340 | 341 | private void headerMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_headerMouseDragged 342 | if (menu != null && menu.isVisible()) { 343 | if (SwingUtilities.isLeftMouseButton(evt)) { 344 | int xs = evt.getXOnScreen(); 345 | int ys = evt.getYOnScreen(); 346 | menu.setLocation(xs - x, ys - y); 347 | 348 | } 349 | } 350 | }//GEN-LAST:event_headerMouseDragged 351 | 352 | private void jCB24hourActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCB24hourActionPerformed 353 | panel.setVisible(!jCB24hour.isSelected()); 354 | timeComponent.set24hour(jCB24hour.isSelected()); 355 | timeComponent.repaint(); 356 | checkBorder(jCB24hour.isSelected()); 357 | }//GEN-LAST:event_jCB24hourActionPerformed 358 | 359 | @Override 360 | public void setForeground(Color color) { 361 | super.setForeground(color); 362 | if (header != null) { 363 | header.setBackground(color); 364 | timeComponent.setColor(color); 365 | cmdCancel.setForeground(color); 366 | cmdOK.setForeground(color); 367 | cmdHour.setBackground(color); 368 | cmdMinute.setBackground(color); 369 | cmdAM.setBackground(color); 370 | cmdPM.setBackground(color); 371 | if (menu != null) { 372 | menu.setBackground(color); 373 | } 374 | } 375 | } 376 | 377 | public JTextField getDisplayText() { 378 | return displayText; 379 | } 380 | 381 | public void setDisplayText(JTextField displayText) { 382 | this.displayText = displayText; 383 | } 384 | 385 | public void setSelectedTime(Date date) { 386 | String now = format.format(date); 387 | int hour = Integer.valueOf(now.split(":")[0]); 388 | int minute = Integer.valueOf(now.split(":")[1].split(" ")[0]); 389 | if (format.equals(formatampm)) { 390 | changeAM(now.split(" ")[1].equals("AM")); 391 | } 392 | cmdHour.setText(numberFormat.format(hour)); 393 | cmdMinute.setText(numberFormat.format(minute)); 394 | timeComponent.setSelectedHour(hour, minute); 395 | } 396 | 397 | public void now() { 398 | setSelectedTime(new Date()); 399 | } 400 | 401 | public String getSelectedTime() { 402 | return cmdHour.getText() + ":" + cmdMinute.getText() + " " + (cmdAM.getForeground() == Color.WHITE ? "AM" : "PM"); 403 | } 404 | 405 | public Date getSelectedDate() { 406 | Calendar c = Calendar.getInstance(); 407 | 408 | c.set(Calendar.HOUR_OF_DAY, Integer.valueOf(cmdHour.getText())); 409 | c.set(Calendar.MINUTE, Integer.valueOf(cmdMinute.getText())); 410 | 411 | return c.getTime(); 412 | } 413 | 414 | private void runEvent() { 415 | for (EventTimePicker event : events) { 416 | event.timeSelected(getSelectedTime()); 417 | } 418 | } 419 | 420 | public void addEventTimePicker(EventTimePicker event) { 421 | events.add(event); 422 | } 423 | 424 | public void addActionListener(ActionListener event) { 425 | cmdOK.addActionListener(event); 426 | } 427 | 428 | public void set24hourMode(boolean value) { 429 | jCB24hour.setVisible(false); 430 | jCB24hour.setSelected(value); 431 | format = (value ? format24h : formatampm); 432 | panel.setVisible(!value); 433 | timeComponent.set24hour(value); 434 | checkBorder(value); 435 | timeComponent.repaint(); 436 | } 437 | 438 | private void checkBorder(boolean value) { 439 | if (value) { 440 | bg.setBorder(new EmptyBorder(0, 10, 0, 10)); 441 | } else { 442 | bg.setBorder(new EmptyBorder(0, 0, 0, 0)); 443 | } 444 | } 445 | 446 | public void showPopup(Component com, int x, int y) { 447 | if (menu == null) { 448 | menu = new TimePickerMenu(); 449 | menu.setBackground(getForeground()); 450 | menu.add(this); 451 | } 452 | menu.show(com, x, y); 453 | } 454 | 455 | // Variables declaration - do not modify//GEN-BEGIN:variables 456 | private javax.swing.JPanel bg; 457 | private com.raven.swing.TimePickerButton cmdAM; 458 | private com.raven.swing.TimePickerButton cmdCancel; 459 | private com.raven.swing.TimePickerButton cmdHour; 460 | private com.raven.swing.TimePickerButton cmdMinute; 461 | private com.raven.swing.TimePickerButton cmdOK; 462 | private com.raven.swing.TimePickerButton cmdPM; 463 | private javax.swing.JPanel header; 464 | private javax.swing.JCheckBox jCB24hour; 465 | private com.raven.swing.TimePickerLabel lbSplit; 466 | private javax.swing.JPanel panel; 467 | private javax.swing.JPanel panelHeader; 468 | private com.raven.swing.TimeComponent timeComponent; 469 | // End of variables declaration//GEN-END:variables 470 | } 471 | -------------------------------------------------------------------------------- /src/com/raven/swing/TimePickerButton.java: -------------------------------------------------------------------------------- 1 | package com.raven.swing; 2 | 3 | import java.awt.AlphaComposite; 4 | import java.awt.Color; 5 | import java.awt.Cursor; 6 | import java.awt.Graphics; 7 | import java.awt.Graphics2D; 8 | import java.awt.Point; 9 | import java.awt.RenderingHints; 10 | import java.awt.event.MouseAdapter; 11 | import java.awt.event.MouseEvent; 12 | import java.awt.image.BufferedImage; 13 | import javax.swing.JButton; 14 | import javax.swing.border.EmptyBorder; 15 | import org.jdesktop.animation.timing.Animator; 16 | import org.jdesktop.animation.timing.TimingTarget; 17 | import org.jdesktop.animation.timing.TimingTargetAdapter; 18 | 19 | public class TimePickerButton extends JButton { 20 | 21 | public Color getEffectColor() { 22 | return effectColor; 23 | } 24 | 25 | public void setEffectColor(Color effectColor) { 26 | this.effectColor = effectColor; 27 | } 28 | 29 | private Animator animator; 30 | private int targetSize; 31 | private float animatSize; 32 | private Point pressedPoint; 33 | private float alpha; 34 | private Color effectColor = new Color(173, 173, 173); 35 | 36 | public TimePickerButton() { 37 | setContentAreaFilled(false); 38 | setBorder(new EmptyBorder(5, 0, 5, 0)); 39 | setBackground(Color.WHITE); 40 | setCursor(new Cursor(Cursor.HAND_CURSOR)); 41 | addMouseListener(new MouseAdapter() { 42 | @Override 43 | public void mousePressed(MouseEvent me) { 44 | targetSize = Math.max(getWidth(), getHeight()) * 2; 45 | animatSize = 0; 46 | pressedPoint = me.getPoint(); 47 | alpha = 0.5f; 48 | if (animator.isRunning()) { 49 | animator.stop(); 50 | } 51 | animator.start(); 52 | } 53 | }); 54 | TimingTarget target = new TimingTargetAdapter() { 55 | @Override 56 | public void timingEvent(float fraction) { 57 | if (fraction > 0.5f) { 58 | alpha = 1 - fraction; 59 | } 60 | animatSize = fraction * targetSize; 61 | repaint(); 62 | } 63 | }; 64 | animator = new Animator(400, target); 65 | animator.setResolution(0); 66 | } 67 | 68 | @Override 69 | protected void paintComponent(Graphics grphcs) { 70 | int width = getWidth(); 71 | int height = getHeight(); 72 | BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 73 | Graphics2D g2 = img.createGraphics(); 74 | g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 75 | g2.setColor(getBackground()); 76 | g2.fillRoundRect(0, 0, width, height, 5, 5); 77 | if (pressedPoint != null) { 78 | g2.setColor(effectColor); 79 | g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); 80 | g2.fillOval((int) (pressedPoint.x - animatSize / 2), (int) (pressedPoint.y - animatSize / 2), (int) animatSize, (int) animatSize); 81 | } 82 | g2.dispose(); 83 | grphcs.drawImage(img, 0, 0, null); 84 | super.paintComponent(grphcs); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/com/raven/swing/TimePickerLabel.java: -------------------------------------------------------------------------------- 1 | package com.raven.swing; 2 | 3 | import javax.swing.JLabel; 4 | import javax.swing.border.EmptyBorder; 5 | 6 | public class TimePickerLabel extends JLabel { 7 | 8 | public TimePickerLabel() { 9 | setBorder(new EmptyBorder(5, 0, 5, 0)); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/com/raven/swing/TimePickerMenu.java: -------------------------------------------------------------------------------- 1 | package com.raven.swing; 2 | 3 | import java.awt.Color; 4 | import java.awt.Graphics; 5 | import javax.swing.JPopupMenu; 6 | 7 | public class TimePickerMenu extends JPopupMenu { 8 | 9 | @Override 10 | protected void paintComponent(Graphics grphcs) { 11 | grphcs.setColor(getBackground()); 12 | grphcs.fillRect(0, 0, getWidth(), 81); 13 | grphcs.setColor(Color.WHITE); 14 | grphcs.fillRect(0, 81, getWidth(), getHeight()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /test/testing/Main.form: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 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 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | -------------------------------------------------------------------------------- /test/testing/Main.java: -------------------------------------------------------------------------------- 1 | /* 2 | * To change this license header, choose License Headers in Project Properties. 3 | * To change this template file, choose Tools | Templates 4 | * and open the template in the editor. 5 | */ 6 | package testing; 7 | 8 | import java.awt.Color; 9 | 10 | /** 11 | * 12 | * @author RAVEN 13 | */ 14 | public class Main extends javax.swing.JFrame { 15 | 16 | /** 17 | * Creates new form Main 18 | */ 19 | public Main() { 20 | initComponents(); 21 | getContentPane().setBackground(new Color(240, 240, 240)); 22 | } 23 | 24 | /** 25 | * This method is called from within the constructor to initialize the form. 26 | * WARNING: Do NOT modify this code. The content of this method is always 27 | * regenerated by the Form Editor. 28 | */ 29 | @SuppressWarnings("unchecked") 30 | // //GEN-BEGIN:initComponents 31 | private void initComponents() { 32 | 33 | timePicker1 = new com.raven.swing.TimePicker(); 34 | jButton1 = new javax.swing.JButton(); 35 | txtTime = new javax.swing.JTextField(); 36 | 37 | timePicker1.setForeground(new java.awt.Color(138, 48, 191)); 38 | timePicker1.setDisplayText(txtTime); 39 | 40 | setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 41 | 42 | jButton1.setText("Show Time"); 43 | jButton1.addActionListener(new java.awt.event.ActionListener() { 44 | public void actionPerformed(java.awt.event.ActionEvent evt) { 45 | jButton1ActionPerformed(evt); 46 | } 47 | }); 48 | 49 | javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 50 | getContentPane().setLayout(layout); 51 | layout.setHorizontalGroup( 52 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 53 | .addGroup(layout.createSequentialGroup() 54 | .addGap(358, 358, 358) 55 | .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 56 | .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE) 57 | .addComponent(txtTime, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE)) 58 | .addContainerGap(376, Short.MAX_VALUE)) 59 | ); 60 | layout.setVerticalGroup( 61 | layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 62 | .addGroup(layout.createSequentialGroup() 63 | .addContainerGap() 64 | .addComponent(txtTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 65 | .addGap(210, 210, 210) 66 | .addComponent(jButton1) 67 | .addContainerGap(287, Short.MAX_VALUE)) 68 | ); 69 | 70 | pack(); 71 | setLocationRelativeTo(null); 72 | }// //GEN-END:initComponents 73 | 74 | private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed 75 | timePicker1.showPopup(this, (getWidth() - timePicker1.getPreferredSize().width) / 2, (getHeight() - timePicker1.getPreferredSize().height) / 2); 76 | }//GEN-LAST:event_jButton1ActionPerformed 77 | 78 | /** 79 | * @param args the command line arguments 80 | */ 81 | public static void main(String args[]) { 82 | /* Set the Nimbus look and feel */ 83 | // 84 | /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 85 | * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 86 | */ 87 | try { 88 | for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 89 | if ("Nimbus".equals(info.getName())) { 90 | javax.swing.UIManager.setLookAndFeel(info.getClassName()); 91 | break; 92 | } 93 | } 94 | } catch (ClassNotFoundException ex) { 95 | java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 96 | } catch (InstantiationException ex) { 97 | java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 98 | } catch (IllegalAccessException ex) { 99 | java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 100 | } catch (javax.swing.UnsupportedLookAndFeelException ex) { 101 | java.util.logging.Logger.getLogger(Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 102 | } 103 | // 104 | 105 | /* Create and display the form */ 106 | java.awt.EventQueue.invokeLater(new Runnable() { 107 | public void run() { 108 | new Main().setVisible(true); 109 | } 110 | }); 111 | } 112 | 113 | // Variables declaration - do not modify//GEN-BEGIN:variables 114 | private javax.swing.JButton jButton1; 115 | private com.raven.swing.TimePicker timePicker1; 116 | private javax.swing.JTextField txtTime; 117 | // End of variables declaration//GEN-END:variables 118 | } 119 | --------------------------------------------------------------------------------