little_MASTER napisał(a)
Wszystko ok, nie wiem tylko jak zrobić tą komunikacje.
Najprostsza komunikacja między jedną klasą, a inną, to po prostu wywołanie metody drugiej klasy i przekazanie jej jakichś argumentów.
Za dużo próbujesz kombinować.
Lista (zapewne JComboBox), z której będziesz wybierać filtr musi zostać jakoś wypełniona czymś, co identyfikuje obiekty poszczególnych paneli. W najprostszej wersji albo indeks do tablicy z wszystkimi wczytanymi panelami, albo referencje do tych obiektów wczytanych paneli.
Wszystkie panele muszą mieć jakieś wspólne właściwości, dzięki którymi należą do tej samej rodziny. Czyli mają właśnie taki sam interfejs (w sensie potocznym). W Javie interfejs, to po prostu kilka metod zgrupowanych w jedną rzecz, która jest jakby szablonem klasy. Metody mają konkretne nazwy i swoje typy argumentów i nie mają definicji, albo mówiąc inaczej są pustymi wirtualnymi metodami. Jeżeli jakaś klasa implementuje interfejs, to musi te metody zdefiniować. Jeżeli każdy panel filtra będzie implementował ten sam interfejs, to z każdym z nich będzie się można w ten sam sposób komunikować - wywołując te same metody (o tych samych nazwach i argumentach). W ten sposób wszystkie filtry będą miały ustandaryzowaną komunikację. Właśnie w tym celu stosuje się interfejsy. Alternatywnym sposobem jest stworzenie klasy abstrakcyjnej z pustymi metodami i sposobowanie aby każdy panel filtra dziedziczył po niej. Problem w tym, że jeżeli panel już dziedziczy po komponencie Swinga, to nie można tego zrobić bo w Javie nie ma wielodziedziczenia.
Każdy obiekt, który będzie chciał się skomunikować z panelem filtra (nieważne jakim) będzie po prostu wywoływał metody interfejsu dla tego filtra. Nie ważne z jakim konkretnym filtrem będzie mieć do czynienia i czy dostęp do niego będzie z jakiejś tablicy filtrów po indeksie, czy bezpośrednio przez referencję uzyskaną z listy dla wybranego filtra. Wywołanie będzie takie same. Kwestia komunikacji odfajkowana. Od razu masz też przykład jak wykorzystywać interfejsy.
Co do problemu jak umieścić poszczególne filtry, to zależy to od tego czy filtry robisz sam, czy już gdzieś są zrobione i czekają sobie na użycie. Jeżeli czekają, to wystarczy sprawdzić jakie metody posiadają i czy mają te same metody do komunikacji. Jeżeli mają te same metody, to pewnie spełniają jakiś interfejs, którego wystarczy użyć (sprawdzić w dokumentacji tych filtrów). Jeżeli każdy filtr ma inne metody i inaczej się go używa, to musiałbyś do każdego filtra dopisać klasę, która będzie spełniać jakiś jeden wspólny interfejs komunikacyjny i będzie "używać" tego konkretnego filtra, którego opakuje. Od tego momentu to te klasy będą się komunikować z resztą Twojego programu jako ustandaryzowane filtry
Jeżeli każdy filtr będziesz robić samodzielnie, to od razu każdy z nich powinien implementować jakiś interfejs, który sam sobie obmyślisz. Sprawa filtrów odfajkowana.
Co do problemu jak pokleić w NB poszczególne panele stworzone na formatkach. Robi się to to prościej tak: Tworzysz x klas paneli dla każdego filtra (te same wymiary i ogólny wygląd). Następnie w klasie swojego programu robisz albo tablicę, której elementami będą skonstruowane za pomocą new obiekty tych klas, a na listę filtrów wrzucasz indeksy do tej tablicy, albo przy wypełnianiu listy filtrów będziesz tworzyć (też przez new) po jednym obiekcie filtra i referencję do niego umieścisz jako kolejny element listy. Wtedy po kliknięciu konkretnego elementu dostaniesz od razu referencję do obiektu filtra (co napisałem wyżej). Oba sposoby są równoważne. W przypadku wczytywania obcych klas filtrów na listę lub do tablicy pakujesz utworzony przez new obiekt opakowujący konkretny filtr.
Tu przykład szablonu kodu. Każda klasa filtra, to może być zrobioną w osobnym pliku formatką Netbeans. Jedynym Twoim dopiskiem powinno być implementowanie jakiegoś interfejsu (tutaj Filtr):
interface Filtr
{
//synchroniczna, w przypadku błędu filtrowania może zwracać null
//albo generować wyjątek
Image filtruj(/*...*/);
//...
}
//1
public class Filtr_blur extends JPanel implements Filtr { /*...*/ }
//2
public class Filtr_smooth extends JPanel implements Filtr { /*...*/ }
//3
public class Filtr_sharpen extends JPanel implements Filtr { /*...*/ }
//...
//Kod Twojej aplikacji:
Filtr[] filtry_tab = { new Filtr_blur(), new Filtr_smooth(), new Filtr_sharpen(), /*...*/ };
//...
JComboBox filtry = new JComboBox(filtry_tab);
W ten sposób akcja na konkretnym elemencie da Ci od razu referencję do obiektu z interfejsem Filtr, którego metodami możesz się posłużyć do przesłania danych do przefiltrowania i odebrania wyników
Komunikacja odfajkowana.
Co do wywoływania obiektów, które opisałeś w drugim poście, to refleksja i jej mechanizmy "dobierania się do klas od kuchni" byłyby potrzebne wyłącznie gdyby klasy filtrów były pisane przez kogoś innego i nie miałbyś ich źródeł (tylko pliki class lub opakowujące je "jary"). Wtedy takimi metodami posługiwałyby się klasy opakowujące. Gdyby klasy te wykorzystywały wspólny interfejs, to nawet to nie byłoby potrzebne bo wystarczyłoby po prostu wywołać metody tego wspólnego interfejsu dla klas tych filtrów.
Jeżeli jednak to ty masz napisać te filtry, to jest to zupełnie zbędny balast.
Później po prostu wybierać z listy filtr i wywoływać metodę filtruj z niego która by zwróciła obrazek, a ten już bym sobie wyświetlił w moim głównym komponencie.
taka metoda "filtruj", to właśnie przykład metody wspólnego interfejsu komunikacyjnego. Może być pojedyncza - wtedy wywołanie jest synchroniczne - czyli nie wróci ze sterowaniem dopóki filtr nie odda wyniku (i wtedy trzeba uważać bo Swing nie toleruje długich czasów wykonania - zawiesza wtedy obsługę okienkową i program staje dęba), A można to też rozwiązać inaczej - tak aby wywołanie było asynchroniczne - czyli wywołanie metody przekaże tylko zlecenie oraz referencję do zlecającego. Filtr, kiedy skończy mógłby sam wywołać konkretną metodę zlecającego i w ten sposób "oddać" wynik w postaci przefiltrowanego obrazka. Można w tym celu wykorzystać klasę SwingWorker, która tworzy własny wątek roboczy i komunikuje się samodzielnie ze zlecającym lub obiektem podanym przez zlecającego.
Mam nadzieję, że nieco rozjaśniłem.