Zmiana koloru panelu, suwaki

0

Witam. Próbuje stworzyc metodę, dodającą suwak, o dowolnie zadeklarowanych parametrach: vertical czy horizontal, zakres wartości itd.
Mój problem polega na tym, że nie potrafie wyciągnąć wartości zmienianej w metodzie stateChanged(ChangeEvent e) z ChangeListenera. Próbowałem deklarować w różny sposób, tablice jednakże coś nie chce działać. Wartość zmienia się tylko w obrębie metody, dlatego kolor panelu zmienia się tylko gdy dodam linijke wewnątrz funkcji, a chciałbym, aby zmienna z każdego suwaka była globalna. Proszę o jakąś pomoc, Dziękuję z góy !
Oto kod:


package paczkapaczka;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Suwaki extends JFrame{
	
	private int WIDTH = 400;
	private int HEIGHT = 400;
	static int R;
	static int G;
	static int B;
	int wartoscSuwaka [];
	JPanel panel = new JPanel();
	JSlider suwak [] = new JSlider [3];
	
	
	public Suwaki() {
		
		initComponent();
	}
	
	public void initComponent() {
		// tworzenie ramki
		String nazwaKlasy = this.getClass().getSimpleName();
		setTitle(nazwaKlasy);
		setSize(WIDTH,HEIGHT);
		setLocationRelativeTo(null);
		setResizable(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		getContentPane().add(panel);
		
	    stworzSuwak("R", 0, 1, 0, 255, 120, 50, Color.blue, Color.yellow);
	    stworzSuwak("G", 1, 1, 0, 255, 120, 50, Color.blue, Color.yellow);
	    stworzSuwak("B", 2, 1, 0, 255, 120, 50, Color.blue, Color.yellow);
	    
	    R = zwrocWartoscSuwaka(0,  wartoscSuwaka);
	    G = zwrocWartoscSuwaka(1,  wartoscSuwaka);
	    B = zwrocWartoscSuwaka(2,  wartoscSuwaka);
	    
		panel.setBackground(new Color(R, G, B));
	

		
	}
	
	public void stworzSuwak(String nazwa, int numerSuwaka, int orientacja, int min, int max, int pozycjaPoczatkowaSuwaka, int coIlePrzedzialka, Color foreground, Color background) {
		wartoscSuwaka = new int [3];
		
		suwak[numerSuwaka] = new JSlider(orientacja ,min, max, pozycjaPoczatkowaSuwaka);
		panel.add(suwak[numerSuwaka], BorderLayout.NORTH);
	
		suwak[numerSuwaka].setForeground(foreground);
		suwak[numerSuwaka].setBackground(background);
		suwak[numerSuwaka].setMajorTickSpacing(coIlePrzedzialka);
		suwak[numerSuwaka].setPaintTicks(true);
		suwak[numerSuwaka].setPaintLabels(true);
		suwak[numerSuwaka].setSnapToTicks(true);
		
		suwak[numerSuwaka].addChangeListener(new ChangeListener() {
			
			public void stateChanged(ChangeEvent e) {
				
			//	wartoscSuwaka[numerSuwaka] = ((JSlider)e.getSource()).getValue();
				wartoscSuwaka[numerSuwaka] = suwak[numerSuwaka].getValue();
				System.out.println("["+nazwa+"] "+wartoscSuwaka[numerSuwaka]);
		
			}
		});
	}
	
	public int zwrocWartoscSuwaka(int numerSuwaka, int wartoscSuwaka[]) {
		int zmienna = wartoscSuwaka[numerSuwaka];
		return zmienna;
	}
	public static void main(String[] args) {
		new Suwaki().setVisible(true);

	}

}

0
Spwrtt napisał(a):

Mój problem polega na tym, że nie potrafie wyciągnąć wartości zmienianej w metodzie stateChanged(ChangeEvent e) z ChangeListenera.

Przecież już to zrobiłeś i to działa.

PS. użyj lambd będzie krócej i przejrzyściej:
suwak[numerSuwaka].addChangeListener(e -> wartoscSuwaka[numerSuwaka] = ((JSlider)e.getSource()).getValue());
a tablica wartoscSuwaka jest przecież zmienną instancyjną a nie lokalną jakiejś metody. Wszystko gra i buczy. Nie wiem więc w czym jest problem.

Edit:
Pomijam fakt że kod jest koszmarnie napisany i chyba nawet sam nie wiesz co się w nim dzieje. Zauważyłeś np. że w metodzie public void stworzSuwak() masz wywołanie wartoscSuwaka = new int [3];, a więc tablicę wartoscSuwaka tworzysz trzy razy? (bo trzy razy wywołujesz tę metodę). A kolor czarny tła panelu jest dlatego, że pomimo, że każdemu sliderowi przypisujesz jakąś wartość początkową, i zmiana jego powoduje zapis do tej tablicy, to jednak początkowo tablica ta ma wartości [0, 0, 0]. Jej wartości zmienią się dopiero PO ruszeniu slidera. Ale do tego czasu okienko już dawno powstanie i nastąpi przypisanie koloru czarnego do jego tła.

Edit2:
panel.add(suwak[numerSuwaka], BorderLayout.NORTH);

kolejne nieporozumienie. A znasz trochę angielski? BorderLayout.NORTH jak sama nazwa mówi tyczy się układu BorderLayout a nie FlowLayout, który jest domyślnym układem dla komponentu JPanel. Wystarczy więc samo to: panel.add(suwak[numerSuwaka]);

Edit3: Podpowiedź. Co chcesz zmieniać? Czy wartości w tablicy czy tło panelu? Jeśli tło panelu, to… zmieniaj tło panelu za każdym razem gdy zmieniasz wartość sliderów a nie tablicę.

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