我有一个应用程序,它在JTable上有sheep条目。通过从JTable的parent id列的JComboBox编辑器中选择一个id,可以使Sheep成为其他sheep的孩子。为此,父id JComboBox必须扫描其他绵羊的id,并按照预期删除其中一些绵羊,并在其popup中一起显示它们。
这不是一个耗时的过程;但在我看来,未来如果绵羊数量增加,可能会导致GUI变得无响应。这就是我想使用SwingWorker进行扫描过程的原因。如果它在doInBackground方法中scanS ids并将这些ids返回给done方法,那就更好了。
所以JComboBox会显示任何可能的父ids。虽然doInBackground方法在done方法中工作得很好,但当我向JComboBox添加一个数字时,我猜它会使popup变得不可见。
因此,每当我单击parent pupup d JComboBox pupup的单元格时,它就会出现,然后很快消失,不会显示任何父ids。但它必须显示家长ids。有没有办法做到这一点?
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sheepfarm.tools;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Vector;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import javax.swing.table.TableCellEditor;
import org.joda.time.Interval;
import java.util.Date;
import javax.swing.DefaultComboBoxModel;
import javax.swing.SwingWorker;
/**
*
* @author Personal Computer
*/
public class JParentIDCellEditor extends AbstractCellEditor implements TableCellEditor {
private JComboBox jComboBox = new JComboBox();
private boolean cellEditingStopped = false;
@Override
public Object getCellEditorValue() {
return jComboBox.getSelectedItem();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(Integer.parseInt(value.toString()));
jComboBox = new JComboBox();
ParentIDCellWorker worker = new ParentIDCellWorker(table, jComboBox, row, value);
worker.execute();
jComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
fireEditingStopped();
}
}
});
jComboBox.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
cellEditingStopped = false;
}
@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
cellEditingStopped = true;
fireEditingCanceled();
}
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
}
});
return jComboBox;
}
public class ParentIDCellWorker extends SwingWorker<Vector, Vector> {
private JTable table;
private JComboBox jComboBox;
private int row;
private Object value;
public ParentIDCellWorker(JTable table, JComboBox jComboBox, int row, Object value) {
this.table = table;
this.jComboBox = jComboBox;
this.row = row;
this.value = value;
}
@Override
protected Vector doInBackground() throws Exception {
Vector vector = new Vector();
vector.add(0);
for (int i = 0; i < table.getRowCount(); i++) {
try {
Interval interval = new Interval(((Date) table.getValueAt(i, 2)).getTime(), new Date().getTime());
interval = new Interval(((Date) table.getValueAt(i, 2)).getTime(), ((Date) table.getValueAt(row, 2)).getTime());
String gender = table.getValueAt(i, 3).toString();
if (!vector.contains(table.getValueAt(i, 0)) && gender.equals("Sheep")) {
vector.add(table.getValueAt(i, 0));
}
} catch (IllegalArgumentException exp) {
}
}
String[] rowsToRemove = getChildren(Integer.parseInt(table.getValueAt(row, 0).toString()), table).split("-");
for (int i = 0; i < rowsToRemove.length; i++) {
vector.removeElement((Object) (Integer.parseInt(rowsToRemove[i])));
}
return vector;
}
public String getChildren(int id, JTable jTable) {
String id_map = "";
for (int i = 0; i < jTable.getRowCount(); i++) {
if (Integer.parseInt(jTable.getValueAt(i, 1).toString()) == id) {
id_map += getChildren(Integer.parseInt(jTable.getValueAt(i, 0).toString()), jTable);
}
}
return id + "-" + id_map;
}
@Override
protected void done() {
try {
for (Object i : get()) {
jComboBox.addItem(i);
}
jComboBox.setSelectedItem(value);
} catch (InterruptedException ex) {
Logger.getLogger(JParentIDCellEditor.class.getName()).log(Level.SEVERE, null, ex);
} catch (ExecutionException ex) {
Logger.getLogger(JParentIDCellEditor.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@Override
public boolean stopCellEditing() {
return cellEditingStopped;
}
}发布于 2011-10-19 00:46:22
我不确定,但等到用户点击弹出窗口可能已经太晚了。相反,您可以在调用getTableCellEditorComponent之前启动SwingWorker来创建List<ComboBoxModel>,也许是在构建父表的模型时。这样,您的getTableCellEditorComponent方法就可以为该行设置正确的模型。我猜您必须在编辑器中保持List是最新的,但这似乎容易得多。
https://stackoverflow.com/questions/7799104
复制相似问题