2016-07-20 6 views
0

Iた設定画面によっては、ラベルのIMGを変更するが、私は別のクラスで関数を呼び出すときに、なぜIMGが変化しないために、getCrop()という関数?は、どのように私は情報を取得し、メインに変更するために、他のクラスにアクセスすることができますか?

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

EDIT 1:あなたのすべてに感謝アクセスできるようになりました

私は先端

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

EDIT 2用setVillageImgタンク用getcropを置き換えます。 しかし、ときに私はそれが動作する最初の時間を変更するが、私は再び変更しようとした場合、それは私にエラー

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

+0

例外はありますか? ( 'getCrop'メソッドを' Normal'インスタンスの状態を必要としないように静的にするか、 'comboBox'を含むクラスの一部でなければなりません)。 –

+0

その方法の多くは、はるかに小さく書き直すことができます。サポートされている文字列のリストを作成することができます(デフォルト以外のすべての場合)。次に、文字列がリストに含まれているかどうかを確認するだけです。そうであれば、不要なハードコードされた値ではなく、渡された文字列に基づいてアイコンを設定することができます(str [より良い名前を付けることもできます])。 – ManoDestra

+0

getCropメソッドの名前を変更する必要があります。何も取得しないためです。あなたはそれをsetSomeLabelIcon(String strImageId)と呼ぶこともできますが、Some部分をlabel_9ではなくそのラベルとすることができます。これはlabel_9ではなく、より適切に名前を付ける必要があります。 – ManoDestra

答えて

0

は、あなたの問題は、あなたが、あなたが見たものとは異なるラベルの画像を変更しているNormalクラスの新しいインスタンスを作成することです表示されます。あなたは物事を渡すか、あるいはメソッドを静的にすることでこれを修正することができます。他のメカニズムを使用できる場合は、コードに不要な依存関係が追加されます。

メインビューにJComboBoxObservableのリスナーとして2つのクラス(設定とメインビューのそれぞれに1つずつ)を追加してみてはどうでしょうか?例えば(コードはを除去するシミュレーション方法および文を含む):

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と言います。 2つは一緒にModel-View-Controllerパターンのメカニズムです。

setChanged()は、観測値の状態を変更して変更します。 notifyObservers()に電話をした場合、オブザーバブルはhasChanged()の変更を確認する必要があります。 clearChanged()は、状態を変更しない状態に戻します。両方とも戻り値hasChanged()に影響します。 clearChanged()は自動的にnotifyObservers()によって呼び出され、コードは冗長であることに注意してください。したがって、今削除されました。

+0

ありがとう、私は "Observerの存在"について知りませんでした。setChanged()、clearChanged()、notifyObservers関数は何をしますか? 2度オブザーバーとは正確に何か質問しますか? – pzmq

+0

@pzmqは、これらの質問の背景情報を追加しました。 – ChiefTwoPencils

+0

あなたが助けてくれてありがとう – pzmq

0

ノーマルCBの範囲をされていますので、私は設定を閉じて、もう一度IMGを変更するために、再び開く必要があります私は信じてactionPerformedメソッドにし、作成した新しい標準オブジェクトに制限されています。あなたはそれがかもしれどこ、あなたのフレーム/あなたのフレームで、すでに作成通常のオブジェクトの内部既にラベル上)(getcropを呼び出す必要があります。

関連する問題