Zmiana kolorów w fillRect

0

Ponieważ to mój pierwszy post - witam Wszystkich serdecznie.
Zwracam się do Was z pewnym problemem, którego sam, ani z pomocą kumpla nie potrafię rozwiązać. Otóż jako projekt w Javie na uczelni dostałem temat związany z dekodowaniem kodu barwnego rezystora. Tak w skrócie: wymyśliłem, że wstawię do okienka kilka prostokątnych obrazków a pomiędzy nie dam fillRect, które miałyby imitować kolorowe paski rezystora. Początkowo zmiana kolorów miała odbywać się za pomocą kliknięcia myszką, jednakże zrezygnowałem z tego pomysłu i postanowiłem zastosować ComboBox. W praktyce wygląda to tak:

http://i48.tinypic.com/11r6our.png

Otóż pojawił się problem, gdyż są 2 osobne klasy - jedna zajmuje się wyświetlaniem obrazków i fillRect a druga ComboBox'em etc. i całym "mechanizmem". W ComboBox'ie dodałem jak na razie jedną instrukcję warunkową, która miała zmieniać kolor prostokątów, jednakże problemem jest zaimplementowanie tego. Próbowałem stworzyć metodę,która by się tym zajmowała, jednakże nie chce ona współpracować z g.setColor().

Trudno mi powiedzieć - może i problem jest prosty (za to ja z programowania nie jestem mega zaawansowany), jednakże spędza mi sen z powiek.

Oto kod:

Klasa Okno

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Okno extends JFrame implements ActionListener{
	
	JLabel wartośćRezystancji;
	
	JLabel prąd;
	
	JComboBox listakolorów;
	
	int[] rgb = new int[3] ;
	
	BufferedImage img;
	
    JButton Dalej;
	
	JSlider napięcie = new JSlider(JSlider.HORIZONTAL);
	
	
	
	public Okno(){	
	
		
		
	final JFrame okienko = new JFrame("Kod barwny rezystora");
	okienko.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	okienko.setSize(600, 500);
	okienko.setVisible(true);
	okienko.setLocationRelativeTo(null);
	
	
	
	
	String[] kolory = { "czerwony", "niebieski", "czarny", "brązowy", "pomarańczowy", "złoty", };
	
	JComboBox listakolorów = new JComboBox(kolory);
	listakolorów.setSelectedIndex(0);
	listakolorów.setBounds(18,175, 100, 100);
	okienko.add(listakolorów);
	listakolorów.addActionListener(this);
	
	
	
	
	okienko.add(napięcie);
	
	napięcie.setMaximum(500);
	napięcie.setPaintLabels(true);
	napięcie.setPaintTicks(true);
	napięcie.setMajorTickSpacing(50);
	napięcie.setMinorTickSpacing(10);
	napięcie.setPaintTrack(false);
	napięcie.setBounds(0, 400, 300, 100);
	
	napięcie.addChangeListener(new ChangeListener(){
		public void stateChanged(ChangeEvent e){
			double value = napięcie.getValue();
			double maximumValue = napięcie.getMaximum();
			double r = (value/2000)*1000;
			prąd = new JLabel("Prąd wynosi: "+ r+ "mA");
			prąd.setBounds(0, 400, 180, 30);
			okienko.add(prąd);
		}
	}
	
			);
	

	
	wartośćRezystancji = new JLabel("Rezystancja");
	wartośćRezystancji.setBounds(180, 350, 100, 30);
	okienko.add(wartośćRezystancji);
	
	
        //okienko.setLayout(new FlowLayout(FlowLayout.LEFT));
	okienko.add(new LoadImageApp());

	okienko.pack();

    
	}
	
	public Color Kolorki(int r, int g, int b){                        //metoda która miała "wysyłać" kolory do innej klasy
	    Color kolor = new Color(rgb[0], rgb[1], rgb[2]);
	    rgb[0] = r;
	    rgb[1] = g;
	    rgb[2] = b;
	    System.out.println(kolor);
	    return kolor;
    }
	
	public void actionPerformed(ActionEvent e){

		JComboBox listakolorów = (JComboBox)e.getSource();
		String kolor = (String)listakolorów.getSelectedItem();
		if(kolor == "czarny") {
		//	rgb[0] = 0x4d;
		//	rgb[1] = 0x71;
		//	rgb[2] = 0xa3;
			Kolorki(0x4D, 0x71, 0xA3);
			repaint();
			System.out.println("Czarny");
		}
		if(kolor =="niebieski"){
			System.out.println("Niebieski");
		}
	}
}

Klasa LoadImageApp

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;

public class LoadImageApp extends Component {
    
    BufferedImage img;
    JButton Dalej;

    int[] rgb = new int[3] ;
    

	
    public void paint(Graphics g) {
    //	Color kolor = new Color(rgb[0], rgb[1], rgb[2]);     
    //	Okno kolors = new Okno();                                  //próbowałem w g.setColor dać kolors.Kolorki(), jednakże bez większego sukcesu
    	
        g.drawImage(img, 0, 0, null);
        g.setColor(kolor);
    	g.fillRect(18, 0, 22, 142);
        
        g.drawImage(img, 40, 0, null);
        g.setColor(kolor);
        g.fillRect(58, 0, 22, 142);
        
        g.drawImage(img, 80, 0, null);
        g.setColor(kolor);
        g.fillRect(98, 0, 22, 142);
        
        g.drawImage(img, 120, 0, null);
        g.setColor(kolor);
        g.fillRect(138, 0, 22, 142);
        
        g.drawImage(img, 160, 0, null);
        g.setColor(kolor);
        g.fillRect(178, 0, 22, 142);
        
        g.drawImage(img, 200, 0, null);
                
    }

    public LoadImageApp() {
       try {
           img = ImageIO.read(new File("/home/dante/Studia/Programowanie obiektowe/Projekt/Rezystor/Rezystor-pasek_duzy.png"));
       } catch (IOException e) {
       }

    }

    public Dimension getPreferredSize() {
        	return new Dimension(280, 550);
    }
}

Klasa Rezystor

public class Rezystor{

	public static void main(String[] args) {
		new Okno();
	}
}

Program oczywiście nie jest jeszcze dokończony, więc może być kilka niedociągnięć (jak nieodpowiednia ilość ComboBox'ów).

1

Propozycja nie sprawdzona.

  1. Dodaj w klasie Okno pole i trochę zmień tworzenie komponentu.
LoadImageApp komponent;
...
komponent = new LoadImageApp();
okienko.add(komponent);
  1. Dodaj w klasie LoadImageApp pole kolor:
Color kolor = ...; //kolor domyślny
  1. Zmień w klasie Okno metodę actionPerformed, obecna jest zupełnie zła. Źle porównujesz Stringi.
        public void actionPerformed(ActionEvent e){
 
                JComboBox listakolorów = (JComboBox)e.getSource();
                String kolor = (String)listakolorów.getSelectedItem();
                if(kolor.equals("czarny")) {
                        komponent.kolor = new Color(0x4D, 0x71, 0xA3);
                        komponent.repaint();
                        System.out.println("Czarny");
                }
                ...
        }
  1. W metodzie paintComponent powinieneś wywołać raczej g.setBackground(kolor);

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