我怎样才能访问其他类只是为了获取信息然后更改为主?

时间:2016-07-20 19:05:32

标签: java jcombobox

我有一个名为getCrop()的函数,以便根据设置窗口更改标签的img,但是当我在另一个类中调用该函数时,img不会改变原因吗?

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;
    }
}

我的目标是能够通过“设置”窗口更改img 以下是有人更改组合框时的代码,img也应该更改。

//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());
        }
    });

编辑1:

我为setVillageImg坦克替换了getcrop以获取提示

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

编辑2:

现在可以访问谢谢大家。 但是,当我第一次更改它的工作但我必须关闭设置并再次打开以便再次更改img,因为如果我再次尝试更改它会给我一个错误

at java.awt.EventDispatchThread.run(Unknown Source)

2 个答案:

答案 0 :(得分:0)

普通cb范围仅限于我认为的actionPerformed方法以及您创建的新Normal对象。你需要在框架内的标签上调用getcrop()/框架中已经创建的Normal对象,无论它在哪里。

答案 1 :(得分:0)

您的问题似乎是您创建Normal类的新实例,然后更改不同于您看到的标签的图像。你可以通过传递东西或使方法静态来解决这个问题;但是当你可以使用其他机制时,这会给代码增加不必要的依赖。

如果你有两个类(每个设置和主视图一个),为什么不在它们之间添加一个控制器,让它作为JComboBoxObservable的监听器视图?例如(代码包括要删除的模拟方法和语句):

MainView:

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);
    }
}

控制器:

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());
    }
}

<强> SettingsView:

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"));
    }
}

模拟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);
}

<小时/> 背景信息:

Observer是一个想要观察另一个类进行更改并根据这些更改进行操作的类。

更改的课程称为Observable。这两者是模型 - 视图 - 控制器模式的机制。

setChanged()将observable的状态更改为已更改。如果您致电notifyObservers(),则应使用hasChanged()检查observable是否有变化。 clearChanged()将状态设置为不变。两者都会影响hasChanged()的返回值。请注意clearChanged()会自动调用notifyObservers()并在代码中冗余;因此它现在已被删除。