起動時にExcelファイルからデータを読み取る小さなGUIプログラムがあり、これらのデータの一部は関連するコンボボックスに移動する必要があります。コンボボックスごとに個別の SwingWorker を使用してこれを行う方法を知っています。
public class ExcelReader extends SwingWorker<DefaultComboBoxModel, String> {
private final DefaultComboBoxModel model;
// Constructor called from a panel that has a combobox
public ExcelReader(DefaultComboBoxModel model) {
this.model = model;
}
@Override
protected DefaultComboBoxModel doInBackground() throws Exception {
///// code to read data from Excel file
///// publish(someString) used here
return model;
}
@Override
protected void process(List<String> chunks) {
for(String row : chunks)
model.addElement(row);
}
}
これは問題なく動作しますが、1 つの SwingWorker クラスを使用して複数のコンボボックスを埋めるにはどうすればよいでしょうか? これには、ファイルを一度だけ読み取るという利点があります。コンボボックスに移動する必要があるものが見つかると、関連するコンボボックスが更新され、プログラムはファイルの最後まで次の行を読み続けます。
そのため、1 つの JPanel で 2 つのコンボボックスを更新したい場合にブール値フラグを使用しようとしましたが、期待どおりに動作しないようです。将来、複数のパネルで 2 つ以上のコンボボックスを更新する予定であるため、これも良い解決策ではありません。
public class ExcelReader extends SwingWorker<DefaultComboBoxModel[], String> {
private boolean isData1 = false;
private final DefaultComboBoxModel model1;
private final DefaultComboBoxModel model2;
private final DefaultComboBoxModel[] models = new DefaultComboBoxModel[2];
// Constructor called from a panel that has 2 comboboxes
public ExcelReader(DefaultComboBoxModel model1, DefaultComboBoxModel model2) {
this.model1 = model1;
this.model2 = model2;
}
@Override
protected DefaultComboBoxModel[] doInBackground() throws Exception {
///// some code .....
///// some code .....
// If data that needs to go to combobox1 is found
if (someExpression)
isData1 = true;
publish(someString);
///// some code .....
///// some code .....
models[0] = model1;
models[1] = model2;
return models;
}
@Override
protected void process(List<String> chunks) {
for (String row : chunks) {
if (isData1) {
model1.addElement(row);
isData1 = false;
}
else
model2.addElement(row);
}
}
では、1 つの SwingWorker だけを使用して、多くのコンボボックス (異なるパネルに含まれる可能性がある) を埋めるにはどうすればよいでしょうか?
ところで、上記の例では、パネルの 1 つ (JPanel を拡張するクラス) から ExcelReader を呼び出しています。最初のケースでは、ワーカーを呼び出すパネルにはコンボボックスが 1 つしかありませんが、2 つ目の例では 2 つしかありません。