Nie działa kolorowanie elementu tablicy JPanel za pomocą metody

0

Witam. Piszę sobie program, żeby utrwalić sobie parę rzeczy. Mam 3 klasy: w jednej tworzę okno, w drugiej planszę z JPaneli, która jest wyświetlana w oknie, a trzecia klasa to słuchacz przycisków. Chciałbym aby po wciśnięciu na klawiaturze jednej ze strzałek zostało zmienione tło odpowiedniego JPanelu na planszy. Program się kompiluje i uruchamia ale po wciśnięciu strzałki element nie zmienia tła.

public class Plansza extends JComponent{

	private JPanel plansza = new JPanel();
	private JPanel[][] pole = new JPanel[30][10];
	private int a=0,b=5;
	public JComponent tworzenie;
	{

		plansza.setSize(300,800);
		plansza.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createRaisedBevelBorder(),BorderFactory.createEmptyBorder(5,5,5,5)));
		plansza.setLayout(new GridLayout(30,10));
		plansza.setLocation(10,10);

		for(int i=0;i<30;i++){
			for (int j=0;j<10;j++){
		pole[i][j] = new JPanel();
		pole[i][j].setBorder(BorderFactory.createLineBorder(Color.black));//ramka
		plansza.add(pole[i][j]);
			}
		}
		add(plansza);

		pole[0][5].setBackground(Color.black);

	}
	public void lewo(){
		pole[5][5].setBackground(Color.black);              //to nie działa
		System.out.println("działa");

	}
}

a tak wywołuję metodę w klasie słuchacza

Plansza plansza = new Plansza();
...
public void keyPressed(KeyEvent e) {
		if (e.getKeyCode()==KeyEvent.VK_LEFT){
			plansza.lewo();
			
		}
	}

Ogólnie metoda jest wywoływana, bo wyświetla się napis "działa". Próbowałem umieszczać repaint() w różnych miejscach jednak to nie pomogło. Czy oprócz tego problemu klasa z planszą wygląda ok? Czy czegoś nie powinienem robić lub coś mam robić w inny sposób?

0

Masz dwie zmienne o nazwie plansza. Jedną tworzysz tu:

private JPanel plansza = new JPanel();

i tę planszę wyświetlasz.
Drugą tworzysz tu:

Plansza plansza = new Plansza();

Tej nie wyświetlasz, a w tej zmieniasz kolor tła.

0

Mogę jeszcze prosić o jakąś podpowiedź co zrobić? Myślałem, że zmienną plansza z klasy słuchacz (drugi kod z pierwszego postu) wywołuję tylko metodę, która zmieni tą właściwą planszę , którą wyświetlam.
Co powinienem zmodyfikować, żeby kolorowało właściwą planszę, bo podejrzewam, że wyświetlanie tej drugiej to nienajlepsze rozwiązanie.

0

Możesz przekazać (w konstruktorze) do klasy słuchacza referencję do tej wyświetlanej planszy.

0

Bez przykładu chyba sobie nie poradzę. Potrafię przekazać zmienną ale z tablicą nie wiem co zrobić. Robię tak

 //klasa Plansza
public Plansza(JPanel[][] jakis){
pole=jakis;
}

pewnie już to jest źle, bo skąd program ma wiedzieć o które dokładnie pole mi chodzi, ale eclipse nie pokazuje błędu

No i nie wiem co wpisać w słuchaczu

//klasa Sluchacz
Plansza plansza = new Plansza(nie wiem co tu wpisać);

a może

Plansza[][] plansza = new Plansza[30][10];

tylko jak to potem wykorzystać?

1
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class Example extends JFrame
{
    public static void main(String[] args)
    {
        new Example();
    }
    public Example()
    {
        setTitle("Przykład");
        Plansza plansza = new Plansza();
        add(plansza,BorderLayout.CENTER);
        JButton b = new JButton("Kliknij mnie");
        b.addActionListener(new Listener(plansza));
        add(b,BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

class Plansza extends JPanel
{
    protected JPanel[][] pola = new JPanel[10][10];
    Plansza()
    {
        setLayout(new GridLayout(10,10,3,3));
        for(int i=0;i<10;i++)
            for(int j=0;j<10;j++)
            {
                pola[i][j] = new JPanel();
                pola[i][j].setBorder(BorderFactory.createLineBorder(Color.black));//ramka
                add(pola[i][j]);
            }
    }    
}

class Listener implements ActionListener
{
    Plansza plansza = null;
    Random r = new Random();
    Listener(Plansza plansza)
    {
        this.plansza = plansza;
    }
    public void actionPerformed(ActionEvent ae)
    {
        plansza.pola[r.nextInt(10)][r.nextInt(10)].setBackground(Color.BLACK);
    }
}
0

Dzięki za cierpliwość :) Po przerobieniu śmiga. Muszę wrócić do lektury o konstruktorach.
Jeszcze raz dzięki za pomoc :)

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