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);
  2. Dodaj w klasie LoadImageApp pole kolor:
    Color kolor = ...; //kolor domyślny
  3. 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");
                }
                ...
        }
  4. W metodzie paintComponent powinieneś wywołać raczej g.setBackground(kolor);

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