Aktywne Wpisy
Lambo994 +179
Największa beka z tych co się plują, że kraje mające w przeszłości masę kolonii mają murzynów w swoich reprezentacjach. Jak w ogóle mogą grać dla Francji albo Anglii skoro są czarni? Czyli jesteś np. takim Mekambe. Urodziłeś się we Francji, jesteś wychowankiem PSG i przez wiele lat grasz w Paryżu jako najlepszy zawodnik klubu. Zdobywasz Mistrzostwo i Wicemistrzostwo Świata z reprezentacją narodową Francji. Jesteś wizytówką kraju i jego stolicy na całym świecie
Manfakk +213
Mogłoby się wydawać że porażka z Holandią odbiera nam szanse na awans. Nic bardziej mylnego, powiedziałbym nawet że na spokojnie wyjdziemy z grupy i to z DRUGIEGO miejsca.
Jutro Francja gładko wygrywa z Austrią, podejrzewam że 3:0, prawdopodobnie po hattricku Żółwia.
W następnej kolejne ogrywamy podłamaną po kompromitacji z Francją Austrię 2:0.
Francja natomiast rozbija Holandię która w meczu z nami pokazała że nie ma za wiele do zaoferowania.
W ostatniej kolejce
Jutro Francja gładko wygrywa z Austrią, podejrzewam że 3:0, prawdopodobnie po hattricku Żółwia.
W następnej kolejne ogrywamy podłamaną po kompromitacji z Francją Austrię 2:0.
Francja natomiast rozbija Holandię która w meczu z nami pokazała że nie ma za wiele do zaoferowania.
W ostatniej kolejce
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:
np:
// 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