2010-05-14 2 views
0

Сделан на заказ ListCellRenderer:Пользовательского Java ListCellRenderer - Не могу нажать JCheckBox

import java.awt.Component; 
import javax.swing.JCheckBox; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.ListCellRenderer; 

/** 
* 
* @author Spencer 
*/ 
public class TaskRenderer implements ListCellRenderer { 

    private Task task; 

    private JPanel panel = new JPanel(); 
    private JCheckBox checkbox = new JCheckBox(); 
    private JLabel label = new JLabel(); 

    public TaskRenderer() { 
     panel.add(checkbox); 
     panel.add(label); 
    } 

    public Component getListCellRendererComponent(
      JList list, 
      Object value, 
      int index, 
      boolean isSelected, 
      boolean cellHasFocus) { 
     task = (Task) value; 
     label.setText(task.getName()); 
     return panel; 
    } 

} 

Have в JList с каждой ячейкой в ​​ней визуализируется с использованием указанного класса, но галочки в панелях для каждой ячейки не могут быть нажаты , Думал, что это связано с тем, что он не фокусируется. Есть идеи?

Спасибо, Спенсер

ответ

2

Ваш пользовательский рендерер просто регулирующий внешний вид содержимого JList, не добавляя каких-либо функций, таких, как способность изменять компоненты (флажок) - Imagine это просто как резиновый штамп используется для отображения каждой ячейки списка по очереди.

Я рекомендовал бы решить эту проблему:

  1. Используйте один столбец JTable вместо JList.
  2. Определите заказную реализацию TableModel путем подклассификации AbstractTableModel и переопределите getColumnClass (int), чтобы вернуть Boolean.class для столбца 0. Обратите внимание, что рендеринг по умолчанию теперь отобразит это как JCheckBox. Тем не менее, это не будет обозначать JCheckBox, как вам нужно.
  3. Добавить на заказ TableCellRenderer для булевых; например myTable.setCellRenderer (Boolean.class, новый MyLabelledCheckBoxRenderer());
  4. Добавить редактор для Booleans, используя что-то похожее на:. MyTable.setCellEditor (Boolean.class, новый DefaultEditor (новый JCheckBox ("включен)));
0

JIDE Common Layer имеет под лицензией GPL CheckBoxList В принципе он использует JPanel как средство визуализации ячеек с JCheckBox перед другим средством визуализации (которое вы можете установить сами) и обрабатывает события мыши/ключа.

Если вы действительно хотите придерживаться своего рендеринга JCheckBox, вы можете прослушивать мышь Имейте в виду, что, как заметил Адамски, средство визуализации ячеек - это штамп (Swing 101), поэтому вы должны всегда устанавливать флажок в выбранном состоянии i n getListCellRendererComponent(), в противном случае все ваши флажки будут иметь состояние сохранения.

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