2009-08-26 3 views
0

Я новичок в работе с JTables и затрудняюсь с тем, чтобы мой редактор JTable работал правильно.Странное мигание ячейки при выборе с помощью пользовательского редактора ячеек

У меня есть несколько пользовательских панелей со списками и кнопками. Для визуализации их в ячейке я использую настраиваемый PanelCellRenderer, который имеет различные конструкторы для каждого типа панели.

Чтобы сделать кнопки доступными, я создал этот простой PanelCellEditor, который расширяет DefaultCellEditor. Чтобы получить доступ к данным, хранящимся в ячейках во время редактирования, я передаю ссылку на PanelCellRenderer.

Проблема, с которой я столкнулась, заключается в том, что, когда я выбираю ячейку (щелкая на ней), из отображения списка с помощью кнопки выбранная ячейка становится полностью пустой. Когда ячейка будет отменена, список с данными и кнопка снова появятся. Любые советы по этому вопросу будут полезны. Благодарю.

public class PanelCellEditor extends DefaultCellEditor { 

    private PanelCellRenderer pcr; 
    private Object value; 

    public PanelCellEditor(final PanelCellRenderer pcr) { 
     super(new JCheckBox()); 
     this.pcr = pcr; 
     this.pcr.setOpaque(true); 

     if (pcr.firstPanel != null) { 

      pcr.firstPanel.Button.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        //do something 
        fireEditingStopped(); 
       } 
      }); 

      pcr.firstPanel.List.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue(); 
        //do something 
        fireEditingStopped(); 
       } 
      }); 
     } 
     else if (pcr.secondPanel != null) { 

      pcr.secondPanel.Button.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        //do something 
        fireEditingStopped(); 
       } 
      }); 

      pcr.secondPanel.List.addMouseListener(new MouseAdapter() { 
       public void mouseClicked(MouseEvent e) { 
        String value = (String) ((javax.swing.JList) e.getSource()).getSelectedValue(); 
        //do something 
        fireEditingStopped(); 
       } 
      }); 
     } 
    } 

    public Component getTableCellEditorComponent(JTable table, Object value, 
     boolean isSelected, int row, int column) { 

     //// if I comment this whole bit //// 
     if (isSelected) { 
      pcr.setForeground(table.getSelectionForeground()); 
      pcr.setBackground(table.getSelectionBackground()); 
     } else { 
      pcr.setForeground(table.getForeground()); 
      pcr.setBackground(table.getBackground()); 
     } 

     if (pcr.firstPanel != null) 
      pcr.firstPanel.list.setListData((String[])value); 
     else if (pcr.secondPanel != null) { 
      pcr.secondPanel.list.setListData((String[])value); 
     } 
     //////// nothing changes ///////// 

     this.value = value; 
     return pcr; 
    } 

    public Object getCellEditorValue() { 
     return value; 
    } 

    public boolean stopCellEditing() { 
     return super.stopCellEditing(); 
    } 

    protected void fireEditingStopped() { 
     super.fireEditingStopped(); 
    } 
} 

ответ

0

Вы можете проследить JTable.getTableCellEditor в свои объекты. Действительно ли вы зарегистрировали свой редактор со значением, которое он должен редактировать с помощью Jtable?