Tengo una función llamada getCrop () para cambiar la imagen de una etiqueta según la ventana de configuración, pero cuando llamo a la función en otra clase, la imagen no cambia ¿por qué?

private JLabel label_9 = new JLabel("");

//This is inside class Normal(main).
public void getCrop(String str) {
    switch(str) {
    case "4446" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4446.jpg")));
        break;
    case "3339" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3339.jpg")));
        break;
    case "3446" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3446.jpg")));
        break;
    case "4536" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4536.jpg")));
        break;
    case "5346" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/5346.jpg")));
        break;
    case "11115" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/11115.jpg")));
        break;
    case "4437" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4437.jpg")));
        break;
    case "3447" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3447.jpg")));
        break;
    case "4347" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4347.jpg")));
        break;
    case "3546" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/3546.jpg")));
        break;
    case "4356" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4356.jpg")));
        break;
    case "5436" : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/5436.jpg")));
            break;
    default : label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/4446.jpg")));
        break;
    }
}

Mi objetivo es poder cambiar la imagen a través de mi ventana de Configuración. Aquí está el código para cuando alguien cambia el cuadro combinado, la imagen también debería cambiar.

//City is an array of Strings
public JComboBox comboBox = new JComboBox(City);

comboBox.addActionListener(new ActionListener() {
//this is inside Settings
        public void actionPerformed(ActionEvent e) {
            Normal cb = new  Normal();
            System.out.println(comboBox.getSelectedItem());
            cb.getCrop(comboBox.getSelectedItem().toString());
        }
    });

EDITAR 1:

Reemplacé getcrop por setVillageImg tanks para la propina

public static void setVillageImg(String str) {
    label_9.setIcon(new ImageIcon(Normal.class.getResource("/TryBot/Resources/" + str + ".jpg")));
}

EDITAR 2:

Ahora es posible acceder a gracias a todos. Pero cuando cambio la primera vez, funciona, pero tengo que cerrar la configuración y volver a abrir para cambiar la imagen nuevamente porque si trato de cambiar nuevamente me da un error

at java.awt.EventDispatchThread.run(Unknown Source)
0
pzmq 20 jul. 2016 a las 22:05

2 respuestas

La mejor respuesta

Parece que su problema es el hecho de que crea una nueva instancia de la clase Normal que luego cambia las imágenes de una etiqueta diferente a la que ve. Puede remediar esto pasando cosas o haciendo que el método sea estático; pero eso agregaría dependencias innecesarias al código cuando podría usar otros mecanismos.

Si tiene dos clases (una para cada una de sus configuraciones y vistas principales), ¿por qué no agregar un controlador entre ellas y tenerlo como oyente de JComboBox y Observable en la vista principal? Por ejemplo ( el código incluye métodos de simulación y declaraciones que se eliminarán ):

Vista principal:

public class MainView extends JPanel implements Observer {

    private JLabel label = new JLabel("");

    public void setVillageImg(String path) {
        // set the image
    }

    @Override
    public void update(Observable o, Object arg) {
        String path = (String)arg;
        System.out.println(path);
        setVillageImg(path);
    }
}

Controlador:

public class ViewController extends Observable implements ActionListener {

    public ViewController(Observer observer) {
        addObserver(observer);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action Performed");
        setChanged();
        JComboBox comboBox = (JComboBox) e.getSource();
        notifyObservers(comboBox.getSelectedItem().toString());
    }
}

Vista de configuración:

public class SettingsView extends JPanel {

    private JComboBox<String> comboBox;
    private static final String[] strings = {"Hello", "World"};

    public SettingsView(ActionListener listener) {
        comboBox = new JComboBox<>(strings);
        comboBox.addActionListener(listener);
    }

    public void simComboChange(int selected) {
        System.out.println("Simulating combo change");
        comboBox.setSelectedIndex(selected);
        comboBox.actionPerformed(new ActionEvent(comboBox, 0, "SimAction"));
    }
}

Simulación main:

public static void main(String[] args) {
    MainView mainView = new MainView();
    ViewController viewController = new ViewController(mainView);
    SettingsView settingsView = new SettingsView(viewController);
    settingsView.simComboChange(0);
    settingsView.simComboChange(1);
}

Información de contexto:

Un Observer es una clase que quiere observar otra clase de cambios y actuar sobre esos cambios.

Se dice que la clase que cambia es Observable. Los dos juntos son mecanismos del patrón Modelo-Vista-Controlador.

setChanged() cambia el estado de lo observable a cambiado. Si llama a notifyObservers() < / a> se debe verificar el observable en busca de cambios con hasChanged(). clearChanged() establece el estado de nuevo sin cambios. Ambos afectan el valor de retorno de hasChanged(). Tenga en cuenta que clearChanged() es llamado automáticamente por notifyObservers() y es redundante en el código; por lo tanto, ahora está eliminado.

0
ChiefTwoPencils 20 jul. 2016 a las 21:13

El alcance de cb normal está limitado al método actionPerformed que creo y al nuevo objeto Normal que creó. Necesita llamar a getcrop () en la etiqueta que ya está dentro de su marco / el objeto Normal ya creado en su marco, donde sea que esté.

0
Javant 20 jul. 2016 a las 19:14