Custom Cell Renderer
Можно ли создать экземпляр пользовательского средства визуализации ячеек и поместить в него разные значения для каждого столбца в зависимости от заданных ему аргументов?
Например:
У меня есть этот рендерер (MyCustomCellRenderer myRen = new MyCustomCellRenderer
), и для каждого столбца я выставляю разные аргументы для отображения чего-то другого в ComboBox
:
MyCustomCellRenderer myRen = new MyCustomCellRenderer
for (int i = 0; i < table.nbColumns; i++) {
myRen.setArg(myArg); //denpending on this argument I fill the combo
myJTable.getColumnModel().getColumn(i).setCellRenderer(myRen);
}
Как я могу это сделать?
Редактировать:
Похоже, есть недоразумение, у меня есть список аргументов, и я написал приведенный выше код в качестве примера.
Мой вопрос: что я должен написать в MyCustomCellRenderer
класс для изменения рендерера каждый раз для каждого столбца?
Мой класс рендерера:
public class MyCustomCellRenderer extends JPanel{
private static final long serialVersionUID = 1L;
private JPanel topPanel;
private JTextField hs = new JTextField();
private Activity aObj = new Activity();
@SuppressWarnings({ "unchecked", "rawtypes" })
private JComboBox<ComboItem> activityCombo = new JComboBox(aObj.getListActivitiesForComboBox());
private JComboBox<ComboItem> chantier = new JComboBox<ComboItem>();
private List<Project> listProjectsForChef;
private List<Date> datePointage = new ArrayList<Date>();
private Date columnDate;
public MyCustomCellRenderer(boolean enabled, int idChef) {
this.setLayout(new BorderLayout());
if (enabled) {
Project p = new Project();
p.setChef(idChef);
listProjectsForChef = p.getListProjectsForSelectedChef();
topPanel = new JPanel();
Color color = new Color(128, 128, 128);
chantier.setBorder(BorderFactory.createLineBorder(Color.WHITE));
chantier.setPreferredSize(new Dimension(this.getWidth(), 30));
Services.setSideBorderColor(chantier, "TOP", color);
this.add(chantier, BorderLayout.SOUTH);
topPanel.setLayout(new GridLayout());
hs.setBorder(BorderFactory.createLineBorder(Color.WHITE));
hs.setHorizontalAlignment(JTextField.CENTER);
Services.setSideBorderColor(hs, "RIGHT", color);
hs.setPreferredSize(new Dimension(topPanel.getWidth(), topPanel.getHeight()));
topPanel.add(hs);
topPanel.add(activityCombo);
this.add(topPanel, BorderLayout.CENTER);
}
}
//The function that will take the argument
public void setDatePointage(Date d){
this.datePointage.add(d);
this.columnDate = d;
fillProjectCombobox();//--fill the combo based on the given argument
}
public void fillProjectCombobox() {
this.chantier.removeAllItems();
int nbIde = listProjectsForChef.size();
for (int i = 0; i < nbIde; i++) {
String key = Integer.toString(listProjectsForChef.get(i).getId());
String value = listProjectsForChef.get(i).getDesignation();
java.sql.Date dateEndMappingChiefProject = listProjectsForChef.get(i).getDateFin();
if(dateEndMappingChiefProject != null){
int compare = dateEndMappingChiefProject.compareTo(this.columnDate);
if(compare == 1){//---dateEndMappingChiefProject > this.columnDate
this.chantier.addItem(new ComboItem(key, value));// ---on ajout les
}
}else{
this.chantier.addItem(new ComboItem(key, value));// ---on ajout les
}
}
}
}
2 ответа
Ваша проблема в том, что вы используете один и тот же экземпляр MyCustomCellRender для всех столбцов. Это приведет к тому, что каждый столбец будет использовать один и тот же рендерер с последним параметром myArg в качестве параметра для рендеринга ваших вещей. Что может помочь, это создать новый экземпляр MyCustomCellRenderer для каждого столбца.
Например:
for (int i = 0; i < table.nbColumns; i++) {
MyCustomCellRenderer myRen = new MyCustomCellRenderer //now each column will use it's own renderer instance
//also: don't forget to set myArg
myRen.setArg(myArg);
myJTable.getColumnModel().getColumn(i).setCellRenderer(myRen);
}
В настоящее время вы просматриваете все столбцы и всегда используете один и тот же "myarg". Есть несколько способов сделать это (трудно сказать вам лучший способ, не видя ваш код), но ваш метод может принять дополнительный параметр, например myarg2
и затем с помощью оператора if (чтобы проверить i==1):
MyCustomCellRenderer myRen = new MyCustomCellRenderer
for(int i = 0; i<table.nbColumns; i++){
if(i==1){
myRen.setArg(myArg2);// changed to myArg2
myJTable.getColumnModel().getColumn(i).setCellRenderer(myRen);
continue;
}
myRen.setArg(myArg);//----denpending on this argument I fill the combo
myJTable.getColumnModel().getColumn(i).setCellRenderer(myRen);
}