Zmiana kolorów w panelach - komunikacja panelu 1 z 2

1

Witam
Niedawno zaczalem nauke Swinga w javie. Napisalem maly program, ktory ustawia kolor panelu po kliknieciu przycisku.
Niestety nie wiem jak zrobić tak, by po kliknięciu na przycisk na panelu pierwszym (np. buttona Zielony) zmienił się kolor na drugim panelu. Chodzi o taka "komunikacje" miedzy panelami.
Szukałem w googlach i znalazłem pare tematów, ale nie moge tego załapać, dużo tam słówek "this", a do konca jeszcze nie wiem jak działa. Jeden z tematów:
KLIK: Komunikacja między panelami

Moze moglibyscie cos podpowiedziec?:)

w razie czego kod:
RAMKA:

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class Ramka extends JFrame
{
	
	public Ramka()
	{
		setTitle("Zmiana koloru");
		setSize(1000,1000);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new FlowLayout());
		

		JPanel bu = new Panel();
		add(bu);
		JPanel bu1 = new Panel1();
		add(bu1);
		
		pack();
	}
	
	public static void main(String[] args)
	{
		new Ramka();
	}
}
 

PANEL:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter.DEFAULT;


public class Panel extends JPanel implements ActionListener
{
	JButton green;
	JButton blue;
	
	
	public Panel()
	{
		setPreferredSize(new Dimension(200,200));
		setLayout(new FlowLayout());
		
		green = new JButton("Zielony");
		blue = new JButton("Niebieski");
		
		blue.addActionListener(this);
		green.addActionListener(this);
		
		add(green);
		add(blue);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		Object zrodlo = e.getSource();
		
		if(zrodlo == green)
		{
			setBackground(Color.green);
			System.out.println(new Date());
		}	
		else if(zrodlo == blue)
		{
			setBackground(Color.blue);
		}	
	}
}

PANEL1:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;


public class Panel1 extends JPanel implements ActionListener
{
	JButton pink;
	JButton gray;
	
	public Panel1()
	{
		setPreferredSize(new Dimension(200,200));
		setLayout(new FlowLayout());
		
		pink = new JButton("rozowy");
		gray = new JButton("szary");
		
		pink.addActionListener(this);
		gray.addActionListener(this);
		
		add(pink);
		add(gray);
	}
	
	@Override
	public void actionPerformed(ActionEvent e)
	{
		Object zrodlo = e.getSource();
		
		if(zrodlo == pink)
		{
			setBackground(Color.pink);
		}
		else if(zrodlo == gray)
		{
			setBackground(Color.gray);
		}
	}
	
}

Pozdrawiam i licze na porady! :)

EDIT
probowalem dodac do klasy Panel pole: Panel1 nazwa; i w listenerze klasy Panel dac nazwa.setBackground(Color.jakiskolor); ale niestety wywalało mase błędów

0

Konstruując drugi panel przekaż referencję do pierwszego

JPanel bu = new Panel();
add(bu);
JPanel bu1 = new Panel1(bu);

"odbierz" ją w konstruktorze i zapamiętaj

public class Panel1 extends JPanel implements ActionListener
{
        JButton pink;
        JButton gray;
        Panel panel;
        public Panel1(Panel panel)
        {
             this.panel = panel;

a potem

   panel.setBackground(Color.pink);

W drugą stronę będzie troszkę trudniej, w klasie Panel dodaj pole

Panel1 panel;

i metodę setPanel
a po skonstruowaniu panelu bu1 wywołaj

bu.setPanel(bu1);
1

@bogdans
Nie wiem jakim cudem - ale działa, faktycznie kolor zmienia sie w panelu pierwszym jak klikne przycisk w drugim oO nie moge ogarnąć jak to wyglada po-kolei.

Co do metody setPanel, co ma w niej byc? i dlaczego w druga strone jest trudniej troszke:D?

0

Dlatego, że kiedy konstruujesz panel bu, to panel bu1 jeszcze nie istnieje i nie możesz przekazać referencji w konstruktorze.

JPanel bu = new Panel();
add(bu);
JPanel bu1 = new Panel1(bu);
bu.setPanel(bu1);

W klasie Panel:

void setPanel(Panel1 panel)
{
     this.panel = panel;
}
1

Zrobiłem wszystko po kolei jak mówiłes - działa, wielkie dzieki ;)

Niby rozumiem czemu działa, ale nie rozumiem. Nie moge sobie tego ułożyć w głowie :D

Co do słówka "this":
Mam jakąs klase Panel ktora rozszerza JPanel. Mam w nim przycisk i action listenera. Chce zeby po kliknieciu przycisku sie pojawiał np JLabel gdzies tam na panelu.
Musze w action listenerze dać w wypadku gdy źródłem jest przycisk do zmiany to: inicjuje JLabela (new JLabel("napis"); ) i pisze:

 JLabel napis;
JButton przycisk;

[..]
public void actionPerformed(ActionEvent e);
{
[..]
this.add(napis);
[..]
}

Dobrze rozumiem? this odwołuje sie jakby do "klasy" w ktorej jest?

A gdybym chcial zeby napis pojawił się na tym drugim panelu? to wtedy w klasie Panel mam to pole Panel1 p1; i w listenerze daje zamiast this.add(napis); to p1.add(napis)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1