Aktywne Wpisy
![Smarek37](https://wykop.pl/cdn/c3397992/Smarek37_qJS3ApN4nu,q60.jpg)
Smarek37 +4
![Smarek37 - #edukacja #szkola #chwalesie
Takie świadectwo mi synek przyniósł w tym rok...](https://wykop.pl/cdn/c3201142/c3e5fe75d062746e3ac15de8a86af63e46ec7c9888eb1f66be2aadbc0ad1a829,w150.jpg)
źródło: IMG_20240622_233222
Pobierz![Van-der-Ledre](https://wykop.pl/cdn/c3397992/Van-der-Ledre_DVsiYimVww,q60.jpg)
Van-der-Ledre +91
Tak, to jest ta pora, to sobotni wieczór, czas, w którym my, męczennicy, cierpiętnicy ze świętego tagu jednoczymy się pod symboliczną listą. Jak zwykle, zasady są jasne, jesteś, zapisz się.
#przegryw
#przegryw
![Van-der-Ledre - Tak, to jest ta pora, to sobotni wieczór, czas, w którym my, męczenni...](https://wykop.pl/cdn/c3201142/3cd38fd3eb707a3caac89dc41c6bc7f6e5d3dd778314eb99144bbb4f1e2c49a5,w150.png?author=Van-der-Ledre&auth=1f23f0aa63112a7e5cda85c7201ad79e)
źródło: Lista-Tagowa
Pobierz
Docelowo TimeKeeper, bo tak się nazywa, ma być zegarem/timerem do śledzenia czasu poświęconego na pracę nad danym zadaniem (inspiracją był blogowy wpis @JavaDevMatt). Jeśli chodzi o rozwiązania projektowe: dane przechowywane są w pliku .csv, ale podłączenie bazy danych przez np. Hibernate nie powinno być problemem (podmiana implementacji interfejsu + dodanie adnotacji, albo pliku xml). Każda część GUI jest obsługiwana przez odrębny kontroler. Dzięki temu nie ma jednego wielkiego pliku FXML, tylko kilka odrębnych mniejszych, a i sama klasa kontrolera jest znacznie mniejsza. DI jest rozwiązane bez framework'u, w głównym pliku FXML, który instancjuje kontrolery poszczególnych elementów UI i wstrzykuje do głównego kontrolera.
Apka ma też dawać możliwość zwinięcia do paska systemowego, ale póki co JavaFX nie pozwala na to (tzn. jest obejście z wykorzystaniem Swing'a, ale wolałbym go uniknąć). Na chwilę obecną zaimplementowana jest podstawowa funkcjonalność, tj. mierzenie czasu od dodania zadania do jego ukończenia z możliwością zapauzowania. Zmiany zapisywane są automatycznie co minutę plus przy każdym zapauzowaniu zadania Chcę dodać w najbliższym czasie kolumnę z ikonami (uruchomiona, zatrzymana, zakończona, +1h, +3h, +5h, +10h), pasek statusu i legenda u dołu i tooltipy oraz ogarnąć do końca wygląd okna i poszczególnych elementów. Mój #rozowypasek zasugerował, żeby dodać też opcję timer'a (odliczanie czasu od zadanej wartości do zera i później czasu ile przekroczono zadaną wartość).
Czego się nauczyłem przy tym projekcie:
1. Nie warto pchać się w naukę dużych frameworków (Spring, Hibernate itd.) dopóki nie ogarnie się podstaw OO.
2. Dobrze przemyślany design zawsze pozwoli w odpowiednim momencie framework dołączyć.
3. JavaFX jest mocno zniuansowanym API o czym przekonałem się na przykładzie ogarniania TableView.
4. Prostą współbieżność (np. odliczanie czasu dla kilku zadań na raz) można w JavaFX rozwiązać prosto dzięki klasie Task.
5. Długo by wymieniać :-)
6. Wydaje mi się, że nieco ogarnąłem po co i jak używać interfejsów.
EDIT 7. Lambdy i method calls, to bardzo wdzięczne dodatki do języka, moim zdaniem. Czynią kod dużo czytelniejszy.
Roboczy kod dostępny jest na GitHubie: https://github.com/Kitke/time-keeper/ Z jakiegoś powodu GitHub psuje kodowanie znaków (w projekcie jest Windows-1250, ale jak tak dalej pójdzie będzie UTF-8).
Szykuję klatę na przyjęcie krytyki wskazówek i porad od zawsze życzliwych wykopowych mirków ;-)
#programowanie #java #javafx #naukaprogramowania #odzeradodevelopera #kitkeprogramuje
Screen:
źródło: comment_vqhD1LY0shp2YTcXGuCrfmDCwZhJGies.jpg
Pobierznp:
// TODO: obsluga wyjatku
Twój IDE pokaże Ci takie markery na liście
Klasa/interfejs w Javie ZAWSZE muszą być nazwane tak samo jak plik w którym się znajdują. W kodzie masz klasę StopWatch w pliku Stopwatch.java. Wielkość liter też ma znaczenie.
W pliku Effects.java masz metodę "pulse", która wygląda na nieużywaną. Jeśli faktycznie jest nieużywana to ją usuń.
Na dysku mam ok, nazwa pliku pokrywa się z nazwą interfejsu. Usunę i dodam na GitHubie, być może dodając wklepałem nazwę z małą literą w środku (ale wydaje mi się, że w takim wypadku
@kitke: Nie chodzi mi o
if
chodzi mi o to, żefocusWhenTableFocused()
tworzy i zwraca funkcję, która nigdy nie jest uruchomiona. Spróbuj wstawić jakiegoś alerta tam do tegoif
i zobaczysz, że on się nigdy nie wyświetli :) Domyślam się, że wcześniej miałeś:button.setOnMouseEntered(focusWhenTableFocused())
- to było ok bo to tworzyło funkcję i przekazywało ją jako handler. Tak jak jest teraz to na serio nie zadziala :)Zabieram
IconCell.java
- finishedIcon - nieużywana zmienna
- pusty publiczny konstruktor bezargumentowy to to samo co konstruktor domyślny więc można go po prostu usunąć :)
- w updateItem() masz 3 poziomy zagnieżdżenia ifów. Zacząłbym od wyciągnięcia każdego poziomu do osobnej metody i dalej kombinowałbym aby logika tam realizowana była jak najbardziej oczywista dla czytającego. Tak jak to jest teraz jest nieco przytłaczające :)
NameCell.java
- updateItem() - taka sama uwaga jak
Ze wszystkimi uwagami zgadzam się posypując głowę popiołem, odniosę się, jeśli pozwolisz, na razie,
@kitke: Jestem pod dużym wrażeniem bo mimo, że jest sporo do wyszlifowania to myślę, że sam sposób myślenia podczas tworzenia kodu masz dobry. Teraz tylko dużo praktyki i dalsza nauka i możesz być świetnym koderem :)
@kitke: Na co dzień pracuję jako
To ta sieć lokalnych barów mlecznych? Coś mi się
Z dotychczasowych doświadczeń - TDD znacznie przyspiesza pisanie funkcjonujących aplikacji, także polecam ogarniać tę metodologię ucząc się jednocześnie potrzebnych API