Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
3

Witam Mam następujący problem dotyczący Swing'a w javie: Mam dwa JPanel (panele) na obu są jakieś komponenty, powiedzmy na jednym jest JFileChooser a na drugim TextArea, i moje pytanie jak zrobić aby przy wyborze jakiegoś pliku w pierwszym panelu przez JFileChooser w drugim panelu na w TextArea wyświetliła się jego zawartość (na przykład). Chodzi mi jak ustawiać nasłuchiwania (Listeners), bo kompletnie nie mam pomysłu jak prawidłowo powinna odbywać się komunikacja (podczas odpalania jakiś eventów) między osobnymi panelami?

EDIT:

Jako że na początku może nie wyraziłem się wystarczająco jasno to tutaj mały przykład:

class TopPanel extends JPanel
{
    private JTextArea ta;
    public TopPanel()
    {
    	ta = new JTextArea();
    	this.add(ta);
    }
}

class CenterPanel extends JPanel
{
    private JFileChooser fc;

    public TopPanel()
    {
    	fc = new JFileChooser();
    	this.add(fc);
    }
}

i teraz na JFrame tworzę obiekty tych dwóch klas, ale nie wiem jak zrobić aby zdarzenia komunikowały się między sobą (bo są w osobnych klasach więc nie mam bezpośredniego dostępu do komponentów w ich wnętrzu. Nasłuchiwanie zdarzeń w ramach jednego panelu nie sprawia mi problemu.

flag

1 Answer

1

Generalnie odbywa się to na takiej zasadzie, że rejestrujesz w jednym komponencie odpowiedniego "nasłuchiwacza". Po tym jak nastąpi odpowiednie zdarzenie, komponent ów wywoła odpowiednią metodę wszystkich "nasłuchiwaczy" na to zdarzenie. Przyklad jeżeli chodzi o JFileChooser

    	chooser.addPropertyChangeListener(new PropertyChangeListener() {
		@Override
		public void propertyChange(PropertyChangeEvent arg0) {
			if (arg0.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {
				File newFile = (File)arg0.getNewValue();
				textArea.setText(newFile.getName());
			}

		}
	});

EDIT: Ja robię w ten sposób, że jeżeli jest to nowy komponent to tworzę sobie własną listę listenerów i to obsługuję, w Twoim przypadku tak :

public class sampleClass {
component1 c1 = new component1();
component2 c2 = new component2();

private void run() {


	Component2Listener list = new Component2Listener() {

		@Override
		public void nameChanged(String name) {
			c1.setNewName(name);				
		}
	};

	//c2.addNameChangedListener(list);

}
}

class component1 {
    JTextArea area = new JTextArea();

public void setNewName(String name) {
	area.setText(name);
}
}

class component2 {
    private JFileChooser fc = new JFileChooser();
    private ArrayList<Component2Listener> listeners;

public void sth111() {


	fc.addPropertyChangeListener(new PropertyChangeListener() {
		@Override
		public void propertyChange(PropertyChangeEvent arg0) {
			if (arg0.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {
				File newFile = (File) arg0.getNewValue();
				nameChanged(newFile.getName());
			}
		}
	});
}

private void nameChanged(String newName) {
	for (int i = 1; i <= listeners.size(); i++) {
		listeners.get(i).nameChanged(newName);
	}
}
}

interface Component2Listener{
    public void nameChanged(String name);	
};

Możesz też korzystać z listenerów JPanela i wywołać firePropertyChanged ( z poziomu component2).

link|flag
Ja wiem na czym polega ustawianie nasłuchiwaczy i jeśli chodzi o komunikację między komponentami które znajdują się na tym samym panelu (wszystko w jednej klasie dziedziczącej po JPanel) to nie ma problemu. Problem pojawia się gdy mam dwie klasy dziedziczące po JPanel, tam w tej klasie ustawiam komponenty, a następnie chcę się między tymi dwoma klasami komunikować... Nie wiem czy to jasno wytłumaczylem – krzyhoo Jan 20 at 10:30

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.