[JComboBox] Zmiana tła.

0

Witam.
Chciałem ustawić możliwość zmiany tła przy pomocy JComboBox.
W klasie wyświetlającej na ekranie mam zmienną

ImageIcon tlo1 = new ImageIcon(getClass().getResource("/java_project2/beach.jpg"));

I wyświetlam ją w etykiecie

mainLabel.setIcon(tlo1);

I to działa jak należy.

W innej klasie mam ComboBoxa, którym chcę zmieniać to tło

wyborTla.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e)
            {
              
              ImageIcon t = (ImageIcon) ((JComboBox)e.getSource()).getItemAt(1);
                            
            }


        });
        
        wyborTla.addItem(new ZmianaTla ("Tlo 1", new ImageIcon(getClass().getResource("/java_project2/01.jpg"))));
        wyborTla.addItem(new ZmianaTla ("Tlo 2", new ImageIcon(getClass().getResource("/java_project2/02.jpg"))));
        wyborTla.addItem(new ZmianaTla ("Tlo 3", new ImageIcon(getClass().getResource("/java_project2/03.jpg"))));
        wyborTla.addItem(new ZmianaTla ("Tlo 4", new ImageIcon(getClass().getResource("/java_project2/04.jpg")))); 

ZmianaTla to wewnętrzna klasa, która zwraca (przekonwertowaną na Stringa nazwę, tlo)

Moje pytanie to czy zmienną t mam dobrą a jeśli tak to jak się do niej odwołać w miejscu gdzie tło jest wstawiane w mainLabel?

0
public void actionPerformed(ActionEvent e) {
    JComboBox comboBox = (JComboBox) e.getSource();
    Object selected = comboBox.getSelectedItem();
    if (selected != null && selected instanceof ZmianaTla) {
        ZmianaTla tlo = (ZmianaTla) selected;
        zmianTlo(tlo.getIcon());
    } else {
        zmienTlo(null); // Jeżeli obslugujesz wybor np.: brak
    }                      
}

private void zmienTlo(Icon tlo) {
    SwingUtilities.invokeLater(new Runnable() {
       public void run() {
           mainLabel.setIcon(tlo);
       }
    });
}

Generalnie pisane z palca więc mogą być błędy składni :P

0

Twój sposób działa dobrze.
Ale zapomniałem napisać że możliwość wybierania mam w jednym JFrame'ie (Settings), a tło ma się zmieniać w oknie głównym (Main).
Gdy w klasie Settings tworzę obiekt klasy Main i próbuje nim zmienić tło w Main'ie

ikonka.mainLabel.setIcon(tlo); 

To dostaje w tym miejscu wyjątek

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Czy muszę robić w Main'ie metodę która będzie nasłuchiwała i pobierała tło kiedy zostanie zmienione czy da się to jakoś inaczej zrobić?

0

Obiekt ikona jest null'em lub mainLabel w obiekcie ikona jest nullem.

  1. Zamiast konstrukcji klasy Main
+ mainLabel: JLabel

powinieneś zrobić dostęp do etykiety przez gettery:

- mainLabel: JLabel
+ getMainLabel() :JLabel
  1. Nie rozumiem zależności między klasami Settings i Main?
    Czy w klasie Main masz referencje do klasy Settings czy odwrotnie ?
    I kiedy jest tworzona ?

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