2012-03-02 6 views
1

JPanelに追加するJListとJLabelが事前に宣言されているコントローラがあります。最初のレイアウトの外に/コードを追加するとJLabelを更新することができます(たとえばテキストを変更する)が、UIを更新するJListの選択を変更することはできません(jlist.setSelection(index)など)。以下のコード:JPanelにJListを追加するのはJLabelとは異なります(明らかにとは別に)なぜですか?

public class Test { 
    private JPanel myPanel; 
    private JList myList; 
    private JLabel myLabel; 

    public Test() { 
     //Some init code here... 
     this.myPanel = new JPanel(); 
     this.myPanel.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 

     String[] values = {"Value1", "Value2", "Value3", "Value4"}; //etc. etc. 
     this.myList = new JList(values); 
     this.myPanel.add(this.myList, gbc); //Add to panel 

     this.myLabel = new JLabel("Label1"); 
     this.myPanel.add(this.myLabel, gbc); //Add to panel 

     //Add some code here to add it to a frame or something to display 
    } 


    public void updateLabel(String workingNewLabel) { 

     //The following works... 
     this.myLabel.setText(workingNewLabel); 
      // as in the label component in the JPanel will 
      //now be updated to the new value of workingNewLabel 
    } 

    public void changeSelectionInListToSomeIndex(int nonWorkingNewIndex) { 

     //The following does NOT update the JList in the panel... 
     //the selection remains whatever it was last set to. 

     this.myList.setSelectedIndex(nonWorkingNewIndex); 
    } 
} 

私はその後、例えばmylistにするためにそれを設定しJListコンポーネントを探してmyPanel内のすべてのコンポーネントを反復処理することにより、この問題を回避することができました。

//Code that goes after the line this.myPanel.add(this.myList, gbc); 
for(Component component : this.myPanel.getComponents()) { 
    //Iterate through it all until... 
    if (component.getClass() == this.myList.getClass()) { 
     this.myList = (JList) component; //cast the component as JList 
    } 
} 

JListではなくJLabelでこれを行う必要があるのはなぜですか?これは回避策ですが、それは非常にハックされているようです。

ありがとうございます! -ダニエル

+0

あなたはおそらく、あなたの実際のコードにバグがあります。 'thisList.myList = new JList()'ではなく 'JList myList = new JList()'のようなものです。 –

+0

返信いただきありがとうございます。再宣言された変数がないコードを確認しました。あなたのコメントの後、私はthis.myList = new JList()をmyList = new JList()に変更しました。これは@trashGodのように動作します。なぜか分からない。私はこれでいくつかの範囲の問題を理解してはいけません。 – user1245954

答えて

2

@ JBの権利。ここで働いてsscceです:

test

/** @see http://stackoverflow.com/q/9540263/230513 */ 
public class Test { 

    private static Test test = new Test(); 
    private JPanel myPanel; 
    private JList myList; 
    private JLabel myLabel; 

    public Test() { 
     myPanel = new JPanel(); 
     myPanel.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     String[] values = {"Value1", "Value2", "Value3", "Value4"}; 
     myList = new JList(values); 
     myPanel.add(this.myList, gbc); 
     myLabel = new JLabel("Label1"); 
     myPanel.add(this.myLabel, gbc); 
     myPanel.add(new JButton(new AbstractAction("Select Value3") { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       test.updateList(2); 
      } 
     })); 
    } 

    public void updateLabel(String label) { 
     myLabel.setText(label); 
    } 

    public void updateList(int index) { 
     myList.setSelectedIndex(index); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.add(test.myPanel); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+0

ご清聴ありがとうございます。私はあなたがこれを使わなかったことに気づいた。演算子には理由がありますか? – user1245954

+0

私はそれをコンストラクタに保持し、引数のあいまいさを解決するだけです。 – trashgod

+0

あなたのコードありがとう – user1245954

関連する問題