2017-02-14 8 views
0

Его программа beatBox с 256 checkBoxes и сделать трек и запустить его. С запуском, остановкой, loadTrack и saveTrack. Когда мы нажимаем кнопку «Пуск», он перебирает все флажки и записывает их. Ниже приведен код, который восстанавливает значения checkBoxes, через JFileChooser и FileInput Stream.Восстановление шаблона в ArrayList из CheckBox?

void buildAndStartTrack(){ 

ArrayList checkBoxList = new ArrayList<JCheckBox>(); 
for (int i=0; i<256; i++) 
    { 
     JCheckBox c = new JCheckBox(); 
     c.setSelected(false); 
     checkBoxList.add(c); 
     mainPanel.add(c); 
    } // end loop 
    } 
//here some more code to maketracks and start sequencer 
} 

public class MyObjectLoadListener implements ActionListener{ 
    public void actionPerformed(ActionEvent event) 
    { 
     JFileChooser fileLoad = new JFileChooser(); 
     fileLoad.showOpenDialog(theFrame); 
     LoadedFile(fileLoad.getSelectedFile()); 

    } 
} 

public void LoadedFile(File file) 
{ 
    boolean [] checkBoxState = null; 

    try 
    { 
     FileInputStream fileIn = new FileInputStream(file); 
     ObjectInputStream is = new ObjectInputStream(fileIn); 
     checkBoxState = (boolean[]) is.readObject(); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 

Восстановление значений флажков и чем она будет вызывать buildAndStartTrack

//how i did it myself (It has a bug but its working fine)  
for (int i=0; i<256; i++) 
    { 
     JCheckBox check = new JCheckBox(); 
     if(checkBoxState[i]) 
     { 
      check.setSelected(true); 
      checkBoxList.set(i, check); 
     } 
     else 
     { 
      check.setSelected(false); 
      checkBoxList.set(i, check); 
     } 
    } 

    sequencer.stop(); 
    buildTrackAndStart(); 
} 

чем я посмотрел на книгу и нашел этот код .Я не смог получить даже после двух дней поиска более checkBoxs, темы арраистов по всему Интернету и форумам.

for (int i=0; i<256; i++) 
    { 
     JCheckBox check = (JCheckBox) checkBoxList.get(i); 
     if(checkBoxState[i]) 
     { 
      check.setSelected(true); // here doubt 
// check is on left handside 
// so changing its value shouldn't effect value on right hand side i.e checkBoxList.get(i) 
     } 
     else 
     { 
      check.setSelected(false); 
     } 

Но назначение с левой стороны оказывает влияние на правую сторону.

+0

с какой линией у вас возникла проблема? 'setSelected()'? или 'checkBoxList.get (i)'? – XtremeBaumer

+0

JCheckBox check = (JCheckBox) checkBoxList.get (i); – Gill

+0

Последнее для цикла @XtremeBaumer – Gill

ответ

0

Это повлияет на значение, поскольку, когда вы делаете JCheckBox check = (JCheckBox) checkBoxList.get(i);, вы назначаете ссылку check для экземпляра checkBoxList.get(i). А затем вы выполняете check.setSelected(true); на этом экземпляре (помните - это все тот же экземпляр).

+0

Я получаю его, проверка относится к тому же checkBox на куче, поэтому изменение его значения изменит значение checkBox по индексу i в массиве checkBoxList. Благодарю @ нигол. – Gill

+0

@ Gill Просто любопытно - почему мой ответ больше не принимается? –

+0

Done @MartinPolak, Sir – Gill

1

JCheckBox является ссылочным типом.

При выполнении оператора присваивания:

someVariable = someValue; 

, если обе стороны являются ссылочными типами, то что-то действительно здорово бывает.

Переменные ссылочного типа хранят ссылку на фактический объект, то есть сам флажок. В приведенном выше заявлении указывается ссылка, которую someValue имеет значение someVariable. Другими словами, он составляет someVariable и someValue относится к одному и тому же объекту.

Теперь на этой линии

JCheckBox check = (JCheckBox) checkBoxList.get(i); 

Как я уже сказал, check и checkBoxList.get(i) теперь будет ссылаться на тот же флажок, потому что они являются переменными ссылочного типа. Когда вы говорите:

check.setSelected(true); 

Это эквивалентно:

checkBoxList.get(i).setSelected(true); 

, потому что две переменные ссылаются на тот же флажок.

+0

Спасибо, я понял, очень хорошо объяснил. – Gill