Custom Cell Renderer

1

Возможно ли создать экземпляр пользовательского средства отображения ячеек и поместить в него разные значения для каждого столбца в зависимости от аргументов, данных ему?

Например:

Изображение 174551

У меня есть этот рендерер (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
            }

        }
    }
}
  • 1
    Должны ли мы угадать, как выглядит остальная часть вашего кода?
  • 0
    @MuratK. Проблема в том, что мой код очень длинный, на самом деле я использую 3 класса для создания этого средства визуализации, и средство визуализации правильно принимает аргументы, но не отображает его в выпадающем списке. Фактически средство визуализации принимает последнее значение средства визуализации и применить его ко всем столбцам. например, если в комбинированном отображении последнего colmun отображается [1, 2, 3], все столбцы принимают одинаковые значения!
Показать ещё 4 комментария
Теги:
tablecellrenderer

2 ответа

0
Лучший ответ

Ваша проблема в том, что вы используете один и тот же экземпляр MyCustomCellRender для всех столбцов. Это приведет к тому, что каждый столбец будет использовать тот же рендерер с последним параметром myArg, чтобы отображать ваши вещи. Что может помочь создать новый экземпляр MyCustomCellRenderer для каждого столбца.

Например:

for (int i = 0; i < table.nbColumns; i++) {
    MyCustomCellRenderer myRen = new MyCustomCellRenderer //now each column will use it own renderer instance
    //also: don't forget to set myArg
    myRen.setArg(myArg);
    myJTable.getColumnModel().getColumn(i).setCellRenderer(myRen);
}
  • 0
    но это сделает это приложение очень медленным, потому что я запускаю запрос SELECT каждый раз, когда создаю экземпляр, который пытаюсь избежать этого решения.
  • 0
    Вы можете выполнить запрос SELECT где-нибудь за пределами цикла один раз и сохранить его результат в списке или чем-то подобном.
Показать ещё 1 комментарий
0

В настоящее время вы перебираете все столбцы и всегда используете один и тот же "myarg". Есть несколько способов сделать это (трудно сказать вам лучший способ, не видя свой код), но ваш метод может принимать дополнительный параметр, например myarg2, а затем использовать оператор if (для проверки я == 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);
}
  • 0
    Я отредактировал свой вопрос.
  • 0
    @SlimenTunis мы можем видеть текущий класс MyCustomCellrenderer? Если это долго, просто возьмите подпись конструктора и метода
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню