[Java] Jakie komponeny do wyswietlenia dwuwymiarowej tablicy


(Tomo8813) #1

Witam.

Mam pewien problem z doborem odpowiednich komponentów do wyświetlenia dwu wymiarowej tablicy w swing-u, z delikatną różnicą miedzy interfejsem użytkownika a logika programu. Mianowicie mój program ma polegać na rozpoznawaniu liter używając do tego sieci Hopfielda. W tym celu chciał bym zbudować coś w stylu tabeli rozmiaru 7x5 w której to po naciśnięciu na dany jej element będzie zmieniać kolor z czarnego na biały bądź odwrotnie (domyślnie tabela jest cała biała) w ten sposób użytkownik będzie mógł narysować literę składającą się z czarnych pól tabeli. Natomiast po naciśnięciu odpowiedniego Jbutton-a zostaną te piksele sczytane do odpowiadającej jej tablicy która przechowywać będzie wartości powiedzmy 0 - gdy odpowiadający jej element posiadał białe tło, 1 - gdy czarne. W drugą stronę musi to działać identycznie gdyż tak naprawdę w interfejsie będą dwie identyczne tabelę gdzie w pierwszej rysujemy nieco zniekształconą literkę a w drugiej zostaje ona rozpoznana przez algorytm i w wyświetlona prawidłowo w tej drugiej, czyli sczytanej do interfejsu. Problem w tym że jest to moja pierwsza przygoda ze swing-em i nie wiem jaki komponent bądź komponenty wybrać. Myślałem o rozmieszeniu przez GridLayout 35 Jbutton-ów lecz po głębszej analizie pomysł odpada z dwóch powodów. Przy tworzeniu Jbutton-ów można co prawda było by podać kolejno liczy od 0 do 34 jako parametr aktualny konstruktora Jbutton (po stronie logicznej załatwiając to za pomocą jednowymiarowej tablicy) ale niestety nie wiem jak zmienić tam kolor tła i zrobić tak aby te liczby nie były wyświetlane w interfejsie (liczby podawane jako parametr aktualny konstruktora Jbutton jest chyba jedyna drogą aby wyłapać je poprzez zdarzenie kliknięcia myszą i łatwe przypisanie jego numeru do odpowiadającego go miejsca w tablicy). Przyznam że swoje gry dotychczas pisałem w JavaScript i tam nie miał bym z tym problemu :slight_smile: Lecz to program na zaliczenie projektu do mojej szkoły i chciałem go zdać właśnie w Javie (jak z resztą poprzednie). Macie może jakieś propozycje jak to załatwić bo mi na razie nic nie przychodzi do głowy :slight_smile: pozdro


(Airborn) #2

JButton to zły pomysł, ponieważ nie zapamiętuje stanu. Jeżeli chcesz użyć czegoś na kształt przycisku, to JToggleButton ew. JCheckbox. Problemem może być ostylowanie ich tak jak byś chciał. Jeżeli chcesz to ładniej ostylować to proponował bym użyć 35 własnych klas które rozszerzą JPanel. W klasie takiej zarejestrujesz sobie actionListenery, nadpiszesz metodę paintComponent() i będziesz miał dokładnie to czego chcesz (robiłem tego typu panel dla tablic 11x11 z tą różnicą, że pola mogły mieć jedną z 3 wartości).

Inną opcją jest jeszcze wykorzystanie nowej JavyFX zamiast Swinga. Tam można ostylować kontrolki w dużo łatwiejszy sposób niż w Swingu, ale musiał byś poświęcić chwilkę na poznanie technologii.