├── .classpath ├── .gitignore ├── .project ├── CONTRIBUTORS.md ├── LICENSE ├── README.md ├── my.db ├── passwords.txt ├── pom.xml ├── resources ├── css │ └── application.css ├── fxml │ ├── CloseAppBox.fxml │ ├── MainController.fxml │ ├── ProfessorController.fxml │ ├── RegisterController.fxml │ ├── StudentController.fxml │ └── TopBar.fxml └── image │ ├── icons8-back-52.png │ ├── icons8-contacts-50.png │ ├── icons8-course-32.png │ ├── icons8-exit-52.png │ ├── icons8-lock-32.png │ ├── icons8-new-post-32.png │ └── icons8-sync-32.png ├── screenshots ├── login_screen.jpg ├── student enroll.jpg ├── student_register.jpg ├── student_screen.jpg ├── teacher_register.jpg └── teacher_screen.jpg ├── spartanizer.xml └── src ├── assembly └── assembly.xml └── main └── java └── org └── javafx └── studentsmanagementsystem ├── application └── Main.java ├── controller ├── CloseAppBox.java ├── MainController.java ├── ProfessorController.java ├── RegisterController.java ├── StudentController.java └── TopBar.java ├── model ├── Enrollment.java ├── Grade.java ├── Professor.java ├── SQLiteJDBC.java └── Student.java └── tools ├── JavaFXTools.java └── NotificationType.java /.classpath: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | 49 | # Ignore XR3Player folders 50 | /target/* 51 | 52 | # Compiled class file 53 | *.class 54 | 55 | # Log file 56 | *.log 57 | 58 | # BlueJ files 59 | *.ctxt 60 | 61 | # Mobile Tools for Java (J2ME) 62 | .mtj.tmp/ 63 | 64 | # Package Files # 65 | *.jar 66 | *.war 67 | *.nar 68 | *.ear 69 | *.zip 70 | *.tar.gz 71 | *.rar 72 | 73 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 74 | hs_err_pid* 75 | 76 | 77 | # Ignore more 78 | /target 79 | /bin 80 | /.settings 81 | startanizer.xml 82 | .classpath 83 | .settings -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | JavaFX-Student-Management-System 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | spartan.tipper 15 | 16 | 17 | 18 | 19 | org.eclipse.m2e.core.maven2Builder 20 | 21 | 22 | 23 | 24 | 25 | org.eclipse.m2e.core.maven2Nature 26 | org.eclipse.jdt.core.javanature 27 | il.org.spartan.nature 28 | 29 | 30 | -------------------------------------------------------------------------------- /CONTRIBUTORS.md: -------------------------------------------------------------------------------- 1 | JavaFX Student Management Contributors 2 | ============================================ 3 | 4 | * **[GOXR3PLUS](https://github.com/goxr3plus)** 5 | 6 | * Several UI upgrades 7 | * Added Maven Support 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JavaFX Student Management System 2 | A Java application for managing students teachers, and grades. 3 | 4 | [![GitHub stars](https://img.shields.io/github/stars/catman85/JavaFX-Student-Management-System.svg?style=flat-square)](https://github.com/catman85/Android-Simple-Messaging-App-UI/stargazers) [![GitHub forks](https://img.shields.io/github/forks/catman85/JavaFX-Student-Management-System.svg?style=flat-square)](https://github.com/catman85/JavaFX-Student-Management-System/network) [![HitCount](http://hits.dwyl.io/catman85/JavaFX-Student-Management-System.svg)](http://hits.dwyl.io/catman85/JavaFX-Student-Management-System) [![GitHub license](https://img.shields.io/github/license/catman85/JavaFX-Student-Management-System.svg?style=flat-square)](https://github.com/catman85/JavaFX-Student-Management-System/blob/master/LICENSE) 5 | 6 | ## Use Case 7 | Teachers and Students register in the platform. 8 | Students log in the platform to enroll in courses and see the grades they received. 9 | Teachers log in the platform to view their students and give them grades. 10 | 11 | ## Screenshots 12 | 13 | | Login Screen | Student Enroll 14 | |:-:|:-:| 15 | | ![login_screen](https://user-images.githubusercontent.com/20374208/45230776-a66f7a00-b2d2-11e8-9900-21e8bd812cfe.jpg) | ![student enroll](https://user-images.githubusercontent.com/20374208/45230777-a66f7a00-b2d2-11e8-8830-e81f8f27cb8f.jpg) | 16 | 17 | | Student Register | Student Screen 18 | |:-:|:-:| 19 | | ![student_register](https://user-images.githubusercontent.com/20374208/45230778-a7081080-b2d2-11e8-9c52-4b7a9da092ac.jpg) | ![student_screen](https://user-images.githubusercontent.com/20374208/45230779-a7081080-b2d2-11e8-8b3e-0a687c1d79af.jpg) | 20 | 21 | | Teacher Register | Teacher Screen 22 | |:-:|:-:| 23 | | ![teacher_register](https://user-images.githubusercontent.com/20374208/45230780-a7081080-b2d2-11e8-8753-7ad67f63def7.jpg) | ![teacher_screen](https://user-images.githubusercontent.com/20374208/45230781-a7081080-b2d2-11e8-99ac-f6a29f74fa32.jpg) | 24 | 25 | ## Specs / Open-source libraries: 26 | 27 | - [**Ikonli Font Icons packs**](https://aalmiray.github.io/ikonli) Ikonli provides icon packs that can be used in Java applications. Currently Swing and JavaFX UI toolkits are supported. 28 | - [**JFoenix**](https://github.com/jfoenixadmin/JFoenix) JavaFX Material Design Library . 29 | - [**Sqlite-jdbc**](https://github.com/xerial/sqlite-jdbc) SQLite JDBC Driver . 30 | - [**FX-BorderlessScene**](https://github.com/goxr3plus/FX-BorderlessScene) Undecorated JavaFX Scene with implemented move, resize, 31 | 32 | ## How to fork and support this project 33 | 34 | To build this project , you will need: 35 | 36 | * [JDK 9+] 37 | * [Maven](http://maven.apache.org/) - Version 3.5.3++ recommended 38 | 39 | Follow the above instructions and run ``mvn clean package`` , be sure that you are compiling with Java 9 40 | 41 | ## How to build 42 | 43 | This is a Maven project you just use : 44 | 45 | ```MAVEN 46 | mvn clean install 47 | ``` 48 | 49 | ## The "passwords.txt" file 50 | In the root directory of the repo you will find 51 | a file with a list of passwords for students and teachers. 52 | Feel free to delete the "my.db" file that is created by SQLite and start a fresh one. 53 | 54 | ## [Contributors](https://github.com/catman85/JavaFX-Student-Management-System/blob/master/CONTRIBUTORS.md) ❤️ 55 | -------------------------------------------------------------------------------- /my.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/my.db -------------------------------------------------------------------------------- /passwords.txt: -------------------------------------------------------------------------------- 1 | students: 2 | --mail-- --password-- 3 | maria@gmail.com maria 4 | elenh@gmail.com elenh 5 | george@gmail.com george 6 | kwnnos@gmail.com kwnnos 7 | desp@gmail.com desp 8 | 9 | professors: 10 | --mail-- --password-- 11 | john@gmail.com john 12 | nikos@gmail.com nikos 13 | christos@gmail.com christos 14 | dhm@gmail.com dhm 15 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 4 | 4.0.0 5 | 6 | org.javafx.project 7 | JavaFX-Student-Management-System 8 | 1.0.0 9 | jar 10 | 11 | JavaFX-Student-Management-System 12 | http://maven.apache.org 13 | 14 | 15 | 1.9 16 | 1.9 17 | UTF-8 18 | 1.0.0 19 | 20 | 21 | 22 | FXStudentsManagement 23 | src 24 | 25 | 26 | resources 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 41 | 42 | 43 | 44 | org.apache.maven.plugins 45 | maven-compiler-plugin 46 | 3.7.0 47 | 48 | 1.9 49 | 1.9 50 | 9 51 | javac9 52 | UTF-8 53 | 54 | 55 | 56 | 57 | 58 | org.apache.maven.plugins 59 | maven-jar-plugin 60 | 3.1.0 61 | 62 | 63 | 64 | true 65 | 66 | main.java.org.javafx.studentsmanagementsystem.application.Main 67 | FXLibrary_lib/ 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | org.apache.maven.plugins 76 | maven-dependency-plugin 77 | 3.1.0 78 | 79 | 80 | copy-dependencies 81 | package 82 | 83 | copy-dependencies 84 | 85 | 86 | 87 | junit 88 | ${project.build.directory}/FXLibrary_lib/ 89 | 90 | 91 | 92 | 93 | 94 | org.eluder.coveralls 95 | coveralls-maven-plugin 96 | 4.3.0 97 | 98 | 99 | 100 | 101 | org.codehaus.mojo 102 | cobertura-maven-plugin 103 | 2.7 104 | 105 | xml 106 | 256m 107 | 108 | 109 | 110 | 111 | 112 | 113 | maven-assembly-plugin 114 | 3.1.0 115 | 116 | 117 | src/assembly/assembly.xml 118 | 119 | FXStudentsManagement ${my.project.version} 120 | false 121 | 122 | 123 | 124 | create-archive 125 | package 126 | 127 | single 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | jitpack.io 139 | https://jitpack.io 140 | 141 | 142 | 143 | 144 | 145 | junit 146 | junit 147 | 3.8.1 148 | test 149 | 150 | 151 | 152 | com.github.goxr3plus 153 | FX-BorderlessScene 154 | V3.0.0 155 | 156 | 157 | 158 | commons-codec 159 | commons-codec 160 | 1.11 161 | 162 | 163 | 164 | org.xerial 165 | sqlite-jdbc 166 | 3.23.1 167 | 168 | 169 | 170 | com.jfoenix 171 | jfoenix 172 | 9.0.4 173 | 174 | 175 | 176 | org.kordamp.ikonli 177 | ikonli-javafx 178 | 2.3.0 179 | 180 | 181 | 182 | org.kordamp.ikonli 183 | ikonli-typicons-pack 184 | 2.3.0 185 | 186 | 187 | org.kordamp.ikonli 188 | ikonli-fontawesome-pack 189 | 2.3.0 190 | 191 | 192 | org.kordamp.ikonli 193 | ikonli-material-pack 194 | 2.3.0 195 | 196 | 197 | org.kordamp.ikonli 198 | ikonli-fontawesome5-pack 199 | 2.3.0 200 | 201 | 202 | 203 | org.controlsfx 204 | controlsfx 205 | 9.0.0 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /resources/css/application.css: -------------------------------------------------------------------------------- 1 | *{ 2 | -light-black: rgb(74.0, 75.0, 78.0); 3 | -dark-highlight: rgb(87.0, 89.0, 92.0); 4 | -dark-black: rgb(39.0, 40.0, 40.0); 5 | -darkest-black: rgb(5.0, 5.0, 5.0); 6 | -mid-gray: rgb(216.0, 222.0, 227.0); 7 | } 8 | 9 | 10 | /******************************************************************************* 11 | 12 | * bread-crumb-bar * 13 | 14 | ******************************************************************************/ 15 | 16 | 17 | .bread-crumb-bar { 18 | -fx-background-color: #101010; 19 | } 20 | 21 | .bread-crumb-bar .button { 22 | /*-fx-padding: 8.0 12.0 8.0 20.0; 23 | -fx-border-color: null; 24 | -fx-border-insets: 0.0; 25 | -fx-content-display: left; 26 | -fx-background-position: left center; 27 | -fx-background-repeat: no-repeat; 28 | -fx-background-color: transparent; 29 | -fx-border-color: transparent; 30 | -fx-shape: null; 31 | */ 32 | -fx-cursor:hand; 33 | } 34 | 35 | /*.bread-crumb-bar .first { 36 | -fx-background-color: transparent ; 37 | -fx-border-color: transparent; 38 | -fx-font-size: 1.11em; 39 | -fx-text-fill: #000; 40 | -fx-background-image: null; 41 | -fx-shape: null; 42 | -fx-padding: 8.0 12.0 8.0 0.0; 43 | } 44 | .crumb { 45 | -fx-text-fill: white; 46 | 47 | } 48 | .crumb:hover, .crumb:selected, .crumb:focused { 49 | -fx-background-color: rgba(0.0,0.0,0.0,0.1); 50 | -fx-border-color: null; 51 | -fx-font-weight:bold; 52 | -fx-text-fill: white; 53 | 54 | } 55 | 56 | */ 57 | 58 | /******************************************************************************* 59 | 60 | * SplitPane * 61 | 62 | ******************************************************************************/ 63 | 64 | .split-pane{ 65 | -fx-background-color:transparent ; 66 | } 67 | 68 | .split-pane .split-pane-divider{ 69 | -fx-background-color: 70 | -darkest-black, 71 | -dark-highlight, 72 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 73 | } 74 | 75 | .split-pane .split-pane-divider:hover{ 76 | -fx-background-color:firebrick; 77 | } 78 | 79 | 80 | /******************************************************************************* 81 | 82 | * PieChart * 83 | 84 | ******************************************************************************/ 85 | 86 | 87 | .chart .chart-title .text{ 88 | -fx-font-size:9.0px; 89 | } 90 | 91 | .chart-pie-label { 92 | -fx-fill: white; 93 | /*-fx-font-weight:bold;*/ 94 | -fx-font-size: 1.0em; 95 | } 96 | 97 | .chart .chart-title .text{ 98 | -fx-font-weight:bold; 99 | -fx-fill:white; 100 | } 101 | 102 | .chart .chart-content .chart-pie-label-line { 103 | -fx-stroke: #8b4513; 104 | -fx-fill: #8b4513; 105 | } 106 | 107 | /******************************************************************************* 108 | 109 | * XYChart * 110 | 111 | ******************************************************************************/ 112 | 113 | .bar-chart:vertical{ 114 | -fx-background-color:#202020; 115 | } 116 | 117 | 118 | .axis:left{ 119 | 120 | -fx-tick-label-fill: white; 121 | -fx-minor-tick-visible:false; 122 | } 123 | 124 | .bar-chart:vertical .chart-content .chart-plot-background{ 125 | -fx-background-color:#202020; 126 | } 127 | 128 | .bar-chart:vertical .chart-title{ 129 | -fx-background-color:#202020; 130 | -fx-font-weight:bold; 131 | -fx-font-size:15.0px; 132 | } 133 | 134 | .axis:bottom{ 135 | -fx-background-color:#252525; 136 | } 137 | 138 | .axis:bottom .axis-tick-mark{ 139 | -fx-fill:red; 140 | } 141 | 142 | .axis:bottom .axis-label .text{ 143 | -fx-fill:white; 144 | } 145 | 146 | 147 | /******************************************************************************* 148 | 149 | * CheckBox * 150 | 151 | ******************************************************************************/ 152 | 153 | 154 | /*.check-box .box { 155 | -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color; 156 | -fx-background-insets: 0.0 0.0 -1.0 0.0, 0.0, 1.0, 2.0; 157 | -fx-background-radius: 2.0, 2.0, 1.0, 1.0; 158 | 159 | -fx-padding: 16.0; 3 -- padding from the outside edge to the mark 160 | } 161 | */ 162 | 163 | 164 | /******************************************************************************* 165 | 166 | * PlayListsSettingsController * 167 | 168 | ******************************************************************************/ 169 | 170 | .settingsLabel{ 171 | -fx-border-color: white white transparent white; 172 | -fx-text-fill:gold; 173 | -fx-font-weight:bold; 174 | -fx-font-size:18.0; 175 | 176 | } 177 | 178 | .settingsRadioButton{ 179 | -fx-text-fill:white; 180 | -fx-font-weight:bold; 181 | -fx-cursor:hand; 182 | } 183 | 184 | .white-black-label{ 185 | -fx-text-fill:white; 186 | -fx-font-size:14.0px; 187 | -fx-font-weight:bold; 188 | -fx-background-color:#151515; 189 | } 190 | 191 | /******************************************************************************* 192 | 193 | * ToolBar * 194 | 195 | ******************************************************************************/ 196 | 197 | .tool-bar{ 198 | -fx-background-color: -mid-gray; 199 | 200 | -fx-base: -dark-black; 201 | -fx-font-size: 15.0pt; 202 | -fx-font-weight:bold; 203 | -fx-background-color: 204 | linear-gradient(to bottom, derive(-fx-base,-30.0%), derive(-fx-base,-60.0%)), 205 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 206 | -fx-background-insets: 0.0, 0.0 0.0 1.0 0.0; 207 | /*-fx-padding: 0.9em 0.416667em 0.9em 0.416667em;*/ 208 | -fx-effect: dropshadow(two-pass-box,black,5.0,0.2,0.0,0.0); 209 | } 210 | 211 | .tool-bar2{ 212 | -fx-base: white; 213 | } 214 | 215 | .segmented-button-bar .button , .segmented-button-bar .toggle-button{ 216 | -fx-background-color: 217 | -darkest-black, 218 | -dark-highlight, 219 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 220 | -fx-background-insets: 0.0, 1.0 1.0 1.0 0.0, 2.0 1.0 1.0 1.0; 221 | -fx-background-radius: 0.0 !important; 222 | -fx-padding: 0.4em 1.833333em 0.4em 1.833333em; 223 | } 224 | 225 | .segmented-button-bar .button.first { 226 | -fx-background-insets: 0.0, 1.0, 2.0 1.0 1.0 1.0; 227 | -fx-background-radius: 3.0 0.0 0.0 3.0, 2.0 0.0 0.0 2.0, 2.0 0.0 0.0 2.0; 228 | } 229 | 230 | .segmented-button-bar .button.last { 231 | -fx-background-insets: 0.0, 1.0 1.0 1.0 0.0, 2.0 1.0 1.0 1.0; 232 | -fx-background-radius: 0.0 3.0 3.0 0.0, 0.0 2.0 2.0 0.0, 0.0 2.0 2.0 0.0; 233 | } 234 | 235 | .segmented-button-bar .button:hover{ 236 | /*-fx-background-color:firebrick;*/ 237 | } 238 | 239 | .toggle-button2{ 240 | -fx-background-color: 241 | -darkest-black, 242 | -dark-highlight, 243 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 244 | -fx-background-insets: 0.0, 1.0 1.0 1.0 0.0, 2.0 1.0 1.0 1.0; 245 | -fx-padding: 0.4em 1.833333em 0.4em 1.833333em; 246 | } 247 | 248 | .toggle-button2:hover{ 249 | -fx-background-color:rgb(255.0,106.0,0.0); 250 | } 251 | 252 | .toggle-button2:selected{ 253 | -fx-background-color:rgb(255.0,106.0,0.0); 254 | -fx-border-color:black; 255 | -fx-border-radius:32.0; 256 | -fx-border-width:2.0px; 257 | } 258 | 259 | /******************************************************************************* 260 | 261 | * TableView * 262 | 263 | ******************************************************************************/ 264 | 265 | 266 | 267 | .media-table-view{ 268 | -fx-background-color: #202020; 269 | -fx-table-cell-border-color: transparent; 270 | } 271 | 272 | 273 | .media-table-view:row-selection:constrained-resize .placeholder .label .text{ 274 | -fx-fill:white; 275 | -fx-font-weight:bold; 276 | } 277 | 278 | .media-table-view:row-selection:constrained-resize .column-header-background .filler{ 279 | -fx-background-color: #151515; 280 | } 281 | 282 | .media-table-view:row-selection .column-header-background .filler{ 283 | -fx-background-color: #151515; 284 | } 285 | 286 | .media-table-view:focused{ 287 | /*-fx-background-color: transparent;*/ 288 | } 289 | 290 | 291 | .media-table-view .column-header { 292 | -fx-background-color: transparent; 293 | -fx-border-color:transparent white transparent transparent; 294 | -fx-border-width:0.1; 295 | } 296 | 297 | .media-table-view .column-header-background{ 298 | -fx-background-color: #151515; 299 | } 300 | 301 | .media-table-view .column-header-background .label{ 302 | -fx-background-color: transparent; 303 | -fx-font-weight:bold; 304 | -fx-text-fill: white; 305 | } 306 | 307 | .media-table-view .table-column{ 308 | -fx-alignment:center; 309 | } 310 | 311 | 312 | /* ------------- .table-row-cell ------------- */ 313 | 314 | .table-row-cell{ 315 | -fx-table-cell-border-color: transparent; 316 | -fx-background-color: #101010; 317 | -fx-background-insets: 0.0, 0.0 0.0 0.0 0.0; 318 | -fx-padding: 0.0em; 319 | } 320 | 321 | .table-row-cell:disabled{ 322 | -fx-opacity:0.5; 323 | -fx-background-color:darkgray; 324 | } 325 | 326 | .table-row-cell:disabled .text{ 327 | /*-fx-strikethrough: true ;*/ 328 | } 329 | 330 | .table-row-cell .text{ 331 | -fx-font-weight:bold; 332 | -fx-fill: white ; 333 | } 334 | 335 | .table-row-cell:even { /* <=== changed to even */ 336 | -fx-background-color: #202020; 337 | } 338 | 339 | 340 | .table-row-cell:hover{ 341 | -fx-table-cell-border-color: transparent; 342 | /*-fx-table-cell-border-width: 2.0;*/ 343 | } 344 | 345 | .table-row-cell:hover .text , .table-row-cell:selected .text{ 346 | -fx-fill: black ; 347 | } 348 | 349 | .table-row-cell:hover:selected .text, .table-row-cell:focused:selected .text{ 350 | -fx-fill:white; 351 | } 352 | 353 | 354 | .table-row-cell:focused:disabled{ 355 | -fx-background-color:darkgray; 356 | } 357 | 358 | .table-row-cell:hover , .table-row-cell:selected{ 359 | /*-fx-background-color:rgb(0.0,191.0,255.0);*/ 360 | /*-fx-background-color: linear-gradient(#328BDB 0.0%, #207BCF 25.0%, #1973C9 75.0%, #0A65BF 100.0%);*/ 361 | -fx-background-color:rgb(255.0,106.0,0.0,0.85); 362 | /*-fx-background-color: linear-gradient(#FF9400 0.0%, #FF7F00 25.0%, #FF5D00 75.0%, #FF4300 100.0%);*/ 363 | } 364 | 365 | 366 | /* ------------- row-selection -------------------*/ 367 | 368 | .media-table-view:row-selection:constrained-resize .column-header-background .show-hide-columns-button{ 369 | -fx-background-color:black; 370 | -fx-cursor:hand; 371 | -fx-padding:5.0px; 372 | -fx-min-width:32.0px !important; 373 | -fx-max-width:32.0px !important; 374 | -fx-pref-width:32.0px !important; 375 | } 376 | 377 | .media-table-view:row-selection:constrained-resize .column-header-background .show-hide-columns-button:hover{ 378 | -fx-background-color:black; 379 | } 380 | 381 | .media-table-view:row-selection:constrained-resize .column-header-background .show-hide-columns-button .show-hide-column-image{ 382 | -fx-background-color:white; 383 | -fx-padding:6.0px; 384 | } 385 | 386 | .media-table-view:row-selection:constrained-resize .column-header-background .show-hide-columns-button .show-hide-column-image:hover{ 387 | -fx-background-color:white; 388 | } 389 | 390 | 391 | 392 | /*.table-row-cell:focused{ 393 | -fx-background-color:firebrick; 394 | }*/ 395 | 396 | /*.table-row-cell:focused .text { 397 | -fx-fill: white ; 398 | } */ 399 | 400 | 401 | /*------------------------------* 402 | 403 | 404 | /* 405 | .table-view .table-cell{ 406 | -fx-font-weight:bold; 407 | -fx-text-fill:black; 408 | } 409 | 410 | .table-row-cell{ 411 | -fx-background-color: white; 412 | -fx-background-insets: 0.0, 0.0 0.0 1.0 0.0; 413 | -fx-padding: 0.0em; 414 | } 415 | 416 | .table-row-cell:odd{ 417 | -fx-background-color: orange; 418 | -fx-background-insets: 0.0, 0.0 0.0 1.0 0.0; 419 | -fx-padding: 0.0em; 420 | } 421 | 422 | .table-view { 423 | -fx-background-insets: 0; 424 | -fx-padding: 10; 425 | -fx-alignment: center; 426 | } 427 | .table-view .column-header-background { 428 | -fx-background-color: transparent; 429 | -fx-border-color: transparent transparent rgba(255,255,255,0.3) transparent; 430 | -fx-border-width: 1; 431 | -fx-background-insets: 0; 432 | -fx-padding: 0 10 0 0; 433 | } 434 | .table-view .column-header, .table-view .filler { 435 | -fx-border-color: transparent; 436 | } 437 | .table-view .column-header .label { 438 | -fx-text-fill: firebrick; 439 | -fx-font-weight: bold; 440 | } 441 | .table-view .table-cell { 442 | -fx-background-color: transparent; 443 | -fx-border-color: transparent; 444 | -fx-text-fill: black; 445 | -fx-alignment: center; 446 | } 447 | .table-view .table-row-cell:filled:selected:focused, 448 | .table-view .table-row-cell:filled:selected { 449 | -fx-background-color: rgba(0,0,0,0.3); 450 | } 451 | 452 | */ 453 | 454 | /******************************************************************************* 455 | 456 | * ListView * 457 | 458 | ******************************************************************************/ 459 | 460 | .list-view{ 461 | -fx-background-color:#101010; 462 | } 463 | 464 | .list-cell:filled:selected:focused, .list-cell:filled:selected { 465 | -fx-background-color: linear-gradient(#328BDB 0.0%, #207BCF 25.0%, #1973C9 75.0%, #0A65BF 100.0%); 466 | 467 | } 468 | 469 | .list-cell{ 470 | -fx-font-weight:bold; 471 | -fx-text-fill: white; 472 | -fx-background-color: #101010; 473 | } 474 | 475 | .list-cell:even { /* <=== changed to even */ 476 | -fx-background-color: #202020; 477 | } 478 | 479 | .list-cell:filled:hover { 480 | -fx-background-color: #0093ff; 481 | -fx-text-fill: white; 482 | } 483 | 484 | 485 | /******************************************************************************* 486 | 487 | * DialogPane * 488 | 489 | ******************************************************************************/ 490 | 491 | 492 | .dialog-pane{ 493 | -fx-background-color:#202020; 494 | } 495 | 496 | 497 | .dialog-pane:header .header-panel { 498 | -fx-background-color: #202020; 499 | -fx-border-color:transparent transparent firebrick transparent; 500 | -fx-border-width:2.0; 501 | } 502 | 503 | .dialog-pane:header .header-panel .label{ 504 | -fx-background-color: #202020; 505 | -fx-background-radius:10.0px; 506 | -fx-text-fill:white; 507 | -fx-font-size:15.0px; 508 | } 509 | 510 | /* .dialog-pane >.content{ 511 | -fx-background-color:red; 512 | } 513 | 514 | */ 515 | 516 | .dialog-pane > .content.label { 517 | -fx-padding: 0.5em 0.5em 0.5em 0.5em; 518 | -fx-background-color: #202020; 519 | -fx-text-fill:white; 520 | -fx-font-size:15.0px; 521 | } 522 | 523 | .dialog-pane > .button-bar > .container { 524 | -fx-background-color:#202020; 525 | -fx-border-color:white transparent transparent transparent; 526 | } 527 | 528 | 529 | .dialog-pane .button:armed, 530 | .dialog-pane .button:hover, 531 | .dialog-pane .button:focused{ 532 | -fx-background-color:rgb(255.0,255.0,255.0,0.9); 533 | -fx-text-fill:black; 534 | } 535 | 536 | .dialog-pane .button { 537 | -fx-background-color:rgb(255.0,255.0,255.0,0.4); 538 | -fx-background-radius: 0.0px; 539 | -fx-background-insets: 0.0px; 540 | -fx-cursor:hand; 541 | } 542 | 543 | /* .dialog-pane .button:hover{ 544 | -fx-background-color:rgb(255.0,119.0,0.0,0.7); 545 | -fx-font-weight:bold; 546 | }*/ 547 | 548 | 549 | /******************************************************************************* 550 | 551 | * ToolTip * 552 | 553 | ******************************************************************************/ 554 | 555 | .tooltip{ 556 | -fx-background-color: white; 557 | -fx-text-fill:black; 558 | -fx-font-size:11.0; 559 | /* -fx-effect: dropshadow( three-pass-box, black, 10.0, 0.0, 0.0, 0.0); */ 560 | -fx-wrap-text:true; 561 | } 562 | 563 | 564 | 565 | /******************************************************************************* 566 | 567 | * TitledPane * 568 | 569 | ******************************************************************************/ 570 | 571 | 572 | .titled-pane { 573 | -fx-background-color:transparent; 574 | -fx-font-weight:bold; 575 | -fx-text-fill:white; 576 | } 577 | 578 | .titled-pane > *.content { 579 | /*-fx-effect: innershadow(three-pass-box, red , 15.0, 0.0, 0.0, 0.0);*/ 580 | -fx-background-color:transparent; 581 | -fx-border-color:transparent; 582 | } 583 | 584 | .titled-pane > .title { 585 | -fx-background-color: linear-gradient(#38424b 0.0%, #1f2429 20.0%, #191d22 100.0%); 586 | /*-fx-background-color: -fx-box-border, -fx-inner-border, -fx-body-color;*/ 587 | -fx-background-insets: 0.0, 1.0, 2.0; 588 | -fx-background-radius: 5.0 5.0 0.0 0.0, 4.0 4.0 0.0 0.0, 3.0 3.0 0.0 0.0; 589 | -fx-padding: 0.166667em 0.833333em 0.25em 0.833333em; /* 2 10 3 10 */ 590 | } 591 | 592 | 593 | /******************************************************************************* 594 | 595 | * JFXTabPane * 596 | * 597 | * .jfx-tab-pane#specialJFXTabPane .tab:hover .tab-label{ 598 | * 599 | * } 600 | 601 | ******************************************************************************/ 602 | 603 | #specialJFXTabPane2 .tab-header-area .tab-header-background { 604 | /*-fx-opacity: 0.0;*/ 605 | -fx-background-color:rgb(0.0,0.0,0.0,0.8) !important; 606 | } 607 | 608 | .specialJFXTabPane .tab-header-area .tab-header-background { 609 | /*-fx-opacity: 0.0;*/ 610 | -fx-background-color:#252525 !important; 611 | } 612 | 613 | .specialJFXTabPane .tab-header-area .jfx-rippler{ 614 | -fx-rippler-fill:firebrick !important; 615 | -fx-cursor:hand; 616 | } 617 | 618 | .specialJFXTabPane .tab-header-area .tab-selected-line{ 619 | -fx-stroke: firebrick !important; 620 | } 621 | 622 | .specialJFXTabPane .tab .tab-label { 623 | -fx-alignment: CENTER; 624 | -fx-text-fill: white; 625 | -fx-font-size: 13.5px; /* before it was 12px */ 626 | -fx-font-weight: bold; 627 | -fx-wrap-text: true; 628 | -fx-cursor:hand; 629 | } 630 | 631 | .specialJFXTabPane .tab:hover .tab-label{ 632 | -fx-text-fill:white; 633 | -fx-background-color:red !important; 634 | -fx-background-radius: 0.0; 635 | } 636 | 637 | .specialJFXTabPane .tab:selected .tab-label{ 638 | -fx-background-color:#FFFFFF27; 639 | } 640 | 641 | .specialJFXTabPane .tab-selected-line { 642 | -fx-background-color:transparent; 643 | } 644 | 645 | 646 | /******************************************************************************* 647 | 648 | * Magic Tab Pane * 649 | 650 | ******************************************************************************/ 651 | 652 | 653 | .magicTabPaneVersion1 .tab-header-area { 654 | -fx-padding: 0.0 0.0 0.0 35.0 !important; 655 | } 656 | 657 | .magicTabPaneVersion2 .tab-header-area { 658 | -fx-padding:0.0 !important; 659 | } 660 | 661 | 662 | /******************************************************************************* 663 | 664 | * TabPane * 665 | 666 | ******************************************************************************/ 667 | 668 | 669 | 670 | 671 | .tab-pane .tab-header-area .tab-header-background { 672 | /*-fx-opacity: 0.0;*/ 673 | /*-fx-background-color:linear-gradient(#38424b 0.0%, #1f2429 20.0%, #191d22 100.0%); */ 674 | -fx-background-color:#303030; 675 | } 676 | 677 | .tab-pane{ 678 | -fx-tab-min-width:90.0; 679 | } 680 | 681 | 682 | .tab-pane .tab{ 683 | -fx-background-color: black; 684 | -fx-background-radius: 0.0 45.0 0.0 0.0 ; 685 | -fx-border-color:transparent transparent transparent transparent; 686 | -fx-focus-color: transparent; 687 | -fx-faint-focus-color: transparent; 688 | -fx-cursor:hand; 689 | } 690 | 691 | .tab-pane .tab:selected{ 692 | -fx-background-color: #FF6E00; 693 | } 694 | 695 | .tab-pane .tab:selected:hover{ 696 | -fx-background-color: #FF9D00; 697 | } 698 | 699 | .tab-pane .tab:hover{ 700 | -fx-background-color:#FF9D00; 701 | } 702 | 703 | 704 | .tab-pane .tab .tab-label { 705 | -fx-alignment: CENTER; 706 | -fx-text-fill: white; 707 | -fx-font-size: 13.0px; /* before it was 12px */ 708 | -fx-font-weight: bold; 709 | -fx-wrap-text: true; 710 | 711 | } 712 | 713 | .tab-pane .tab:selected .tab-label { 714 | -fx-alignment: CENTER; 715 | -fx-text-fill:white ; /* before it was BROWN */ 716 | /*-fx-font-size:130.0%;*/ 717 | } 718 | 719 | .tab-pane .tab:hover .tab-label{ 720 | -fx-text-fill:black; 721 | -fx-background-color:white; 722 | -fx-background-radius: 0.0 0.0 0.0 0.0; 723 | } 724 | 725 | 726 | /******************************************************************************* 727 | 728 | * Special Tab Pane * 729 | 730 | ******************************************************************************/ 731 | 732 | 733 | /*Special Tab Pane */ 734 | 735 | #SpecialTabPane .tab-header-area .tab-header-background { 736 | -fx-background-color:transparent; 737 | } 738 | 739 | #SpecialTabPane .sTab.tab{ 740 | -fx-background-color: 741 | -darkest-black, 742 | -dark-highlight, 743 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 744 | -fx-background-insets: 0.0, 1.0 1.0 1.0 0.0, 2.0 1.0 1.0 1.0; 745 | -fx-background-radius:0.0 0.0 45.0 45.0; 746 | -fx-text-fill: white; 747 | -fx-font-size: 13.0px; 748 | -fx-font-weight:bold; 749 | -fx-padding:3.0em -1.3em 3.0em -1.3em; 750 | -fx-cursor:hand; 751 | } 752 | 753 | #SpecialTabPane .sTab.tab:hover{ 754 | -fx-background-color:orange; 755 | } 756 | 757 | #SpecialTabPane .sTab.tab:selected{ 758 | -fx-background-color:firebrick; 759 | } 760 | 761 | #SpecialTabPane .sTab.tab:pressed{ 762 | -fx-background-color: 763 | -darkest-black, 764 | rgb(55.0, 57.0, 58.0), 765 | linear-gradient(to top, -light-black 2.0%, -dark-black 98.0%); 766 | } 767 | 768 | #SpecialTabPane .sTab.tab .tab-label{ 769 | -fx-text-fill:white; 770 | -fx-background-color: transparent; 771 | -fx-background-radius:0.0px; 772 | -fx-rotate:90.0; 773 | } 774 | 775 | 776 | #SpecialTabPane .sTab.tab:hover .tab-label,#SpecialTabPane .sTab.tab:selected .tab-label{ 777 | -fx-text-fill:black; 778 | -fx-background-radius: 0.0 45.0 45.0 0.0; 779 | -fx-background-color: white; 780 | } 781 | 782 | 783 | 784 | 785 | /*#SpecialTabPane .tab-header-area .tab-header-background { 786 | -fx-background-color:transparent; 787 | } 788 | 789 | #SpecialTabPane .STab.tab .tab-label{ 790 | -fx-text-fill:white; 791 | -fx-background-color: transparent; 792 | -fx-background-radius:0.0px; 793 | -fx-rotate:90.0; 794 | } 795 | 796 | #SpecialTabPane .STab.tab:selected .tab-label{ 797 | -fx-text-fill:white; 798 | } 799 | 800 | #SpecialTabPane .STab.tab:hover .tab-label{ 801 | -fx-text-fill:black; 802 | -fx-background-radius:5.0px; 803 | -fx-background-color: white; 804 | } 805 | 806 | #SpecialTabPane .STab.tab{ 807 | -fx-background-color:black; 808 | -fx-background-radius: 0.0 0.0 20.0 20.0; 809 | -fx-padding:3.0em 0.0em 3.0em 0.0em; 810 | -fx-cursor:hand; 811 | -fx-effect: innershadow(two-pass-box, white, 15.0, 0.0, 0.0, 0.0); 812 | } 813 | 814 | #SpecialTabPane .STab.tab:selected{ 815 | -fx-effect: innershadow(two-pass-box, red, 15.0, 0.0, 0.0, 0.0); 816 | } 817 | */ 818 | 819 | 820 | /* LibrariesTabPane */ 821 | #MultipleLibrariesTabPane .tab-header-area .tab-header-background { 822 | -fx-background-color:rgb(0.0,0.0,0.0,0.8); 823 | -fx-background-radius:5.0 5.0 0.0 0.0; 824 | } 825 | 826 | 827 | /******************************************************************************* 828 | 829 | * Button * 830 | 831 | ******************************************************************************/ 832 | 833 | /**About Button ----------------------------------------*/ 834 | 835 | .button , .menu-button , .segmented-button-bar .toggle-button { 836 | /*-fx-effect: dropshadow( three-pass-box , rgba(0.0,0.0,0.0,0.6) , 5.0, 0.0 , 0.0 , 1.0 );*/ 837 | /* -fx-background-color: linear-gradient(#38424b 0.0%, #1f2429 20.0%, #191d22 100.0%); */ 838 | -fx-background-color: -darkest-black, -dark-highlight, linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 839 | -fx-background-insets: 0.0, 1.0 1.0 1.0 0.0, 2.0 1.0 1.0 1.0; 840 | -fx-text-fill: white; 841 | -fx-font-size: 13.0px; 842 | -fx-font-weight:bold; 843 | -fx-background-radius:45.0; 844 | } 845 | 846 | .button:hover , .menu-button:hover , .segmented-button-bar .button:hover , .segmented-button-bar .toggle-button:hover{ 847 | -fx-background-color:rgb(255.0,106.0,0.0); 848 | /*-fx-background-color: 849 | linear-gradient(from 0.0% 93.0% to 0.0% 100.0%, #a34313 0.0%, #903b12 100.0%), 850 | #9d4024, 851 | #d86e3a, 852 | radial-gradient(center 50.0% 50.0%, radius 100.0%, #ea7f4b, #c54e2c);*/ 853 | } 854 | 855 | .button:pressed , .menu-button:pressed , .segmented-button-bar .button:pressed{ 856 | -fx-background-color: 857 | -darkest-black, 858 | rgb(55.0, 57.0, 58.0), 859 | linear-gradient(to top, -light-black 2.0%, -dark-black 98.0%); 860 | } 861 | 862 | .toggle-button { 863 | -fx-cursor:hand; 864 | } 865 | 866 | .segmented-button-bar .toggle-button:selected{ 867 | -fx-background-color:#E47434; 868 | -fx-text-fill:#202020; 869 | } 870 | 871 | 872 | .jfx-button:armed, 873 | .jfx-button:hover, 874 | .jfx-button:focused{ 875 | -fx-background-color:rgb(255.0,255.0,255.0,0.9); 876 | -fx-text-fill:black; 877 | } 878 | 879 | .jfx-button,.jfx-menu-button { 880 | -fx-background-color:rgb(255.0,255.0,255.0,0.4); 881 | -fx-background-radius: 0.0px; 882 | -fx-background-insets: 0.0px; 883 | -fx-cursor:hand; 884 | } 885 | 886 | .jfx-button2:armed, 887 | .jfx-button2:hover, 888 | .jfx-button2:focused{ 889 | -fx-background-color:rgb(0.0,0.0,0.0,0.8); 890 | -fx-text-fill:white; 891 | } 892 | 893 | .jfx-button2 { 894 | -fx-background-color:rgb(0.0,0.0,0.0,0.4); 895 | -fx-background-radius: 0.0px; 896 | -fx-background-insets: 0.0px; 897 | -fx-cursor:hand; 898 | } 899 | 900 | 901 | .jfx-button3:armed, 902 | .jfx-button3:hover, 903 | .jfx-button3:focused{ 904 | -fx-background-color:rgb(255.0,106.0,0.0); 905 | -fx-text-fill:black; 906 | } 907 | 908 | 909 | .jfx-button3 { 910 | -fx-background-color:-darkest-black, -dark-highlight, linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 911 | -fx-background-radius: 0.0px; 912 | -fx-background-insets: 0.0px; 913 | -fx-cursor:hand; 914 | } 915 | 916 | .jfx-button5:armed, 917 | .jfx-button5:hover, 918 | .jfx-button5:focused{ 919 | -fx-background-color:rgb(0.0,0.0,0.0,0.8); 920 | -fx-text-fill:white; 921 | } 922 | 923 | .jfx-button5 { 924 | -fx-background-color:rgb(0.0,0.0,0.0,0.4); 925 | -fx-background-radius: 0.0px; 926 | -fx-background-insets: 0.0px; 927 | -fx-cursor:hand; 928 | -fx-text-fill:white; 929 | } 930 | 931 | 932 | /**About SongButton ----------------------------------------*/ 933 | 934 | .songButton{ 935 | -fx-background-color: linear-gradient(#38424b 0.0%, #1f2429 20.0%, #191d22 100.0%); 936 | -fx-background-radius: 5.0; 937 | -fx-text-fill: white; 938 | -fx-font-size: 13.0px; 939 | 940 | } 941 | 942 | .songButton:hover{ 943 | -fx-background-color:orange; 944 | -fx-text-fill:black; 945 | } 946 | 947 | .songButton:focused{ 948 | -fx-background-color: linear-gradient(to bottom,black 60.0, #141414 60.2%, orange 87.0%); 949 | -fx-text-fill:white; 950 | } 951 | 952 | .songButton:marked{ 953 | -fx-background-color:cyan; 954 | -fx-background-radius:5.0; 955 | -fx-text-fill:black; 956 | -fx-font-size:13.0px; 957 | } 958 | 959 | 960 | /**About ArrowButon(in Libraries) ----------------------------------------*/ 961 | 962 | /**About ArrowButon(in Libraries) ----------------------------------------*/ 963 | 964 | .arrowButton{ 965 | -fx-background-color:rgb(255.0,255.0,255.0,0.2); 966 | -fx-background-radius:45.0; 967 | -fx-cursor:hand; 968 | } 969 | 970 | 971 | .arrowButton2{ 972 | -fx-background-color:#101010; 973 | -fx-background-radius:45.0; 974 | -fx-cursor:hand; 975 | } 976 | 977 | 978 | 979 | /**About SpecialButton(in Navigation Bar) ----------------------------------------*/ 980 | 981 | .specialButton{ 982 | -fx-background-color:black; 983 | -fx-text-fill:white; 984 | -fx-background-radius:20.0px; 985 | -fx-effect: dropshadow( three-pass-box , orange , 5.0, 0.0 , 0.0 , 1.0 ); 986 | -fx-cursor:hand; 987 | } 988 | 989 | .specialButton:hover{ 990 | -fx-background-color:white; 991 | -fx-text-fill:black; 992 | } 993 | 994 | .windowButton{ 995 | -fx-font-size:9.0; 996 | -fx-font-weight:bold; 997 | -fx-background-radius:0.0; 998 | } 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | /******************************************************************************* 1007 | 1008 | * CSS Styles for the ContextMenu,MenuItem,.. * 1009 | 1010 | ******************************************************************************/ 1011 | 1012 | 1013 | .context-menu { 1014 | -fx-background-color:#202020; 1015 | -fx-background-radius:5.0; 1016 | -fx-border-width:2.0; 1017 | -fx-border-radius:2.0; 1018 | /*-fx-border-style:segments(4.0); */ 1019 | -fx-cursor:hand; 1020 | } 1021 | 1022 | .menu-item .label{ 1023 | -fx-text-fill:white; 1024 | -fx-font-weight:bold; 1025 | -fx-font-size:15.5; 1026 | } 1027 | 1028 | .menu-item:focused { 1029 | -color: rgb(255.0,95.0,0.0); 1030 | /*-fx-background-color:linear-gradient( 1031 | from 0.0px 0.75em to 0.75em 0.0px, 1032 | repeat, 1033 | -color 0.0%, 1034 | -color 49.0%, 1035 | derive(-color, 30.0%) 50.0%, 1036 | derive(-color, 30.0%) 99.0% 1037 | );*/ 1038 | -fx-background-color:rgb(255.0,106.0,0.0,0.85); 1039 | } 1040 | 1041 | .menu-item:focused .label{ 1042 | -fx-text-fill:white; 1043 | } 1044 | 1045 | 1046 | /******************************************************************************* 1047 | 1048 | * Label-Menu-Item * 1049 | 1050 | ******************************************************************************/ 1051 | .title-menu-item .label{ 1052 | -fx-text-alignment:center; 1053 | } 1054 | 1055 | .title-menu-item .label .text{ 1056 | -fx-text-alignment:center; 1057 | } 1058 | 1059 | 1060 | /* When the Label-Menu-Item is disabled [Always it is cause i don't want the user to be able to click it] */ 1061 | .title-menu-item:disabled { 1062 | -fx-opacity: 1.0; 1063 | -fx-border-color:transparent firebrick firebrick firebrick; 1064 | -fx-border-width:2.0; 1065 | -fx-cursor:default; 1066 | } 1067 | 1068 | .title-menu-item:disabled:hover{ 1069 | -fx-background-color: transparent; 1070 | } 1071 | 1072 | .title-menu-item:disabled .label { 1073 | -fx-opacity: 1.0; 1074 | -fx-font-size:11.0; 1075 | -fx-font-weight:bold; 1076 | -fx-text-fill:white; 1077 | -fx-text-alignment:center; 1078 | -fx-text-fill: #BBFF00; 1079 | } 1080 | 1081 | .title-menu-item:disabled:hover .label { 1082 | -fx-background-color: transparent; 1083 | } 1084 | 1085 | 1086 | 1087 | 1088 | /******************************************************************************* 1089 | 1090 | * ScrollPane * 1091 | 1092 | ******************************************************************************/ 1093 | .scroll-pane .viewport { 1094 | -fx-background-color: transparent; 1095 | } 1096 | 1097 | .scroll-pane { 1098 | -fx-background-color:transparent; 1099 | } 1100 | 1101 | .corner { 1102 | -fx-background-color: #202020 ; 1103 | } 1104 | 1105 | /* The main scrollbar CSS class of ListView */ 1106 | .scroll-bar:horizontal , 1107 | .scroll-bar:vertical{ 1108 | -fx-background-color:#202020; 1109 | -fx-cursor: hand ; 1110 | 1111 | } 1112 | 1113 | /* The increment and decrement button CSS class of scrollbar */ 1114 | .increment-button , .decrement-button { 1115 | -fx-background-color:transparent; 1116 | -fx-background-radius: 2.0em; 1117 | -fx-border-radius: 2.0em; 1118 | -fx-border-width:2.0px; 1119 | } 1120 | 1121 | 1122 | 1123 | .increment-arrow , .decrement-arrow{ 1124 | -fx-background-color:white; 1125 | -fx-border-color:white; 1126 | -fx-background-radius: 2.0em; 1127 | } 1128 | 1129 | /* The main scrollbar **track** CSS class */ 1130 | .scroll-bar:horizontal .track, 1131 | .scroll-bar:vertical .track{ 1132 | -fx-background-color: #202020; 1133 | -fx-border-color:black; 1134 | -fx-opacity:0.9; 1135 | -fx-background-radius: 2.0em; 1136 | -fx-border-radius:2.0em; 1137 | } 1138 | 1139 | 1140 | 1141 | /* The main scrollbar **thumb** CSS class which we drag every time (movable) */ 1142 | .scroll-bar:horizontal .thumb, 1143 | .scroll-bar:vertical .thumb { 1144 | -fx-background-color: white; 1145 | /*-fx-background-insets: 2.0, 0.0, 0.0;*/ 1146 | -fx-background-radius: 2.0em; 1147 | 1148 | 1149 | 1150 | } 1151 | 1152 | /*.scroll-bar:vertical{ 1153 | -fx-pref-width:10px; 1154 | } 1155 | 1156 | .scroll-bar:horizontal{ 1157 | -fx-pref-height:10px; 1158 | } 1159 | 1160 | .scroll-bar:vertical:hover{ 1161 | -fx-pref-width:20px; 1162 | } 1163 | 1164 | .scroll-bar:horizontal:hover{ 1165 | -fx-pref-height:20px; 1166 | }*/ 1167 | 1168 | /* The main scrollbar **track** CSS class on event of "hover" and "pressed" */ 1169 | 1170 | .scroll-bar:horizontal:hover .track , 1171 | .scroll-bar:horizontal:pressed .track , 1172 | .scroll-bar:vertical:hover .track, 1173 | .scroll-bar:vertical:pressed .track{ 1174 | -fx-background-color: #101010; 1175 | -fx-opacity: 0.9; 1176 | /* -fx-background-radius: 0.0em; */ 1177 | 1178 | } 1179 | 1180 | /* The main scrollbar **thumb** CSS class on event of "hover" and "pressed" */ 1181 | .scroll-bar .thumb:hover, 1182 | .scroll-bar .thumb:pressed{ 1183 | -fx-background-color: white; 1184 | } 1185 | 1186 | 1187 | .increment-button:hover , .decrement-button:hover { 1188 | -fx-background-color:#151515; 1189 | -fx-border-color:white; 1190 | -fx-padding:10.0px; 1191 | /* -fx-background-color:derive(#202020,100.0%); 1192 | -fx-border-color:derive(#202020,80.0%); 1193 | -fx-padding:10.0px;*/ 1194 | } 1195 | 1196 | 1197 | /*----------------OLD CODE-------------------------------------- */ 1198 | 1199 | /* .scroll-bar{ 1200 | -fx-background-color: transparent; 1201 | } 1202 | 1203 | .scroll-bar:vertical{ 1204 | -fx-cursor: hand; 1205 | } 1206 | 1207 | .scroll-bar:horizontal:hover .track , .scroll-bar:horizontal:pressed .track , .scroll-bar:vertical:hover .track, .scroll-bar:vertical:pressed .track{ 1208 | -fx-background-color: derive(#434343,20.0%); 1209 | -fx-opacity: 0.2; 1210 | -fx-background-radius: 0.0em; 1211 | } 1212 | 1213 | .scroll-bar .thumb:hover,.scroll-bar .thumb:pressed{ 1214 | -fx-background-color: derive(black,50.0%); 1215 | } 1216 | 1217 | .scroll-bar:horizontal .increment-arrow { 1218 | -fx-background-color: black; 1219 | -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; 1220 | -fx-padding: 0.3em; 1221 | -fx-rotate: -90.0; 1222 | } 1223 | 1224 | .scroll-bar:horizontal .decrement-arrow { 1225 | -fx-background-color: black; 1226 | -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; 1227 | -fx-padding: 0.3em; 1228 | -fx-rotate: 90.0; 1229 | } 1230 | 1231 | .scroll-bar:vertical .increment-arrow { 1232 | -fx-background-color: rgb(211.0,211.0,211.0); 1233 | -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; 1234 | -fx-padding: 0.3em; 1235 | -fx-rotate: 0.0; 1236 | } 1237 | 1238 | 1239 | 1240 | .scroll-bar:vertical .decrement-arrow { 1241 | -fx-background-color: rgb(211.0,211.0,211.0); 1242 | -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; 1243 | -fx-padding: 0.3em; 1244 | -fx-rotate: -180.0; 1245 | } 1246 | 1247 | .scroll-bar:vertical .increment-button, 1248 | .scroll-bar:vertical .decrement-button { 1249 | -fx-background-color:transparent; 1250 | } 1251 | 1252 | .scroll-bar:horizontal .increment-button, 1253 | .scroll-bar:horizontal .decrement-button { 1254 | -fx-background-color:transparent; 1255 | } 1256 | */ 1257 | 1258 | /*----------------END OF OLD CODE-------------------------------------- */ 1259 | 1260 | 1261 | /******************************************************************************* 1262 | 1263 | * Color Picker * 1264 | 1265 | ******************************************************************************/ 1266 | 1267 | .color-picker{ 1268 | -fx-background-color: #101010; 1269 | -fx-background-radius:0.0; 1270 | } 1271 | 1272 | .color-picker:hover{ 1273 | -fx-background-color:rgb(255.0,106.0,0.0); 1274 | } 1275 | 1276 | 1277 | /******************************************************************************* 1278 | 1279 | * TreeView * 1280 | 1281 | ******************************************************************************/ 1282 | 1283 | .tree-view{ 1284 | -fx-background-color:#202020; 1285 | } 1286 | 1287 | .tree-cell { 1288 | -fx-background-color: #202020 ; 1289 | -fx-text-fill: white ; 1290 | } 1291 | 1292 | .tree-cell:selected { 1293 | -fx-font-weight: bold ; 1294 | -fx-text-fill:white; 1295 | -fx-underline: true; 1296 | } 1297 | .tree-cell { 1298 | -fx-padding: 0.75em 0.0em 0.75em 0.0em ; 1299 | } 1300 | .tree-cell:sub-tree-item { 1301 | -fx-padding: 0.25em ; 1302 | } 1303 | 1304 | .tree-cell > .tree-disclosure-node > .arrow { 1305 | -fx-background-color: white; 1306 | } 1307 | .tree-cell:expanded > .tree-disclosure-node > .arrow { 1308 | -fx-background-color: white; 1309 | } 1310 | 1311 | .tree-cell-2 { 1312 | -fx-text-fill: firebrick ; 1313 | } 1314 | 1315 | .tree-cell-2:selected { 1316 | -fx-font-weight: bold ; 1317 | -fx-text-fill:firebrick; 1318 | -fx-underline: true; 1319 | } 1320 | 1321 | 1322 | 1323 | /******************************************************************************* 1324 | 1325 | * ProgressBar/ProgressIndicator * 1326 | 1327 | ******************************************************************************/ 1328 | 1329 | .progress-label{ 1330 | -fx-text-fill:white; 1331 | -fx-font-weight:bold; 1332 | -fx-font-size:20.0; 1333 | -color: firebrick; 1334 | -fx-background-color:linear-gradient( 1335 | from 0.0px 0.75em to 0.75em 0.0px, 1336 | repeat, 1337 | -color 0.0%, 1338 | -color 49.0%, 1339 | derive(-color, 30.0%) 50.0%, 1340 | derive(-color, 30.0%) 99.0% 1341 | ); 1342 | } 1343 | 1344 | .progress-indicator{ 1345 | -color: firebrick; 1346 | -fx-accent:linear-gradient( 1347 | from 0.0px 0.75em to 0.75em 0.0px, 1348 | repeat, 1349 | -color 0.0%, 1350 | -color 49.0%, 1351 | derive(-color, 30.0%) 50.0%, 1352 | derive(-color, 30.0%) 99.0% 1353 | ); 1354 | } 1355 | 1356 | .progress-indicator:determinate .determinate-indicator .percentage{ 1357 | -fx-fill:white; 1358 | } 1359 | 1360 | .dropbox-progress-indicator{ 1361 | -color: #007EE5; 1362 | -fx-accent:linear-gradient( 1363 | from 0.0px 0.75em to 0.75em 0.0px, 1364 | repeat, 1365 | -color 0.0%, 1366 | -color 49.0%, 1367 | derive(-color, 30.0%) 50.0%, 1368 | derive(-color, 30.0%) 99.0% 1369 | ); 1370 | } 1371 | 1372 | /* .progress-bar{ 1373 | -fx-progress-color:orange; 1374 | } 1375 | * */ 1376 | 1377 | 1378 | .progress-bar > .bar { 1379 | -fx-accent:firebrick; 1380 | /*-fx-background-color:firebrick;*/ 1381 | -fx-background-color: linear-gradient( 1382 | from 0.0px 0.75em to 0.75em 0.0px, 1383 | repeat, 1384 | -fx-accent 0.0%, 1385 | -fx-accent 49.0%, 1386 | derive(-fx-accent, 30.0%) 50.0%, 1387 | derive(-fx-accent, 30.0%) 99.0% 1388 | ); 1389 | 1390 | -fx-background-insets: 3.0; 1391 | -fx-padding: 0.2em; 1392 | } 1393 | 1394 | .transparent-progress-bar:determinate .track,.transparent-progress-bar:indeterminate .track{ 1395 | -fx-background-color:rgb(0.0,0.0,0.0,0.5); 1396 | } 1397 | 1398 | /* .transparent-progress-bar */ 1399 | .transparent-progress-bar > .bar,.transparent-progress-bar:indeterminate .bar{ 1400 | -fx-accent:firebrick; 1401 | } 1402 | 1403 | /* transparent-volume-progress-bar */ 1404 | .transparent-volume-progress-bar:determinate .track,.transparent-volume-progress-bar:indeterminate .track{ 1405 | -fx-background-color:rgb(0.0,0.0,0.0,0.5); 1406 | } 1407 | 1408 | .transparent-volume-progress-bar1 > .bar,.transparent-volume-progress-bar1:indeterminate .bar,.transparent-volume-progress-bar1:determinate .track,.transparent-volume-progress-bar1:indeterminate .track{ 1409 | -fx-accent:rgb(255.0, 95.0, 0.0); 1410 | -fx-background-radius:0.0; 1411 | -fx-border-radius:0.0; 1412 | } 1413 | 1414 | .transparent-volume-progress-bar2 > .bar,.transparent-volume-progress-bar2:indeterminate .bar,.transparent-volume-progress-bar2:determinate .track,.transparent-volume-progress-bar2:indeterminate .track{ 1415 | -fx-accent:rgb(0.0, 144.0, 255.0); 1416 | -fx-background-radius:0.0; 1417 | -fx-border-radius:0.0; 1418 | } 1419 | 1420 | .transparent-volume-progress-bar3 > .bar,.transparent-volume-progress-bar3:indeterminate .bar,.transparent-volume-progress-bar3:determinate .track,.transparent-volume-progress-bar3:indeterminate .track{ 1421 | -fx-accent:#fc4f4f; 1422 | -fx-background-radius:0.0; 1423 | -fx-border-radius:0.0; 1424 | } 1425 | 1426 | .transparent-volume-progress-bar2-nostrip > .bar,.transparent-volume-progress-bar2-nostrip:indeterminate .bar,.transparent-volume-progress-bar2-nostrip:determinate .track,.transparent-volume-progress-bar2-nostrip:indeterminate .track{ 1427 | -fx-accent:rgb(0.0, 144.0, 255.0); 1428 | -fx-background-color: -fx-accent; 1429 | -fx-background-radius:0.0; 1430 | -fx-border-radius:0.0; 1431 | } 1432 | 1433 | .transparent-volume-progress-bar3-nostrip > .bar,.transparent-volume-progress-bar3-nostrip:indeterminate .bar,.transparent-volume-progress-bar3-nostrip:determinate .track,.transparent-volume-progress-bar3-nostrip:indeterminate .track{ 1434 | -fx-accent:#fc4f4f; 1435 | -fx-background-color: -fx-accent; 1436 | -fx-background-radius:0.0; 1437 | -fx-border-radius:0.0; 1438 | } 1439 | 1440 | 1441 | 1442 | 1443 | /******************************************************************************* 1444 | 1445 | * TagsBar * 1446 | 1447 | ******************************************************************************/ 1448 | 1449 | .tags-bar { 1450 | -fx-background-color:white; 1451 | -fx-background-radius:15.0px; 1452 | -fx-min-height: 45.0; 1453 | -fx-alignment:center-right; 1454 | -fx-spacing: 3.0px; 1455 | -fx-padding: 3.0px; 1456 | } 1457 | 1458 | .tags-bar .tag { 1459 | -fx-background-color:black; 1460 | -fx-background-radius:10.0px; 1461 | -fx-alignment: center; 1462 | -fx-padding:1.0px; 1463 | -fx-cursor:hand; 1464 | } 1465 | 1466 | .tags-bar .tag .label{ 1467 | -fx-text-fill:white; 1468 | -fx-font-size:14.0px; 1469 | } 1470 | 1471 | 1472 | /******************************************************************************* 1473 | 1474 | * Amazon * 1475 | 1476 | ******************************************************************************/ 1477 | 1478 | .media-information{ 1479 | -fx-background-color:#202020; 1480 | } 1481 | 1482 | .media-information .label{ 1483 | -fx-font-weight:bold; 1484 | -fx-text-fill:white; 1485 | } 1486 | 1487 | .media-information .mediaInfoLabel{ 1488 | -fx-border-color: transparent firebrick transparent transparent; 1489 | -fx-font-weight:bold; 1490 | -fx-text-fill:white; 1491 | } 1492 | 1493 | 1494 | 1495 | 1496 | /******************************************************************************* 1497 | 1498 | * Library * 1499 | 1500 | ******************************************************************************/ 1501 | 1502 | .library{ 1503 | -fx-background-color:rgb(0.0,0.0,0.0,0.65); 1504 | -fx-background-radius:5.0; 1505 | } 1506 | 1507 | 1508 | .library .libraryNameLabel{ 1509 | -fx-background-color:rgb(0.0,0.0,0.0,0.8); 1510 | -fx-text-fill:white; 1511 | -fx-font-size:14.0; 1512 | -fx-font-weight:bold; 1513 | /*-fx-font-family:"Younger than me";*/ 1514 | } 1515 | 1516 | .library:opened .libraryNameLabel{ 1517 | -fx-text-fill:lightgreen !important; 1518 | -fx-font-size:15.0; 1519 | } 1520 | 1521 | 1522 | /******************************************************************************* 1523 | 1524 | * LibrarySettings * 1525 | 1526 | ******************************************************************************/ 1527 | 1528 | .librarySettings { 1529 | -fx-background-color: #202020; 1530 | } 1531 | 1532 | 1533 | .librarySettings .label{ 1534 | -fx-text-fill:white; 1535 | -fx-font-size:12.0px; 1536 | -fx-font-weight:bold; 1537 | -fx-border-color:transparent white transparent transparent ; 1538 | -fx-border-insets: 5.0px; 1539 | } 1540 | 1541 | .librarySettings .text-area{ 1542 | -fx-background-color: white; 1543 | -fx-background-radius:5.0; 1544 | -fx-text-fill:black; 1545 | -fx-font-size:13.0; 1546 | } 1547 | 1548 | .librarySettings .text-area .content{ 1549 | -fx-background-color:transparent; 1550 | } 1551 | 1552 | 1553 | .librarySettings .text-area:focused{ 1554 | -fx-background-color: firebrick, white; 1555 | -fx-background-insets: -0.1, 2.0; 1556 | } 1557 | 1558 | .inline-css-text-area{ 1559 | -fx-background-color:#151515 !important; 1560 | 1561 | } 1562 | 1563 | 1564 | 1565 | /******************************************************************************* 1566 | 1567 | * search-box,libraries-search-box * 1568 | 1569 | ******************************************************************************/ 1570 | 1571 | .special-text-field { 1572 | -fx-background-insets: -0.1, 2.0; 1573 | -fx-background-radius: 5.0; 1574 | -fx-border-radius:5.0; 1575 | -fx-border-width:1.0; 1576 | -fx-prompt-text-fill:black; 1577 | -fx-text-fill:black; 1578 | -fx-font-size:13.0; 1579 | -fx-font-weight:bold; 1580 | -fx-focus-color: firebrick; 1581 | } 1582 | 1583 | /*.special-text-field:focused , .special-text-field:hover{ 1584 | -fx-background-color: firebrick; 1585 | -fx-border-color:white; 1586 | -fx-text-fill:white; 1587 | -fx-prompt-text-fill:white; 1588 | }*/ 1589 | 1590 | 1591 | /* .search-box .text-field, .libraries-search-box .text-field {*/ 1592 | /*-fx-effect: dropshadow( three-pass-box, red , 10.0, 0.0,0.0,0.0);*/ 1593 | /*-fx-background-insets:3.0;*/ 1594 | /*-fx-background-radius: 5.0; 1595 | -fx-border-radius:5.0;*/ 1596 | /*-fx-background-insets: -0.1, 2.0; 1597 | -fx-border-width:1.0; 1598 | -fx-prompt-text-fill:black; 1599 | -fx-text-fill:black; 1600 | -fx-font-size:13.0; 1601 | -fx-font-weight:bold; 1602 | }*/ 1603 | 1604 | 1605 | /* .search-box .text-field:focused, .libraries-search-box .text-field:focused,.search-box .text-field:hover, .libraries-search-box .text-field:hover{ */ 1606 | /*-fx-effect: null;*/ 1607 | /*-fx-background-insets: -0.1, 2.0;*/ 1608 | /*-fx-background-color: firebrick; 1609 | -fx-border-color:white; 1610 | -fx-text-fill:white; 1611 | -fx-prompt-text-fill:white; 1612 | 1613 | }*/ 1614 | 1615 | .search-box-window-item{ 1616 | -fx-background-color:white; 1617 | /*-fx-background-radius:5.0;*/ 1618 | -fx-text-fill:black; 1619 | -fx-font-size:15.0; 1620 | -fx-font-weight:bold; 1621 | -fx-cursor:hand; 1622 | 1623 | } 1624 | 1625 | .search-box-window-item:hover{ 1626 | -fx-background-color:#353535; 1627 | -fx-text-fill:white; 1628 | } 1629 | 1630 | .search-box-window-label{ 1631 | -fx-text-fill:white; 1632 | -fx-font-weight:bold; 1633 | -fx-font-size:15.0; 1634 | } 1635 | 1636 | 1637 | .tree-view-search-box { 1638 | -fx-background-radius: 45.0; 1639 | -fx-border-radius:45.0; 1640 | -fx-border-width:1.0; 1641 | 1642 | -fx-background-color:white; 1643 | -fx-text-fill:black; 1644 | -fx-prompt-text-fill:#808080; 1645 | -fx-font-weight:bold; 1646 | } 1647 | 1648 | .tree-view-search-box:hover{ 1649 | -fx-border-width:2.0; 1650 | } 1651 | 1652 | /******************************************************************************* 1653 | 1654 | * StationCofigurator * 1655 | 1656 | ******************************************************************************/ 1657 | .station-configurator{ 1658 | -fx-background-color:white; 1659 | } 1660 | 1661 | .station-configurator .text-area { 1662 | -fx-prompt-text-fill:white; 1663 | } 1664 | 1665 | .station-configurator .jfx-text-field,.jfx-text-area{ 1666 | -fx-background-color:white; 1667 | -fx-focus-color:yellow; 1668 | -fx-unfocus-color:black; 1669 | -fx-prompt-text-fill:black; 1670 | -fx-font-weight:bold; 1671 | } 1672 | 1673 | 1674 | 1675 | /******************************************************************************* 1676 | 1677 | * StarWindow * 1678 | 1679 | ******************************************************************************/ 1680 | 1681 | .starWindow{ 1682 | -fx-background-color:#151515; 1683 | } 1684 | 1685 | /******************************************************************************* 1686 | 1687 | * SearchSettings * 1688 | 1689 | ******************************************************************************/ 1690 | 1691 | .searchSettings .jfx-text-field{ 1692 | -fx-background-color:black; 1693 | -fx-focus-color:black; 1694 | -fx-unfocus-color:black; 1695 | -fx-prompt-text-fill:black; 1696 | -fx-font-weight:bold; 1697 | } 1698 | 1699 | 1700 | /******************************************************************************* 1701 | 1702 | * xPlayerSecondLayerTabPane * 1703 | 1704 | ******************************************************************************/ 1705 | 1706 | .xPlayerSettingsTab{ 1707 | -fx-font-weight:bold; 1708 | -fx-font-size:15.0; 1709 | -fx-text-fill:black; 1710 | } 1711 | 1712 | 1713 | 1714 | /******************************************************************************* 1715 | 1716 | * DragAdjustableLabel * 1717 | 1718 | ******************************************************************************/ 1719 | 1720 | /* @font-face{ 1721 | src: url("../fonts/Younger than me.ttf"); 1722 | }*/ 1723 | 1724 | .drag-adjustable-label{ 1725 | -fx-background-color:#202020; 1726 | -fx-background-radius:15.0; 1727 | -fx-border-radius:15.0; 1728 | -fx-border-color:white; 1729 | -fx-border-width:2.0px; 1730 | -fx-font-size:18.0; 1731 | /*-fx-font-family:"Younger than me";*/ 1732 | -fx-text-fill:white; 1733 | -fx-font-weight:bold; 1734 | } 1735 | 1736 | #LoginScreenTopLabel{ 1737 | /*-fx-font-family:"Younger than me";*/ 1738 | } 1739 | 1740 | #time-field-normal{ 1741 | -fx-background-color:#202020; 1742 | -fx-padding:-2.0 8.0 -2.0 8.0; 1743 | -fx-background-radius: 0.0 0.0 0.0 0.0 ; 1744 | -fx-border-radius:0.0 0.0 0.0 0.0 ; 1745 | -fx-font-weight:bold; 1746 | -fx-font-size:15.0; 1747 | -fx-text-fill:white; 1748 | -fx-cursor:hand; 1749 | 1750 | } 1751 | 1752 | #time-field-reversed{ 1753 | -fx-background-color:#202020; 1754 | -fx-padding:-2.0 8.0 -2.0 8.0; 1755 | -fx-background-radius: 0.0 0.0 0.0 0.0; 1756 | -fx-border-radius:0.0 0.0 0.0 0.0 ; 1757 | -fx-border-color:firebrick; 1758 | -fx-border-width:2.0; 1759 | -fx-font-weight:bold; 1760 | -fx-font-size:15.0; 1761 | -fx-text-fill:white; 1762 | -fx-cursor:hand; 1763 | 1764 | } 1765 | 1766 | /******************************************************************************* 1767 | 1768 | * SideBar * 1769 | 1770 | ******************************************************************************/ 1771 | 1772 | 1773 | .miniControl{ 1774 | -fx-text-fill:black; 1775 | -fx-background-color:white; 1776 | -fx-background-radius:10.0; 1777 | -fx-cursor:hand; 1778 | } 1779 | 1780 | #sideBar{ 1781 | -fx-background-color:#202020; 1782 | } 1783 | 1784 | .sideBarSectionLabel{ 1785 | -fx-border-width:2.0; 1786 | -fx-border-color:black transparent transparent transparent; 1787 | -fx-text-fill:black; 1788 | -fx-font-weight:bold; 1789 | -fx-font-size:15.0; 1790 | } 1791 | 1792 | 1793 | .windowMode{ 1794 | -fx-background-color:black; 1795 | -fx-border-radius:10.0; 1796 | -fx-border-width:2.0; 1797 | -fx-text-fill:white; 1798 | -fx-font-weight:bold; 1799 | -fx-cursor:hand; 1800 | } 1801 | 1802 | .windowMode:hover{ 1803 | -fx-background-color:firebrick; 1804 | } 1805 | 1806 | .windowMode:selected{ 1807 | -fx-text-fill:yellow; 1808 | -fx-background-color:firebrick; 1809 | } 1810 | 1811 | 1812 | 1813 | /******************************************************************************* 1814 | 1815 | * .menu-button * 1816 | 1817 | ******************************************************************************/ 1818 | 1819 | .menu-button{ 1820 | -fx-background-radius:0.0; 1821 | -fx-cursor:hand; 1822 | } 1823 | 1824 | .menu-button .label{ 1825 | -fx-text-fill:white; 1826 | } 1827 | 1828 | .menu-button .label:hover{ 1829 | -fx-background-color:rgb(0.0,0.0,0.0,0.7); 1830 | -fx-background-radius:45.0; 1831 | -fx-text-fill:white; 1832 | } 1833 | 1834 | .menu-button .arrow-button .arrow{ 1835 | -fx-background-color:white; 1836 | } 1837 | 1838 | .visWindowMenuButton .label{ 1839 | -fx-text-fill:white; 1840 | } 1841 | 1842 | .visWindowMenuButton .label:hover{ 1843 | -fx-background-color:rgb(0.0,0.0,0.0,0.7); 1844 | -fx-background-radius:45.0; 1845 | -fx-text-fill:white; 1846 | } 1847 | 1848 | .menu-button2 .label{ 1849 | -fx-text-fill:white; 1850 | } 1851 | 1852 | .menu-button2 .label:hover{ 1853 | -fx-background-color:transparent; 1854 | -fx-text-fill:white; 1855 | } 1856 | 1857 | 1858 | 1859 | /******************************************************************************* 1860 | 1861 | * VisualizerWindow * 1862 | 1863 | ******************************************************************************/ 1864 | 1865 | 1866 | .transparency-slider{ 1867 | -fx-cursor:hand; 1868 | } 1869 | 1870 | .transparency-slider .axis .axis-tick-mark, .slider .axis .axis-minor-tick-mark { 1871 | -fx-text-fill:white; 1872 | -fx-stroke:white; 1873 | } 1874 | 1875 | 1876 | .transparency-slider .axis { 1877 | -fx-tick-label-fill: white; 1878 | -fx-tick-label-font-weight: bold; 1879 | -fx-tick-length: 7.0px; 1880 | } 1881 | 1882 | .transparency-slider .thumb{ 1883 | -fx-background-color: 1884 | -darkest-black, 1885 | -dark-highlight, 1886 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 1887 | -fx-background-radius:0.0; 1888 | -fx-border-color:#151515; 1889 | -fx-border-radius:0.0; 1890 | -fx-border-width:1.0; 1891 | 1892 | } 1893 | 1894 | .transparency-slider:vertical .thumb{ 1895 | -fx-pref-width:25.0px; 1896 | } 1897 | 1898 | .transparency-slider:horizontal .thumb{ 1899 | -fx-pref-height:36.0px; 1900 | } 1901 | 1902 | .transparency-slider .thumb:hover{ 1903 | -fx-background-color: 1904 | -darkest-black, 1905 | -dark-highlight, 1906 | linear-gradient(to bottom, rgb(255.0,106.0,0.0) 2.0%, rgb(255.0,106.0,100.0) 98.0%); 1907 | } 1908 | 1909 | .transparency-slider .track{ 1910 | -fx-background-color: 1911 | -darkest-black, 1912 | -dark-highlight, 1913 | linear-gradient(to bottom, -light-black 2.0%, -dark-black 98.0%); 1914 | } 1915 | 1916 | 1917 | .transparency-slider2:vertical .track{ 1918 | -fx-pref-width:13.0px; 1919 | } 1920 | 1921 | .transparency-slider3:horizontal .track{ 1922 | -fx-pref-height:15.0px; 1923 | -fx-background-color:transparent; 1924 | } 1925 | 1926 | .transparency-slider3:vertical .track{ 1927 | -fx-pref-height:25.0px; 1928 | -fx-background-color:transparent; 1929 | } 1930 | 1931 | .transparency-slider3:vertical .thumb{ 1932 | -fx-pref-width:35.0px; 1933 | } 1934 | 1935 | .transparency-slider3:horizontal .thumb{ 1936 | -fx-pref-height:25.0px; 1937 | } 1938 | 1939 | /* Timer Slider */ 1940 | .timer-slider .track{ 1941 | -fx-pref-height:25.0px; 1942 | -fx-background-color:transparent; 1943 | } 1944 | 1945 | .timer-slider .thumb{ 1946 | -fx-pref-width:20.0px; 1947 | -fx-pref-height:22.0px; 1948 | } 1949 | 1950 | /* Speed Slider */ 1951 | .speed-slider:vertical .track{ 1952 | -fx-pref-width:15.0px; 1953 | -fx-background-radius:0.0px; 1954 | } 1955 | 1956 | .speed-slider:vertical .thumb{ 1957 | -fx-pref-width:30.0px; 1958 | } 1959 | 1960 | 1961 | /* Volume Slider */ 1962 | .volume-slider:vertical .track{ 1963 | -fx-pref-width:15.0px; 1964 | -fx-background-radius:0.0px; 1965 | } 1966 | 1967 | .volume-slider:vertical .thumb{ 1968 | -fx-pref-width:32.0px; 1969 | } 1970 | 1971 | 1972 | 1973 | /******************************************************************************* 1974 | 1975 | * UpdateScreen * 1976 | 1977 | ******************************************************************************/ 1978 | 1979 | #updateScreenButtonLabel{ 1980 | 1981 | /*-fx-font-family:"Younger than me";*/ 1982 | -fx-text-fill:blue; 1983 | 1984 | } 1985 | 1986 | 1987 | 1988 | 1989 | 1990 | 1991 | /******************************************************************************* 1992 | 1993 | * KeyBindings * 1994 | 1995 | ******************************************************************************/ 1996 | 1997 | 1998 | .shortCutKey{ 1999 | -fx-background-color:#202020; 2000 | -fx-text-fill:white; 2001 | -fx-font-weight:bold; 2002 | } 2003 | 2004 | .applicationSettingsLabel{ 2005 | -fx-background-color:#202020; 2006 | -fx-text-fill:white; 2007 | -fx-font-weight:bold; 2008 | -fx-border-color:transparent transparent firebrick transparent; 2009 | -fx-border-width:2.0; 2010 | } 2011 | 2012 | .applicationSettingsLabel2{ 2013 | -fx-background-color:#202020; 2014 | -fx-text-fill:white; 2015 | -fx-font-weight:bold; 2016 | -fx-border-color:transparent transparent white transparent; 2017 | -fx-border-width:2.0; 2018 | } 2019 | 2020 | /******************************************************************************* 2021 | 2022 | * Online Music * 2023 | 2024 | ******************************************************************************/ 2025 | 2026 | .online-music-root{ 2027 | -fx-background-color:#101010; 2028 | } 2029 | 2030 | .online-music-root-vbox{ 2031 | -fx-padding:0.0 10.0 0.0 0.0; 2032 | } 2033 | 2034 | .online-music-title-label{ 2035 | -fx-font-size:17.0; 2036 | -fx-background-color:#202020; 2037 | -fx-text-fill:white; 2038 | -fx-font-weight:bold; 2039 | -fx-cursor:hand; 2040 | -fx-alignment:center; 2041 | } 2042 | 2043 | 2044 | .online-music-vbox-box{ 2045 | -fx-background-color:#202020; 2046 | } 2047 | 2048 | 2049 | .online-music-vbox-box-label{ 2050 | -fx-background-color:#202020; 2051 | -fx-text-fill:white; 2052 | -fx-font-weight:bold; 2053 | -fx-border-color:transparent transparent firebrick transparent; 2054 | -fx-border-width:2.0; 2055 | } 2056 | 2057 | .online-music-vbox-box-stack-label{ 2058 | -fx-background-color:rgb(20.0,20.0,20.0,0.95); 2059 | -fx-text-fill:white; 2060 | -fx-font-weight:bold; 2061 | -fx-cursor:hand; 2062 | } 2063 | 2064 | 2065 | /******************************************************************************* 2066 | 2067 | * Combo Box * 2068 | 2069 | ******************************************************************************/ 2070 | 2071 | 2072 | .combo-box-base{ 2073 | -fx-background-color: #202020; 2074 | -fx-padding: 2.0 2.0; 2075 | } 2076 | 2077 | .combo-box-base:editable{ 2078 | -fx-background-color: #FF0; 2079 | } 2080 | 2081 | .combo-box-base:editable > .text-field { 2082 | -fx-border-image-source: null; 2083 | -fx-background-color: transparent; 2084 | -fx-padding: 1.0 0.0; 2085 | } 2086 | 2087 | .combo-box-base > .arrow-button { 2088 | -fx-background-color: #202020; 2089 | -fx-padding: 0.0 4.0; 2090 | } 2091 | 2092 | .combo-box-base > .arrow-button > .arrow { 2093 | -fx-background-color: white; 2094 | -fx-background-insets: 0.0 0.0 0.0 0.0; 2095 | -fx-padding: 2.0 4.0; 2096 | -fx-shape: "M 0 0 H 7 L 3.5 4 z"; 2097 | } 2098 | 2099 | .combo-box-popup > .list-view { 2100 | -fx-border-style: solid; 2101 | -fx-border-width: 1.0; 2102 | -fx-border-color: black; 2103 | -fx-background-color: white; 2104 | -fx-background-insets: 0.0, 1.0; 2105 | } 2106 | .combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell { 2107 | -fx-padding: 1.0 10.0; 2108 | -fx-background: red; 2109 | } 2110 | .combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected { 2111 | -fx-background: green; 2112 | -fx-background-color: orange !important; 2113 | } 2114 | .combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:hover, 2115 | .combo-box-popup > .list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected:hover { 2116 | -fx-background-color: silver !important; 2117 | } 2118 | .combo-box-popup > .list-view > .placeholder > .label { 2119 | -fx-text-fill: blue; 2120 | 2121 | } 2122 | 2123 | /******************************************************************************* 2124 | 2125 | * MenuButton * 2126 | 2127 | ******************************************************************************/ 2128 | 2129 | .menu-button2 > .arrow-button > .arrow { 2130 | -fx-shape: "M3.5 0 L7 10 Q3.5 7 0 10z"; 2131 | /* arrow down = M3.5 10 L7 0 Q3.5 3 0 0z */ 2132 | } 2133 | 2134 | .menu-button3 > .arrow-button > .arrow { 2135 | -fx-shape: "0"; 2136 | /* arrow down = M3.5 10 L7 0 Q3.5 3 0 0z */ 2137 | } 2138 | 2139 | 2140 | /******************************************************************************* 2141 | 2142 | * TextFields * 2143 | 2144 | ******************************************************************************/ 2145 | 2146 | 2147 | .dark-text-field,.search-box .text-field, .libraries-search-box .text-field,.dark-text-field-rectangle{ 2148 | 2149 | -fx-background-color:#202020; 2150 | -fx-text-fill:white; 2151 | -fx-font-weight:bold; 2152 | -fx-accent: firebrick ; 2153 | } 2154 | 2155 | .dark-text-field-rectangle{ 2156 | -fx-background-radius:0.0px; 2157 | } 2158 | 2159 | .dark-text-field-rectangle:disabled{ 2160 | -fx-opacity: 1.0; 2161 | } 2162 | 2163 | .dark-text-area{ 2164 | -fx-background-color:#202020; 2165 | -fx-text-fill:white; 2166 | -fx-fill:white; 2167 | -fx-accent: firebrick ; 2168 | -fx-font-weight:bold; 2169 | } 2170 | 2171 | .dark-text-area .content { 2172 | -fx-background-color: #202020; 2173 | } 2174 | 2175 | 2176 | 2177 | /******************************************************************************* 2178 | 2179 | * Side - Bar * 2180 | 2181 | ******************************************************************************/ 2182 | 2183 | 2184 | .side-bar{ 2185 | -fx-background-color:#202020; 2186 | } 2187 | 2188 | 2189 | /******************************************************************************* 2190 | 2191 | * Dark Buttons etc * 2192 | 2193 | ******************************************************************************/ 2194 | 2195 | 2196 | .toggle-button3,.jfx-menu-button2,.jfx-button4,.dark-menu-button,.dark-round-jfx-button,.jfx-button-dark-white-selection{ 2197 | -fx-background-color:rgb(20.0,20.0,20.0); 2198 | -fx-text-fill:white; 2199 | -fx-background-radius: 0.0px; 2200 | -fx-background-insets: 0.0px; 2201 | -fx-cursor:hand; 2202 | -fx-font-weight:bold; 2203 | } 2204 | 2205 | .jfx-button-dark-white-selection,.split-menu-button:openvertically,.split-menu-button2 .label .text,.split-menu-button2 .arrow-button{ 2206 | -fx-background-color:rgb(20.0,20.0,20.0) !important; 2207 | -fx-text-fill:white !important; 2208 | -fx-background-radius: 0.0px; 2209 | -fx-background-insets: 0.0px; 2210 | -fx-cursor:hand; 2211 | -fx-font-weight:bold; 2212 | } 2213 | 2214 | .split-menu-button2 .arrow-button .arrow{ 2215 | -fx-background-color:white; 2216 | } 2217 | 2218 | .dark-menu-button .label{ 2219 | -fx-background-color:transparent; 2220 | } 2221 | 2222 | .dark-menu-button .label:hover{ 2223 | -fx-background-color:transparent; 2224 | } 2225 | 2226 | 2227 | .jfx-button4:hover,.dark-menu-button:hover{ 2228 | -fx-background-color:rgb(255.0,106.0,0.0,0.9); 2229 | } 2230 | 2231 | 2232 | .toggle-button3:hover{ 2233 | -fx-background-color:rgb(255.0,106.0,0.0,0.9); 2234 | } 2235 | 2236 | .toggle-button3:selected{ 2237 | -fx-background-color:rgb(255.0,106.0,0.0,0.65); 2238 | } 2239 | 2240 | /*.toggle-button3:armed, 2241 | .toggle-button3:hover, 2242 | .toggle-button3:focused{ 2243 | 2244 | } 2245 | * 2246 | */ 2247 | 2248 | .dark-round-jfx-button{ 2249 | -fx-background-radius:45.0; 2250 | -fx-background-color:#000000; 2251 | } 2252 | 2253 | .jfx-button-white-selection:hover,.jfx-button-dark-white-selection:hover{ 2254 | -fx-background-color:#FFFFFF !important; 2255 | -fx-text-fill:#000000 !important; 2256 | } 2257 | 2258 | .jfx-button-red{ 2259 | -fx-background-color:#ff5959 !important; 2260 | } 2261 | 2262 | .jfx-button-red:hover{ 2263 | -fx-background-color:#FF0C59 !important; 2264 | } 2265 | 2266 | .jfx-button-green{ 2267 | -fx-background-color:#A6C400 !important; 2268 | } 2269 | 2270 | .jfx-button-green:hover{ 2271 | -fx-background-color:#93AD00 !important; 2272 | } 2273 | 2274 | .jfx-button-yellow{ 2275 | -fx-background-color:#E0B235 !important; 2276 | } 2277 | 2278 | .jfx-button-yellow:hover{ 2279 | -fx-background-color:#D8AA34 !important; 2280 | } 2281 | 2282 | 2283 | /****************************************************************************** 2284 | * 2285 | * Dark theme 2286 | * 2287 | *****************************************************************************/ 2288 | 2289 | .notification-bar.dark > .pane { 2290 | -fx-background-color: #202020; 2291 | } 2292 | 2293 | .notification-bar.dark > .pane .title, 2294 | .notification-bar.dark > .pane .label { 2295 | -fx-text-fill: white; 2296 | } 2297 | 2298 | /****************************************************************************** 2299 | * 2300 | * Close button 2301 | * 2302 | *****************************************************************************/ 2303 | .notification-bar > .pane .close-button { 2304 | -fx-background-color: #202020; 2305 | -fx-background-insets: 0.0; 2306 | -fx-background-radius: 2.0; 2307 | -fx-padding: 0.0 0.0 0.0 0.0; 2308 | -fx-alignment: center; 2309 | } 2310 | 2311 | .notification-bar > .pane .close-button:hover { 2312 | -fx-background-color: firebrick; 2313 | } 2314 | 2315 | .notification-bar > .pane .close-button:pressed { 2316 | -fx-background-color: firebrick; 2317 | } 2318 | 2319 | .notification-bar > .pane .close-button > .graphic { 2320 | -fx-background-color: white; 2321 | -fx-scale-shape: false; 2322 | -fx-padding: 4.5 4.5 4.5 4.5; /* Graphic is 9x9 px */ 2323 | } 2324 | 2325 | .notification-bar > .pane .close-button:hover > .graphic { 2326 | -fx-background-color: #202020; 2327 | } 2328 | 2329 | .notification-bar > .pane .close-button:pressed > .graphic { 2330 | -fx-background-color: #202020; 2331 | } 2332 | 2333 | 2334 | /****************************************************************************** 2335 | * 2336 | * Separator 2337 | * 2338 | *****************************************************************************/ 2339 | 2340 | .separator *.line { 2341 | -fx-border-style: solid; 2342 | -fx-border-width: 1.0px; 2343 | -fx-border-color:rgb(255.0,95.0,0.0); 2344 | -fx-background-color:rgb(255.0,95.0,0.0); 2345 | } 2346 | 2347 | 2348 | 2349 | /****************************************************************************** 2350 | * 2351 | * Check-Box 2352 | * 2353 | *****************************************************************************/ 2354 | 2355 | 2356 | 2357 | .medium-check-box > .box { 2358 | -fx-padding: 1.0em 1.0em 1.0em 1.0em ; 2359 | } 2360 | .medium-check-box > .box > .mark { 2361 | -fx-padding: 1.0em 1.0em 1.0em 1.0em; 2362 | } 2363 | 2364 | .medium-check-box .box ,.small-check-box .box{ 2365 | -fx-background-color: #101010; 2366 | -fx-border-color:grey; 2367 | -fx-border-radius:3.0px; 2368 | -fx-text-fill:white; 2369 | 2370 | } 2371 | 2372 | .medium-check-box:selected .mark ,.small-check-box:selected .mark{ 2373 | 2374 | -fx-background-color: white; 2375 | 2376 | } 2377 | 2378 | .medium-check-box:selected .box,.small-check-box:selected .box{ 2379 | 2380 | -fx-background-color: orange; 2381 | -fx-border-color:transparent; 2382 | } 2383 | 2384 | .small-check-box .text,.medium-check-box .text{ 2385 | -fx-fill:white; 2386 | -fx-font-weight:bold; 2387 | } 2388 | 2389 | 2390 | 2391 | 2392 | -------------------------------------------------------------------------------- /resources/fxml/CloseAppBox.fxml: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /resources/fxml/MainController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 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 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /resources/fxml/ProfessorController.fxml: -------------------------------------------------------------------------------- 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 | 40 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 |
59 |
60 | -------------------------------------------------------------------------------- /resources/fxml/RegisterController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /resources/fxml/StudentController.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 30 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 |
59 |
60 |
61 | -------------------------------------------------------------------------------- /resources/fxml/TopBar.fxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 37 |
38 |
39 | -------------------------------------------------------------------------------- /resources/image/icons8-back-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-back-52.png -------------------------------------------------------------------------------- /resources/image/icons8-contacts-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-contacts-50.png -------------------------------------------------------------------------------- /resources/image/icons8-course-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-course-32.png -------------------------------------------------------------------------------- /resources/image/icons8-exit-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-exit-52.png -------------------------------------------------------------------------------- /resources/image/icons8-lock-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-lock-32.png -------------------------------------------------------------------------------- /resources/image/icons8-new-post-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-new-post-32.png -------------------------------------------------------------------------------- /resources/image/icons8-sync-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/resources/image/icons8-sync-32.png -------------------------------------------------------------------------------- /screenshots/login_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/screenshots/login_screen.jpg -------------------------------------------------------------------------------- /screenshots/student enroll.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/screenshots/student enroll.jpg -------------------------------------------------------------------------------- /screenshots/student_register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/screenshots/student_register.jpg -------------------------------------------------------------------------------- /screenshots/student_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/screenshots/student_screen.jpg -------------------------------------------------------------------------------- /screenshots/teacher_register.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/screenshots/teacher_register.jpg -------------------------------------------------------------------------------- /screenshots/teacher_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/catman85/JavaFX-Student-Management-System/40790590b2cb9693bca6db14a1560fc23ce19086/screenshots/teacher_screen.jpg -------------------------------------------------------------------------------- /spartanizer.xml: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /src/assembly/assembly.xml: -------------------------------------------------------------------------------- 1 | 5 | bin 6 | 7 | zip 8 | 9 | 10 | false 11 | 12 | 13 | ${project.build.directory} 14 | . 15 | 16 | 17 | *.jar 18 | FXLibrary_lib 19 | FXLibrary_lib/* 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/application/Main.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.application; 2 | 3 | import javafx.application.Application; 4 | import javafx.fxml.FXMLLoader; 5 | import javafx.scene.Node; 6 | import javafx.scene.Parent; 7 | import javafx.scene.layout.BorderPane; 8 | import javafx.stage.Stage; 9 | import javafx.stage.StageStyle; 10 | import main.java.com.goxr3plus.fxborderlessscene.borderless.BorderlessScene; 11 | import main.java.org.javafx.studentsmanagementsystem.controller.TopBar; 12 | import main.java.org.javafx.studentsmanagementsystem.model.SQLiteJDBC; 13 | 14 | public class Main extends Application { 15 | 16 | public final static String FXMLS = "/fxml/"; 17 | public final static String IMAGES = "/images/"; 18 | 19 | /** The Top Bar of the Application */ 20 | public static TopBar topBar; 21 | 22 | public static BorderPane root; 23 | 24 | public static Stage window; 25 | 26 | /** The scene. */ 27 | public static BorderlessScene borderlessScene; 28 | 29 | @Override 30 | public void start(Stage primaryStage) throws Exception { 31 | 32 | //TopBar 33 | topBar = new TopBar(); 34 | 35 | //Content 36 | Parent content = FXMLLoader.load(getClass().getResource(FXMLS + "MainController.fxml")); 37 | 38 | //Root 39 | root = new BorderPane(); 40 | root.setStyle("-fx-background-color:#202020"); 41 | root.setTop(topBar); 42 | root.setCenter(content); 43 | 44 | //Primary Stage 45 | window = primaryStage; 46 | primaryStage.setTitle("Students Management System"); 47 | 48 | // Borderless Scene 49 | borderlessScene = new BorderlessScene(window, StageStyle.UNDECORATED, root, 600, 400); 50 | borderlessScene.getStylesheets().add(getClass().getResource("/css/application.css").toExternalForm()); 51 | borderlessScene.setMoveControl(topBar); 52 | primaryStage.setScene(borderlessScene); 53 | primaryStage.show(); 54 | 55 | //Create the Database 56 | SQLiteJDBC.makeDb(); 57 | } 58 | 59 | public static void setContent(Node node , String title) { 60 | 61 | root.setCenter(null); 62 | root.setCenter(node); 63 | } 64 | 65 | public static void main(String[] args) { 66 | launch(args); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/controller/CloseAppBox.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.controller; 2 | 3 | import java.io.IOException; 4 | 5 | import org.kordamp.ikonli.javafx.StackedFontIcon; 6 | 7 | import com.jfoenix.controls.JFXButton; 8 | 9 | import javafx.fxml.FXML; 10 | import javafx.fxml.FXMLLoader; 11 | import javafx.scene.layout.StackPane; 12 | import main.java.org.javafx.studentsmanagementsystem.application.Main; 13 | 14 | public class CloseAppBox extends StackPane { 15 | 16 | //-------------------------------------------------------------- 17 | 18 | @FXML 19 | private JFXButton minimize; 20 | 21 | @FXML 22 | private JFXButton maxOrNormalize; 23 | 24 | @FXML 25 | private StackedFontIcon sizeStackedFontIcon; 26 | 27 | @FXML 28 | private JFXButton exitApplication; 29 | 30 | // ------------------------------------------------------------- 31 | 32 | /** 33 | * Constructor. 34 | */ 35 | public CloseAppBox() { 36 | 37 | // ------------------------------------FXMLLOADER ---------------------------------------- 38 | FXMLLoader loader = new FXMLLoader(getClass().getResource(Main.FXMLS + "CloseAppBox.fxml")); 39 | loader.setController(this); 40 | loader.setRoot(this); 41 | 42 | try { 43 | loader.load(); 44 | } catch (IOException ex) { 45 | ex.printStackTrace(); 46 | } 47 | 48 | } 49 | 50 | /** 51 | * Called as soon as fxml is initialized 52 | */ 53 | @FXML 54 | private void initialize() { 55 | 56 | 57 | 58 | // minimize 59 | minimize.setOnAction(ac -> Main.window.setIconified(true)); 60 | 61 | // maximize_normalize 62 | maxOrNormalize.setOnAction(ac -> Main.borderlessScene.maximizeStage()); 63 | 64 | // close 65 | exitApplication.setOnAction(ac -> System.exit(0)); 66 | 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/controller/MainController.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.controller; 2 | 3 | import org.apache.commons.codec.digest.DigestUtils; 4 | 5 | import com.jfoenix.controls.JFXRadioButton; 6 | 7 | import javafx.event.ActionEvent; 8 | import javafx.fxml.FXML; 9 | import javafx.fxml.FXMLLoader; 10 | import javafx.scene.Parent; 11 | import javafx.scene.control.Alert; 12 | import javafx.scene.control.Button; 13 | import javafx.scene.control.PasswordField; 14 | import javafx.scene.control.TextField; 15 | import javafx.scene.control.ToggleGroup; 16 | import javafx.util.Duration; 17 | import main.java.org.javafx.studentsmanagementsystem.application.Main; 18 | import main.java.org.javafx.studentsmanagementsystem.model.Professor; 19 | import main.java.org.javafx.studentsmanagementsystem.model.SQLiteJDBC; 20 | import main.java.org.javafx.studentsmanagementsystem.model.Student; 21 | import main.java.org.javafx.studentsmanagementsystem.tools.JavaFXTools; 22 | import main.java.org.javafx.studentsmanagementsystem.tools.NotificationType; 23 | 24 | public class MainController { 25 | 26 | @FXML 27 | private Button signIn; 28 | 29 | @FXML 30 | private TextField signMail; 31 | 32 | @FXML 33 | private PasswordField signPass; 34 | 35 | @FXML 36 | private ToggleGroup loginType; 37 | 38 | @FXML 39 | private TextField studName; 40 | 41 | @FXML 42 | private TextField studMail; 43 | 44 | @FXML 45 | private Button registerStud; 46 | 47 | @FXML 48 | private PasswordField studPass; 49 | 50 | @FXML 51 | private PasswordField studPass2; 52 | 53 | @FXML 54 | private TextField profName; 55 | 56 | @FXML 57 | private TextField profMail; 58 | 59 | @FXML 60 | private Button registerProf; 61 | 62 | @FXML 63 | private TextField profCourse; 64 | 65 | @FXML 66 | private PasswordField profPass; 67 | 68 | @FXML 69 | private PasswordField profPass2; 70 | 71 | //those that signed in succesfully 72 | public static Student stud; 73 | public static Professor prof; 74 | 75 | public void onClickSignIn(ActionEvent e) { 76 | 77 | try { 78 | 79 | //true == student 80 | if ("Student".equals( ( (JFXRadioButton) loginType.getSelectedToggle() ).getText())) { 81 | 82 | //search in the student table 83 | this.stud = SQLiteJDBC.findStud(addThingies(signMail.getText()), addThingies(DigestUtils.sha1Hex(signPass.getText()))); 84 | 85 | if (stud.getStudId().equals(-1)) { 86 | showAlert(Alert.AlertType.WARNING, "Student not found", "Please fill the fields again!"); 87 | blankSign(); 88 | return; 89 | } 90 | 91 | try { 92 | 93 | //--------------------Go to student home------------- 94 | FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(Main.FXMLS + "StudentController.fxml")); 95 | Parent root1 = (Parent) fxmlLoader.load(); 96 | Main.setContent(root1, "Student home"); 97 | 98 | } catch (Exception es) { 99 | es.printStackTrace(); 100 | } 101 | 102 | } else { 103 | //search in the prof table 104 | this.prof = SQLiteJDBC.findProf(addThingies(signMail.getText()), addThingies(DigestUtils.sha1Hex(signPass.getText()))); 105 | if (prof.getId().equals(-1)) { 106 | showAlert(Alert.AlertType.WARNING, "Professor not found", "Please fill the fields again!"); 107 | blankSign(); 108 | return; 109 | } 110 | 111 | try { 112 | 113 | //--------------------Go to professor home------------- 114 | FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(Main.FXMLS + "ProfessorController.fxml")); 115 | Parent root1 = (Parent) fxmlLoader.load(); 116 | Main.setContent(root1, "Professor Home"); 117 | 118 | } catch (Exception ep) { 119 | ep.printStackTrace(); 120 | } 121 | 122 | } 123 | } catch (Exception ex) { 124 | ex.printStackTrace(); 125 | } 126 | } 127 | 128 | public void onRegisterProf(ActionEvent e) { 129 | //runs insertProf 130 | String name = addThingies(profName.getText()); 131 | String mail = addThingies(profMail.getText()); 132 | String pass = profPass.getText(); 133 | String pass2 = profPass2.getText(); 134 | String course = addThingies(profCourse.getText()); 135 | 136 | //are all the fields filled? 137 | if (profName.getText().equals("") || profMail.getText().equals("") || profPass.getText().equals("") || profCourse.getText().equals("")) { 138 | showAlert(Alert.AlertType.WARNING, "You need to fill in all the fields!", "Try Again!"); 139 | 140 | profPass.setText(""); 141 | profPass2.setText(""); 142 | return; 143 | } 144 | 145 | if (!pass.equals(pass2)) { 146 | showAlert(Alert.AlertType.WARNING, "Passwords don't match!", "Try Again!"); 147 | 148 | profPass.setText(""); 149 | profPass2.setText(""); 150 | return; 151 | } 152 | 153 | //προσθέτουμε τα quotes ελέγχουμε γia sqli και περνάμε απο συνάρτηση σύνοψης. 154 | pass = addThingies(DigestUtils.sha1Hex(pass)); 155 | 156 | SQLiteJDBC.insertProf(name, mail, pass, course); 157 | 158 | blankProf(); 159 | 160 | } 161 | 162 | public static String addThingies(String s) { 163 | return "'" + mysql_real_escape_string(s) + "'"; 164 | } 165 | 166 | //SQLi protection 167 | public static String mysql_real_escape_string(String str) { 168 | if (str == null) { 169 | return null; 170 | } 171 | 172 | if (str.replaceAll("[a-zA-Z0-9_!@#$%^&*()-=+~.;:,\\Q[\\E\\Q]\\E<>{}\\/? ]", "").length() < 1) { 173 | return str; 174 | } 175 | 176 | String clean_string = str; 177 | clean_string = clean_string.replaceAll("\\\\", "\\\\\\\\"); 178 | clean_string = clean_string.replaceAll("\\n", "\\\\n"); 179 | clean_string = clean_string.replaceAll("\\r", "\\\\r"); 180 | clean_string = clean_string.replaceAll("\\t", "\\\\t"); 181 | clean_string = clean_string.replaceAll("\\00", "\\\\0"); 182 | clean_string = clean_string.replaceAll("'", "\\\\'"); 183 | clean_string = clean_string.replaceAll("\\\"", "\\\\\""); 184 | 185 | if (clean_string.replaceAll("[a-zA-Z0-9_!@#$%^&*()-=+~.;:,\\Q[\\E\\Q]\\E<>{}\\/?\\\\\"' ]", "").length() < 1) { 186 | return clean_string; 187 | } 188 | return str; 189 | } 190 | 191 | public void blankProf() { 192 | profPass.setText(""); 193 | profPass2.setText(""); 194 | profName.setText(""); 195 | profCourse.setText(""); 196 | profMail.setText(""); 197 | } 198 | 199 | public void blankStud() { 200 | studPass.setText(""); 201 | studPass2.setText(""); 202 | studName.setText(""); 203 | studMail.setText(""); 204 | } 205 | 206 | public void blankSign() { 207 | signMail.setText(""); 208 | signPass.setText(""); 209 | } 210 | 211 | public void onRegisterStud(ActionEvent e) { 212 | //runs insertStud 213 | String name = addThingies(studName.getText()); 214 | String mail = addThingies(studMail.getText()); 215 | String pass = studPass.getText(); 216 | String pass2 = studPass2.getText(); 217 | 218 | // are all the fields filled? 219 | if (studName.getText().equals("") || studMail.getText().equals("") || studPass.getText().equals("")) { 220 | 221 | showAlert(Alert.AlertType.WARNING, "You need to fill in all the fields!", "Try Again!"); 222 | 223 | profPass.setText(""); 224 | profPass2.setText(""); 225 | return; 226 | } 227 | 228 | //is the password correct? 229 | if (!pass.equals(pass2)) { 230 | showAlert(Alert.AlertType.WARNING, "Passwords don't match!", "Try Again!"); 231 | 232 | studPass.setText(""); 233 | studPass2.setText(""); 234 | return; 235 | } 236 | 237 | pass = addThingies(DigestUtils.sha1Hex(pass)); 238 | 239 | //in here we check if the email already exists 240 | SQLiteJDBC.insertStud(name, mail, pass); 241 | 242 | blankStud(); 243 | 244 | } 245 | 246 | public static void showAlert(Alert.AlertType a , String header , String body) { 247 | JavaFXTools.showNotification(header, body, Duration.seconds(5), NotificationType.INFORMATION); 248 | // Alert alert = new Alert(a); 249 | // if (a == Alert.AlertType.WARNING) { 250 | // alert.setTitle("Attention!"); 251 | // 252 | // } else if (a == Alert.AlertType.INFORMATION) { 253 | // alert.setTitle("Success"); 254 | // } 255 | // alert.setHeaderText(header); 256 | // alert.setContentText(body); 257 | // alert.showAndWait(); 258 | } 259 | 260 | } 261 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/controller/ProfessorController.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.controller; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Optional; 5 | 6 | import com.jfoenix.controls.JFXButton; 7 | 8 | import javafx.collections.FXCollections; 9 | import javafx.collections.ObservableList; 10 | import javafx.fxml.FXML; 11 | import javafx.fxml.FXMLLoader; 12 | import javafx.scene.Parent; 13 | import javafx.scene.control.Alert; 14 | import javafx.scene.control.Label; 15 | import javafx.scene.control.TableColumn; 16 | import javafx.scene.control.TableView; 17 | import javafx.scene.control.TextInputDialog; 18 | import javafx.scene.control.cell.PropertyValueFactory; 19 | import main.java.org.javafx.studentsmanagementsystem.application.Main; 20 | import main.java.org.javafx.studentsmanagementsystem.model.Grade; 21 | import main.java.org.javafx.studentsmanagementsystem.model.SQLiteJDBC; 22 | 23 | public class ProfessorController { 24 | 25 | @FXML 26 | private JFXButton rateStudent; 27 | 28 | @FXML 29 | private Label profControllerId; 30 | 31 | @FXML 32 | private Label profControllerName; 33 | 34 | @FXML 35 | private JFXButton signOut; 36 | 37 | @FXML 38 | private TableView profTableView; 39 | @FXML 40 | private TableColumn profStudIdColumn; 41 | @FXML 42 | private TableColumn profStudNameColumn; 43 | @FXML 44 | private TableColumn profGradeColumn; 45 | 46 | private ArrayList grades = SQLiteJDBC.findGrades(); 47 | 48 | private ObservableList registeredData = FXCollections.observableArrayList(); 49 | 50 | @FXML 51 | public void initialize() { 52 | System.out.println("Entered Professor Initialize Method..."); 53 | 54 | 55 | profControllerId.setText( ( "" + MainController.prof.getId() )); 56 | profControllerName.setText(MainController.prof.getName()); 57 | 58 | addData(); 59 | 60 | PropertyValueFactory g1; 61 | g1 = new PropertyValueFactory("studId"); 62 | profStudIdColumn.setCellValueFactory(g1); 63 | profStudNameColumn.setCellValueFactory(new PropertyValueFactory("StudName")); 64 | 65 | profGradeColumn.setCellValueFactory(new PropertyValueFactory("grade")); 66 | 67 | //Add data to the table 68 | profTableView.setItems(registeredData); 69 | 70 | //rateStudent 71 | rateStudent.setOnAction(a -> rateStudent()); 72 | 73 | //profSignOut 74 | signOut.setOnAction(a -> { 75 | try { 76 | //--------------------Go to Login Page ------------- 77 | FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(Main.FXMLS + "MainController.fxml")); 78 | Parent root1 = (Parent) fxmlLoader.load(); 79 | Main.setContent(root1, "Login Home"); 80 | } catch (Exception es) { 81 | es.printStackTrace(); 82 | } 83 | }); 84 | } 85 | 86 | public void rateStudent() { 87 | Grade gr = null; 88 | Integer grade = null; 89 | System.out.println("Trying to grade a student..."); 90 | 91 | try { 92 | gr = profTableView.getSelectionModel().getSelectedItem(); 93 | } catch (java.lang.NullPointerException ¢) { 94 | MainController.showAlert(Alert.AlertType.WARNING, "You need to choose someone", "You haven't selected a student!"); 95 | ¢.printStackTrace(); 96 | return; 97 | } 98 | 99 | TextInputDialog dialog = new TextInputDialog("10"); 100 | dialog.setTitle("Student Grade"); 101 | dialog.setHeaderText("Provide a Grade"); 102 | dialog.setContentText("Write a number (0-10):"); 103 | 104 | // Traditional way to get the response value. 105 | Optional result = dialog.showAndWait(); 106 | if (result.isPresent()) 107 | System.out.println("Your grade: " + result.get()); 108 | 109 | // The Java 8 way to get the response value (with lambda expression). 110 | // result.ifPresent(name -> System.out.println("Your grade: " + name)); 111 | 112 | try { 113 | grade = Integer.parseInt(result.get()); 114 | if (!between(grade, 0, 10)) { 115 | MainController.showAlert(Alert.AlertType.WARNING, "Wrong Input", "Grade must be an integer between 0 and 10"); 116 | return; 117 | } 118 | } catch (java.lang.NumberFormatException ¢) { 119 | MainController.showAlert(Alert.AlertType.WARNING, "Wrong Input", "Grade must be an integer between 0 and 10"); 120 | ¢.printStackTrace(); 121 | return; 122 | } 123 | 124 | try { 125 | 126 | gr.setGrade(grade); 127 | System.out.println("Επιτυχής Βαθμολόγηση"); 128 | } catch (java.lang.RuntimeException ex) { 129 | MainController.showAlert(Alert.AlertType.WARNING, "You need to choose someone", "You haven't selected a student!"); 130 | ex.printStackTrace(); 131 | return; 132 | } 133 | 134 | SQLiteJDBC.grade(gr); 135 | 136 | //refresh table contents 137 | registeredData.removeAll(registeredData); 138 | this.initialize(); 139 | 140 | } 141 | 142 | private void addData() { 143 | for (int j = 0; j < grades.size(); j++) { 144 | registeredData.addAll(FXCollections.observableArrayList(grades.get(j))); 145 | } 146 | 147 | } 148 | 149 | private static boolean between(int i , int minValueInclusive , int maxValueInclusive) { 150 | return ( i >= minValueInclusive && i <= maxValueInclusive ); 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/controller/RegisterController.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.controller; 2 | 3 | import java.util.ArrayList; 4 | 5 | import com.jfoenix.controls.JFXButton; 6 | 7 | import javafx.collections.FXCollections; 8 | import javafx.collections.ObservableList; 9 | import javafx.fxml.FXML; 10 | import javafx.fxml.FXMLLoader; 11 | import javafx.scene.Parent; 12 | import javafx.scene.control.Button; 13 | import javafx.scene.control.TableColumn; 14 | import javafx.scene.control.TableView; 15 | import javafx.scene.control.cell.PropertyValueFactory; 16 | import main.java.org.javafx.studentsmanagementsystem.application.Main; 17 | import main.java.org.javafx.studentsmanagementsystem.model.Professor; 18 | import main.java.org.javafx.studentsmanagementsystem.model.SQLiteJDBC; 19 | 20 | public class RegisterController { 21 | 22 | @FXML 23 | private TableView registerTableView; 24 | @FXML 25 | private TableColumn registerCourseColumn; 26 | @FXML 27 | private TableColumn registerProfIdColumn; 28 | @FXML 29 | private TableColumn registerProfColumn; 30 | 31 | @FXML 32 | private JFXButton studRegisterBack; 33 | 34 | @FXML 35 | private Button studRegisterBtn; 36 | 37 | private ArrayList profs = SQLiteJDBC.findCoursesUnregistered(MainController.stud); 38 | private ObservableList registerData = FXCollections.observableArrayList(); 39 | 40 | // private ObservableList registerData = FXCollections.observableArrayList( 41 | // 42 | // new Professor("testname","id","course",-1), 43 | // new Professor("testname","id","course",-1), 44 | // new Professor("te125stname","idgdgd","cosfurse",6) 45 | // ); 46 | 47 | //initialize runs BEFORE the constructor 48 | @FXML 49 | private void initialize() { 50 | addData(); 51 | 52 | // Initialize the columns. 53 | registerCourseColumn.setCellValueFactory( 54 | //"course" is the name of the property inside the Professor Class 55 | new PropertyValueFactory("course")); 56 | registerProfIdColumn.setCellValueFactory(new PropertyValueFactory("id")); 57 | registerProfColumn.setCellValueFactory(new PropertyValueFactory("name")); 58 | 59 | // Add data to the table 60 | registerTableView.setItems(registerData); 61 | 62 | //studRegisterBack 63 | studRegisterBack.setOnAction(a -> { 64 | System.out.println("Going to back to student's dashboard fxml"); 65 | try { 66 | //--------------------Go to Login Page ------------- 67 | FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(Main.FXMLS + "StudentController.fxml")); 68 | Parent root1 = (Parent) fxmlLoader.load(); 69 | Main.setContent(root1, "Student Home"); 70 | } catch (Exception es) { 71 | es.printStackTrace(); 72 | } 73 | }); 74 | } 75 | 76 | private void addData() { 77 | for (int j = 0; j < profs.size(); j++) { 78 | registerData.addAll(FXCollections.observableArrayList(profs.get(j))); 79 | } 80 | } 81 | 82 | @FXML 83 | private void onRegisterBtnClicked() { 84 | System.out.println("Trying to regsister on a course"); 85 | 86 | //pro is the Professor object that gets the attributes of the selected row 87 | Professor pro = registerTableView.getSelectionModel().getSelectedItem(); 88 | System.out.println(pro.getCourse()); 89 | 90 | SQLiteJDBC.enroll(pro.getCourse()); 91 | 92 | //remove selected row 93 | registerTableView.getItems().removeAll(registerTableView.getSelectionModel().getSelectedItem()); 94 | 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/controller/StudentController.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.controller; 2 | 3 | import java.util.ArrayList; 4 | 5 | import com.jfoenix.controls.JFXButton; 6 | 7 | import javafx.collections.FXCollections; 8 | import javafx.collections.ObservableList; 9 | import javafx.fxml.FXML; 10 | import javafx.fxml.FXMLLoader; 11 | import javafx.scene.Parent; 12 | import javafx.scene.control.Button; 13 | import javafx.scene.control.Label; 14 | import javafx.scene.control.TableColumn; 15 | import javafx.scene.control.TableView; 16 | import javafx.scene.control.cell.PropertyValueFactory; 17 | import main.java.org.javafx.studentsmanagementsystem.application.Main; 18 | import main.java.org.javafx.studentsmanagementsystem.model.Enrollment; 19 | import main.java.org.javafx.studentsmanagementsystem.model.SQLiteJDBC; 20 | 21 | public class StudentController { 22 | 23 | @FXML 24 | private Button enrollButton; 25 | 26 | @FXML 27 | private Label studControllerID; 28 | 29 | @FXML 30 | private Label studControllerName; 31 | 32 | @FXML 33 | private JFXButton signOut; 34 | 35 | @FXML 36 | private TableView studTableView; 37 | @FXML 38 | private TableColumn studEnrolledCoursesColumn; 39 | @FXML 40 | private TableColumn studEnrolledProfId; 41 | @FXML 42 | private TableColumn studEnrolledProfName; 43 | @FXML 44 | private TableColumn studEnrolledGrade; 45 | 46 | private ArrayList enroll = SQLiteJDBC.findCoursesRegistered(MainController.stud); 47 | 48 | private ObservableList registeredData = FXCollections.observableArrayList(); 49 | 50 | @FXML 51 | public void initialize() { 52 | System.out.println("Entered Student Initialize Method..."); 53 | 54 | 55 | studControllerID.setText(MainController.stud.getStudId().toString()); 56 | studControllerName.setText(MainController.stud.getName().toString()); 57 | 58 | addData(); 59 | 60 | studEnrolledCoursesColumn.setCellValueFactory( 61 | //"CourseName" is taken from Enrollment.java class 62 | new PropertyValueFactory("CourseName")); 63 | 64 | studEnrolledProfId.setCellValueFactory(new PropertyValueFactory("ProfId")); 65 | 66 | studEnrolledProfName.setCellValueFactory(new PropertyValueFactory("ProfName")); 67 | 68 | studEnrolledGrade.setCellValueFactory(new PropertyValueFactory("Grade")); 69 | 70 | //Add data to the table 71 | studTableView.setItems(registeredData); 72 | 73 | //enrollButton 74 | enrollButton.setOnAction(a -> { 75 | System.out.println("Going to registration fxml"); 76 | try { 77 | 78 | //--------------------Go to Login Page ------------- 79 | FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(Main.FXMLS + "RegisterController.fxml")); 80 | Parent root1 = (Parent) fxmlLoader.load(); 81 | Main.setContent(root1, "Register to lesson"); 82 | 83 | } catch (Exception es) { 84 | es.printStackTrace(); 85 | } 86 | }); 87 | 88 | System.err.println("Adding Student sign out action"); 89 | //signOut 90 | signOut.setOnAction(a -> { 91 | System.out.println("Going back to login Screen"); 92 | try { 93 | //--------------------Go to Login Page ------------- 94 | FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(Main.FXMLS + "MainController.fxml")); 95 | Parent root1 = (Parent) fxmlLoader.load(); 96 | Main.setContent(root1, "Login Home"); 97 | } catch (Exception es) { 98 | es.printStackTrace(); 99 | } 100 | }); 101 | 102 | } 103 | 104 | private void addData() { 105 | for (int j = 0; j < enroll.size(); j++) { 106 | registeredData.addAll(FXCollections.observableArrayList(enroll.get(j))); 107 | } 108 | } 109 | 110 | } 111 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/controller/TopBar.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | */ 4 | package main.java.org.javafx.studentsmanagementsystem.controller; 5 | 6 | import java.io.IOException; 7 | import java.util.logging.Level; 8 | import java.util.logging.Logger; 9 | 10 | import javafx.fxml.FXML; 11 | import javafx.fxml.FXMLLoader; 12 | import javafx.scene.control.Label; 13 | import javafx.scene.layout.BorderPane; 14 | import main.java.org.javafx.studentsmanagementsystem.application.Main; 15 | 16 | /** 17 | * The Top bar of the application Window. 18 | * 19 | * @author GOXR3PLUS 20 | */ 21 | public class TopBar extends BorderPane { 22 | 23 | // ---------------------------------------------- 24 | 25 | @FXML 26 | private Label label; 27 | 28 | // ---------------------------------------------- 29 | 30 | /** The logger. */ 31 | private Logger logger = Logger.getLogger(getClass().getName()); 32 | 33 | /** 34 | * Constructor. 35 | */ 36 | public TopBar() { 37 | 38 | //---------------------FXML LOADER--------------------------------- 39 | FXMLLoader loader = new FXMLLoader(getClass().getResource(Main.FXMLS + "TopBar.fxml")); 40 | loader.setController(this); 41 | loader.setRoot(this); 42 | 43 | try { 44 | loader.load(); 45 | } catch (IOException ex) { 46 | logger.log(Level.WARNING, "", ex); 47 | } 48 | } 49 | 50 | /** 51 | * Called as soon as .fxml is initialized [[SuppressWarningsSpartan]] 52 | */ 53 | @FXML 54 | private void initialize() { 55 | 56 | //Root 57 | setRight(new CloseAppBox()); 58 | 59 | } 60 | 61 | public void setTitle(String title) { 62 | label.setText(title); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/model/Enrollment.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.model; 2 | 3 | public class Enrollment { 4 | private Integer EnrolledStudId; 5 | private String CourseName; 6 | private Integer Grade; 7 | private String ProfName; 8 | private Integer ProfId; 9 | 10 | public Integer getProfId() { 11 | return ProfId; 12 | } 13 | 14 | public void setProfId(Integer profId) { 15 | ProfId = profId; 16 | } 17 | 18 | public Integer getEnrolledStudId() { 19 | return EnrolledStudId; 20 | } 21 | 22 | public void setEnrolledStudId(Integer enrolledStudId) { 23 | EnrolledStudId = enrolledStudId; 24 | } 25 | 26 | public String getCourseName() { 27 | return CourseName; 28 | } 29 | 30 | public void setCourseName(String courseName) { 31 | CourseName = courseName; 32 | } 33 | 34 | public Integer getGrade() { 35 | return Grade; 36 | } 37 | 38 | public void setGrade(Integer grade) { 39 | Grade = grade; 40 | } 41 | 42 | public String getProfName() { 43 | return ProfName; 44 | } 45 | 46 | public void setProfName(String profName) { 47 | ProfName = profName; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/model/Grade.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.model; 2 | 3 | public class Grade { 4 | private Integer studId; 5 | private String studName; 6 | private Integer grade; 7 | 8 | public Integer getStudId() { 9 | return studId; 10 | } 11 | 12 | public void setStudId(Integer studId) { 13 | this.studId = studId; 14 | } 15 | 16 | public String getStudName() { 17 | return studName; 18 | } 19 | 20 | public void setStudName(String studName) { 21 | this.studName = studName; 22 | } 23 | 24 | public Integer getGrade() { 25 | return grade; 26 | } 27 | 28 | public void setGrade(Integer grade) { 29 | this.grade = grade; 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/model/Professor.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.model; 2 | 3 | public class Professor { 4 | private String name; 5 | private String mail; 6 | private String course; 7 | private Integer id = -1; 8 | 9 | public Professor(String name, String mail, String course, Integer id) { 10 | this.name = name; 11 | this.mail = mail; 12 | this.course = course; 13 | this.id = id; 14 | } 15 | 16 | public Professor() { 17 | 18 | } 19 | 20 | public void setName(String name) { 21 | this.name = name; 22 | } 23 | 24 | public void setMail(String mail) { 25 | this.mail = mail; 26 | } 27 | 28 | public void setCourse(String course) { 29 | this.course = course; 30 | } 31 | 32 | public void setId(Integer id) { 33 | this.id = id; 34 | } 35 | 36 | public String getName() { 37 | return name; 38 | } 39 | 40 | public String getMail() { 41 | return mail; 42 | } 43 | 44 | public String getCourse() { 45 | return course; 46 | } 47 | 48 | public Integer getId() { 49 | return id; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/model/SQLiteJDBC.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.model; 2 | 3 | import java.io.File; 4 | import java.sql.Connection; 5 | import java.sql.DriverManager; 6 | import java.sql.ResultSet; 7 | import java.sql.Statement; 8 | import java.util.ArrayList; 9 | 10 | import javafx.scene.control.Alert; 11 | import main.java.org.javafx.studentsmanagementsystem.controller.MainController; 12 | 13 | public class SQLiteJDBC { 14 | public static void makeDb() { 15 | Connection c = null; 16 | Statement stmt = null; 17 | try { 18 | Boolean dbExists = new File("my.db").isFile(); 19 | if (dbExists) { 20 | System.out.println("database \"my.db\" already exists"); 21 | } else { 22 | System.out.println("Database doesn't exist. Let's make a new one"); 23 | Class.forName("org.sqlite.JDBC"); 24 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 25 | System.out.println("Opened database successfully"); 26 | stmt = c.createStatement(); 27 | 28 | //STUDID INTEGER PRIMARY KEY 29 | //we replace _rowid_ with STUDID 30 | //defining database tables 31 | String sql = "CREATE TABLE STUDENTS " + "(STUDID INTEGER PRIMARY KEY," + " NAME CHAR(50)," + " EMAIL TEXT NOT NULL, " 32 | + " PASSWORD CHAR(50) NOT NULL) "; 33 | stmt.executeUpdate(sql); 34 | 35 | String sql1 = "CREATE TABLE PROFESSOR " + "(PROFID INTEGER PRIMARY KEY," + " NAME CHAR(50)," + " EMAIL TEXT NOT NULL, " 36 | + " PASSWORD CHAR(50) NOT NULL," + " COURSE TEXT NOT NULL) "; 37 | stmt.executeUpdate(sql1); 38 | 39 | String sql2 = "CREATE TABLE ENROLLMENTS " + "(STUDID int," + " COURSE TEXT," + " GRADE int," + " PRIMARY KEY(STUDID,COURSE) ) "; 40 | stmt.executeUpdate(sql2); 41 | 42 | System.out.println("Tables created successfully"); 43 | stmt.close(); 44 | c.close(); 45 | } 46 | 47 | } catch (Exception e) { 48 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 49 | e.printStackTrace(); 50 | System.exit(0); 51 | } 52 | } 53 | 54 | public static void insertProf(String name , String email , String password , String course) { 55 | Connection c = null; 56 | Statement stmt = null; 57 | 58 | try { 59 | Class.forName("org.sqlite.JDBC"); 60 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 61 | c.setAutoCommit(false); 62 | System.out.println("Opened database successfully"); 63 | 64 | if (emailAlreadyExistsIn("p", email)) { 65 | MainController.showAlert(Alert.AlertType.WARNING, "This E-mail Already exists", "Try Again!"); 66 | return; 67 | } 68 | 69 | stmt = c.createStatement(); 70 | String sql = "INSERT INTO PROFESSOR (NAME,EMAIL,PASSWORD,COURSE) " + "VALUES (" + name + "," + email + "," + password + "," + course + ");"; 71 | stmt.executeUpdate(sql); 72 | 73 | //successful registration 74 | MainController.showAlert(Alert.AlertType.INFORMATION, "Successful Registration", "Now you can connect!"); 75 | stmt.close(); 76 | c.commit(); 77 | c.close(); 78 | } catch (Exception e) { 79 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 80 | System.exit(0); 81 | } 82 | System.out.println("Records created successfully"); 83 | } 84 | 85 | public static void insertStud(String name , String email , String password) { 86 | Connection c = null; 87 | Statement stmt = null; 88 | 89 | try { 90 | Class.forName("org.sqlite.JDBC"); 91 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 92 | c.setAutoCommit(false); 93 | System.out.println("Opened database successfully"); 94 | 95 | if (emailAlreadyExistsIn("s", email)) { 96 | MainController.showAlert(Alert.AlertType.WARNING, "This E-mail Already exists", "Try Again!"); 97 | return; 98 | } 99 | stmt = c.createStatement(); 100 | String sql = "INSERT INTO STUDENTS (NAME,EMAIL,PASSWORD) " + "VALUES (" + name + "," + email + "," + password + ");"; 101 | stmt.executeUpdate(sql); 102 | 103 | //successful registration 104 | MainController.showAlert(Alert.AlertType.INFORMATION, "Successful Registration", "Now you can connect!"); 105 | stmt.close(); 106 | c.commit(); 107 | c.close(); 108 | } catch (Exception e) { 109 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 110 | System.exit(0); 111 | } 112 | System.out.println("Records created successfully"); 113 | } 114 | 115 | //called when the student Signs In 116 | public static Student findStud(String mail , String pass) { 117 | Connection c = null; 118 | Statement stmt = null; 119 | Boolean found = false; 120 | Student s = new Student("", "", -1); 121 | try { 122 | Class.forName("org.sqlite.JDBC"); 123 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 124 | c.setAutoCommit(false); 125 | System.out.println("Opened database successfully"); 126 | 127 | stmt = c.createStatement(); 128 | ResultSet rs = stmt.executeQuery("SELECT * FROM STUDENTS WHERE EMAIL =" + mail + " AND PASSWORD=" + pass + ";"); 129 | 130 | if (!rs.next()) { 131 | System.out.println("This person doesn't exist. No data"); 132 | found = false; 133 | } else { 134 | 135 | s.setEmail(rs.getString("EMAIL")); 136 | s.setName(rs.getString("NAME")); 137 | s.setStudId(rs.getInt("STUDID")); 138 | System.out.println("This person exists!"); 139 | found = true; 140 | } 141 | rs.close(); 142 | stmt.close(); 143 | c.close(); 144 | 145 | System.out.println("Operation done successfully"); 146 | 147 | } catch (Exception e) { 148 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 149 | System.exit(0); 150 | } finally { 151 | return s; 152 | } 153 | 154 | } 155 | 156 | //--is called from mainController when the teacher signs in--// 157 | public static Professor findProf(String mail , String pass) { 158 | Connection c = null; 159 | Statement stmt = null; 160 | Boolean found = false; 161 | Professor prof = new Professor("", "", "", -1); 162 | try { 163 | Class.forName("org.sqlite.JDBC"); 164 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 165 | c.setAutoCommit(false); 166 | System.out.println("Opened database successfully"); 167 | 168 | stmt = c.createStatement(); 169 | ResultSet rs = stmt.executeQuery("SELECT * FROM PROFESSOR WHERE EMAIL =" + mail + " AND PASSWORD=" + pass + ";"); 170 | 171 | if (!rs.next()) { 172 | System.out.println("This person doesn't exist. No data"); 173 | found = false; 174 | } else { 175 | 176 | prof.setMail(rs.getString("EMAIL")); 177 | prof.setName(rs.getString("NAME")); 178 | prof.setId(rs.getInt("PROFID")); 179 | prof.setCourse(rs.getString("COURSE")); 180 | System.out.println("This person exists!"); 181 | found = true; 182 | } 183 | rs.close(); 184 | stmt.close(); 185 | c.close(); 186 | 187 | System.out.println("Operation done successfully"); 188 | 189 | } catch (Exception e) { 190 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 191 | System.exit(0); 192 | } finally { 193 | return prof; 194 | } 195 | 196 | } 197 | 198 | private static Boolean emailAlreadyExistsIn(String w , String mail) { 199 | Connection c = null; 200 | Statement stmt = null; 201 | Boolean exists = false; 202 | 203 | try { 204 | Class.forName("org.sqlite.JDBC"); 205 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 206 | c.setAutoCommit(false); 207 | System.out.println("Opened database successfully"); 208 | 209 | stmt = c.createStatement(); 210 | ResultSet rs; 211 | 212 | if (w.equals("s")) { 213 | rs = stmt.executeQuery("SELECT EMAIL FROM STUDENTS WHERE EMAIL = " + mail); 214 | } else { 215 | rs = stmt.executeQuery("SELECT EMAIL FROM PROFESSOR WHERE EMAIL = " + mail); 216 | } 217 | 218 | if (!rs.next()) { 219 | System.out.println("This email doesn't already exist. No data"); 220 | exists = false; 221 | } else { 222 | System.out.println("This email already exists"); 223 | exists = true; 224 | } 225 | rs.close(); 226 | stmt.close(); 227 | c.close(); 228 | 229 | System.out.println("Searched succesfully"); 230 | 231 | } catch (Exception e) { 232 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 233 | System.exit(0); 234 | } finally { 235 | return exists; 236 | } 237 | 238 | } 239 | 240 | public static ArrayList findCoursesUnregistered(Student stud) { 241 | ArrayList profs = new ArrayList<>(); 242 | 243 | Connection c = null; 244 | Statement stmt = null; 245 | Boolean found = false; 246 | try { 247 | Class.forName("org.sqlite.JDBC"); 248 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 249 | c.setAutoCommit(false); 250 | System.out.println("Opened database successfully"); 251 | 252 | stmt = c.createStatement(); 253 | 254 | String studid = MainController.addThingies(MainController.stud.getStudId().toString()); 255 | 256 | // SELECT * FROM PROFESSOR WHERE PROFESSOR.COURSE NOT IN(SELECT PROFESSOR.COURSE FROM PROFESSOR,ENROLLMENTS WHERE PROFESSOR.COURSE = ENROLLMENTS.COURSE AND STUDID = 3) 257 | ResultSet rs = stmt.executeQuery("SELECT * FROM PROFESSOR WHERE " + "PROFESSOR.COURSE NOT IN " 258 | + "(SELECT PROFESSOR.COURSE FROM PROFESSOR,ENROLLMENTS WHERE PROFESSOR.COURSE = ENROLLMENTS.COURSE AND STUDID = " + studid + ");"); 259 | 260 | System.out.println("Searching for courses you haven't enrolled in...."); 261 | if (!rs.next()) { 262 | System.out.println("No results"); 263 | found = false; 264 | } else { 265 | do { 266 | System.out.println("found a professor"); 267 | Professor newentry = new Professor(); 268 | newentry.setCourse(rs.getString("COURSE")); 269 | newentry.setId(rs.getInt("PROFID")); 270 | newentry.setMail(rs.getString("EMAIL")); 271 | newentry.setName(rs.getString("NAME")); 272 | 273 | profs.add(newentry); 274 | } while (rs.next()); 275 | found = true; 276 | } 277 | rs.close(); 278 | stmt.close(); 279 | c.close(); 280 | 281 | System.out.println("Operation done successfully"); 282 | 283 | } catch (Exception e) { 284 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 285 | System.exit(0); 286 | } finally { 287 | return profs; 288 | } 289 | 290 | } 291 | 292 | //--is called from stud Controller--// 293 | public static ArrayList findCoursesRegistered(Student stud) { 294 | ArrayList enrolls = new ArrayList<>(); 295 | 296 | Connection c = null; 297 | Statement stmt = null; 298 | Boolean found = false; 299 | try { 300 | Class.forName("org.sqlite.JDBC"); 301 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 302 | c.setAutoCommit(false); 303 | System.out.println("Opened database successfully"); 304 | 305 | stmt = c.createStatement(); 306 | 307 | String studid = MainController.addThingies(MainController.stud.getStudId().toString()); 308 | 309 | ResultSet rs = stmt.executeQuery("SELECT * FROM PROFESSOR,ENROLLMENTS WHERE " + "PROFESSOR.COURSE = ENROLLMENTS.COURSE AND STUDID = " + studid + ";"); 310 | 311 | System.out.println("Searching for courses you have enrolled in...."); 312 | if (!rs.next()) { 313 | System.out.println("No results"); 314 | found = false; 315 | } else { 316 | do { 317 | System.out.println("found an enrollment"); 318 | Enrollment newentry = new Enrollment(); 319 | newentry.setCourseName(rs.getString("COURSE")); 320 | newentry.setEnrolledStudId(rs.getInt("STUDID")); 321 | newentry.setGrade(rs.getInt("GRADE")); 322 | newentry.setProfName(rs.getString("NAME")); 323 | newentry.setProfId(rs.getInt("PROFID")); 324 | 325 | enrolls.add(newentry); 326 | } while (rs.next()); 327 | found = true; 328 | } 329 | rs.close(); 330 | stmt.close(); 331 | c.close(); 332 | 333 | System.out.println("Operation done successfully"); 334 | 335 | } catch (Exception e) { 336 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 337 | System.exit(0); 338 | } finally { 339 | return enrolls; 340 | } 341 | } 342 | 343 | public static void enroll(String CourseName) { 344 | Integer studid = MainController.stud.getStudId(); 345 | 346 | Connection c = null; 347 | Statement stmt = null; 348 | 349 | try { 350 | Class.forName("org.sqlite.JDBC"); 351 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 352 | c.setAutoCommit(false); 353 | System.out.println("Opened database successfully"); 354 | 355 | stmt = c.createStatement(); 356 | String sql = "INSERT INTO ENROLLMENTS (STUDID,COURSE) " + "VALUES (" + studid + "," + MainController.addThingies(CourseName) + ");"; 357 | stmt.executeUpdate(sql); 358 | 359 | //successful registration 360 | MainController.showAlert(Alert.AlertType.INFORMATION, "Successful Enrollment", "Now you can be rated!"); 361 | stmt.close(); 362 | c.commit(); 363 | c.close(); 364 | 365 | } catch (Exception e) { 366 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 367 | System.exit(0); 368 | } 369 | System.out.println("Records created successfully"); 370 | 371 | } 372 | 373 | //--Called by Prof Controller οταν συνδεεται ο καθηγητής--// 374 | public static ArrayList findGrades() { 375 | ArrayList grades = new ArrayList<>(); 376 | 377 | Connection c = null; 378 | Statement stmt = null; 379 | Boolean found = false; 380 | try { 381 | Class.forName("org.sqlite.JDBC"); 382 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 383 | c.setAutoCommit(false); 384 | System.out.println("Opened database successfully"); 385 | 386 | stmt = c.createStatement(); 387 | 388 | String profscourse = MainController.addThingies(MainController.prof.getCourse()); 389 | System.out.println("Professor's Course: " + profscourse); 390 | // select * from STUDENTS where STUDID IN (select STUDID from ENROLLMENTS WHERE COURSE = 'r') 391 | // SELECT * FROM STUDENTS,ENROLLMENTS WHERE STUDENTS.STUDID = ENROLLMENTS.STUDID AND COURSE = 'r' 392 | ResultSet rs = stmt.executeQuery("SELECT * FROM STUDENTS,ENROLLMENTS WHERE" + " STUDENTS.STUDID = ENROLLMENTS.STUDID AND COURSE =" + profscourse + " ;"); 393 | 394 | System.out.println("Searching for student that enrolled in your course...."); 395 | if (!rs.next()) { 396 | System.out.println("No results"); 397 | found = false; 398 | } else { 399 | do { 400 | System.out.println("found an enrollment"); 401 | Grade newentry = new Grade(); 402 | //connecting STUDENTS columns to grades class properties 403 | newentry.setStudName(rs.getString("NAME")); 404 | newentry.setStudId(rs.getInt("STUDID")); 405 | newentry.setGrade(rs.getInt("GRADE")); 406 | 407 | grades.add(newentry); 408 | } while (rs.next()); 409 | found = true; 410 | } 411 | rs.close(); 412 | stmt.close(); 413 | c.close(); 414 | 415 | System.out.println("Operation done successfully"); 416 | 417 | } catch (Exception e) { 418 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 419 | System.exit(0); 420 | } finally { 421 | return grades; 422 | } 423 | } 424 | 425 | //Βαθμολόγηση του καθηγητή 426 | public static void grade(Grade gr) { 427 | Connection c = null; 428 | Statement stmt = null; 429 | 430 | try { 431 | Class.forName("org.sqlite.JDBC"); 432 | c = DriverManager.getConnection("jdbc:sqlite:my.db"); 433 | c.setAutoCommit(false); 434 | System.out.println("Opened database successfully"); 435 | 436 | String profsrate = MainController.addThingies(gr.getGrade().toString()); 437 | String studid = MainController.addThingies(gr.getStudId().toString()); 438 | String profscourse = MainController.addThingies(MainController.prof.getCourse()); 439 | 440 | System.out.println("\ngrade: " + profsrate + "\nSTUDID: " + studid + "\nPROFID" + profscourse); 441 | 442 | stmt = c.createStatement(); 443 | String sql = "UPDATE ENROLLMENTS SET GRADE = " + profsrate + " WHERE " + "(STUDID=" + studid + " AND COURSE=" + profscourse + ");"; 444 | stmt.executeUpdate(sql); 445 | 446 | //successful registration 447 | MainController.showAlert(Alert.AlertType.INFORMATION, "Successful Rating", "Now you can see the grade you gave!"); 448 | stmt.close(); 449 | c.commit(); 450 | c.close(); 451 | } catch (Exception e) { 452 | System.err.println(e.getClass().getName() + ": " + e.getMessage()); 453 | System.exit(0); 454 | } 455 | System.out.println("Records created successfully"); 456 | 457 | } 458 | 459 | } 460 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/model/Student.java: -------------------------------------------------------------------------------- 1 | package main.java.org.javafx.studentsmanagementsystem.model; 2 | 3 | public class Student { 4 | private String name; 5 | private String email; 6 | private Integer studId = -1; 7 | 8 | public Student(String name, String email, Integer id) { 9 | this.name = name; 10 | this.email = email; 11 | this.studId = id; 12 | } 13 | 14 | public String getName() { 15 | return name; 16 | } 17 | 18 | public void setName(String name) { 19 | this.name = name; 20 | } 21 | 22 | public String getEmail() { 23 | return email; 24 | } 25 | 26 | public void setEmail(String email) { 27 | this.email = email; 28 | } 29 | 30 | public Integer getStudId() { 31 | return studId; 32 | } 33 | 34 | public void setStudId(Integer studId) { 35 | this.studId = studId; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/tools/JavaFXTools.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package main.java.org.javafx.studentsmanagementsystem.tools; 5 | 6 | import org.controlsfx.control.Notifications; 7 | import org.kordamp.ikonli.javafx.FontIcon; 8 | 9 | import javafx.application.Platform; 10 | import javafx.geometry.Pos; 11 | import javafx.scene.Node; 12 | import javafx.scene.control.Labeled; 13 | import javafx.scene.paint.Color; 14 | import javafx.util.Duration; 15 | 16 | /** 17 | * This class has some functions that are not there by default in JavaFX 8 18 | * 19 | * @author GOXR3PLUS 20 | * 21 | */ 22 | public final class JavaFXTools { 23 | 24 | private JavaFXTools() { 25 | } 26 | 27 | /** 28 | * Show a notification. 29 | * 30 | * @param title 31 | * The notification title 32 | * @param text 33 | * The notification text 34 | * @param duration 35 | * The duration that notification will be visible 36 | * @param notificationType 37 | * The notification type 38 | */ 39 | public static void showNotification(String title , String text , Duration duration , NotificationType notificationType) { 40 | Platform.runLater(() -> showNotification(title, text, duration, notificationType, null)); 41 | } 42 | 43 | /** 44 | * Show a notification. 45 | * 46 | * @param title 47 | * The notification title 48 | * @param text 49 | * The notification text 50 | * @param duration 51 | * The duration that notification will be visible 52 | * @param notificationType 53 | * The notification type 54 | */ 55 | public static void showNotification(String title , String text , Duration duration , NotificationType notificationType , Node graphic) { 56 | 57 | try { 58 | 59 | //Check if it is JavaFX Application Thread 60 | if (!Platform.isFxApplicationThread()) { 61 | Platform.runLater(() -> showNotification(title, text, duration, notificationType, graphic)); 62 | return; 63 | } 64 | 65 | //Show the notification 66 | showNotification2(title, text, duration, notificationType, graphic); 67 | 68 | } catch (Exception ex) { 69 | ex.printStackTrace(); 70 | } 71 | 72 | } 73 | 74 | /** 75 | * Just a helper method for showNotification methods 76 | */ 77 | private static void showNotification2(String title , String text , Duration duration , NotificationType notificationType , Node graphic) { 78 | Notifications notification1; 79 | 80 | //Set graphic 81 | if (graphic == null) 82 | notification1 = Notifications.create().title(title).text(text).hideAfter(duration).darkStyle().position(Pos.BOTTOM_RIGHT); 83 | else 84 | notification1 = Notifications.create().title(title).text(text).hideAfter(duration).darkStyle().position(Pos.BOTTOM_RIGHT).graphic(graphic); 85 | 86 | //Show the notification 87 | switch (notificationType) { 88 | case CONFIRM: 89 | notification1.graphic(JavaFXTools.getFontIcon("fas-question-circle", Color.web("#ad14e2"), 32)).show(); 90 | break; 91 | case ERROR: 92 | notification1.graphic(JavaFXTools.getFontIcon("fas-times", Color.web("#f83e3e"), 32)).show(); 93 | break; 94 | case INFORMATION: 95 | notification1.graphic(JavaFXTools.getFontIcon("fas-info-circle", Color.web("#1496e5"), 32)).show(); 96 | break; 97 | case SIMPLE: 98 | notification1.show(); 99 | break; 100 | case WARNING: 101 | notification1.graphic(JavaFXTools.getFontIcon("fa-warning", Color.web("#d74418"), 32)).show(); 102 | break; 103 | case SUCCESS: 104 | notification1.graphic(JavaFXTools.getFontIcon("fas-check", Color.web("#64ff41"), 32)).show(); 105 | break; 106 | default: 107 | break; 108 | } 109 | } 110 | 111 | /** 112 | * Set Graphic Font Icon 113 | * 114 | * @param icon 115 | * @param iconLiteral 116 | * @param color 117 | */ 118 | public static void setFontIcon(Labeled node , FontIcon icon , String iconLiteral , Color color) { 119 | icon.setIconLiteral(iconLiteral); 120 | icon.setIconColor(color); 121 | if (node != null) 122 | node.setGraphic(icon); 123 | } 124 | 125 | /** 126 | * Get the requested Font Icon 127 | * 128 | * @param iconLiteral 129 | * @param color 130 | * @param size 131 | * @return 132 | */ 133 | public static FontIcon getFontIcon(String iconLiteral , Color color , int size) { 134 | 135 | //Create the Icon 136 | FontIcon icon = new FontIcon(iconLiteral); 137 | 138 | //Set Icon Color 139 | icon.setIconColor(color); 140 | 141 | //Set Size 142 | if (size != 0) 143 | icon.setIconSize(size); 144 | 145 | return icon; 146 | } 147 | 148 | } 149 | -------------------------------------------------------------------------------- /src/main/java/org/javafx/studentsmanagementsystem/tools/NotificationType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | */ 4 | package main.java.org.javafx.studentsmanagementsystem.tools; 5 | 6 | /** 7 | * The type of the notification to be shown. 8 | * 9 | * @author GOXR3PLUS 10 | */ 11 | public enum NotificationType { 12 | 13 | /** The simple. */ 14 | SIMPLE, 15 | 16 | /** The warning. */ 17 | WARNING, 18 | 19 | /** The information. */ 20 | INFORMATION, 21 | 22 | /** The confirm. */ 23 | CONFIRM, 24 | 25 | /** The error. */ 26 | ERROR, 27 | 28 | /** The success. */ 29 | SUCCESS; 30 | 31 | } 32 | --------------------------------------------------------------------------------