2015-03-26 4 views
1

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

Например:

Calendar

У меня есть этот рендерер (MyCustomCellRenderer myRen = new MyCustomCellRenderer), и для каждого столбца я поставил другой аргумент, чтобы показать что-то difeerent в 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); 
} 

Как я могу сделать это?

Edit:

Похоже есть missunderstanding, у меня есть список аргументов, и я написал код, указанный выше в качестве примера.

Мой вопрос: Что следует писать в классе 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 класса для создания этого средства визуализации, и рендеринг правильно принимает аргументы, но он не отображает его в combobox. Фактически рендеринг принимает последнее значение rendere и применить его ко всем столбцам. например, если комбо последнего дисплея colmun [1, 2, 3] все столбцы принимают одинаковые значения! – SlimenTN

+0

Да, потому что вы перебираете все ячейки с тем же 'myArg' –

ответ

0

Ваша проблема в том, что вы используете один и тот же экземпляр 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); 
} 
+0

, но это сделает это приложение очень медленным, потому что я запускаю запрос SELECT каждый раз, когда создаю экземпляр, который я пытаюсь избежать этого решения. – SlimenTN

+0

Вы можете выполнить запрос SELECT где-то вне цикла один раз и сохранить его результат в List или что-то подобное. – wAy

+0

работает, thnx – SlimenTN

0

В настоящее время вы пробегаем по всем столбцам и всегда использовать тот же «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); 
} 
+0

Я отредактировал свой вопрос. – SlimenTN

+0

@SlimenTunis можно увидеть текущий класс MyCustomCellrenderer? Если это долго, просто возьмите подпись конструктора и метода – gudthing

+0

ОК всего минуту. – SlimenTN

Смежные вопросы