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でこれを行う必要があるのはなぜですか?これは回避策ですが、それは非常にハックされているようです。
ありがとうございます! -ダニエル
あなたはおそらく、あなたの実際のコードにバグがあります。 'thisList.myList = new JList()'ではなく 'JList myList = new JList()'のようなものです。 –
返信いただきありがとうございます。再宣言された変数がないコードを確認しました。あなたのコメントの後、私はthis.myList = new JList()をmyList = new JList()に変更しました。これは@trashGodのように動作します。なぜか分からない。私はこれでいくつかの範囲の問題を理解してはいけません。 – user1245954