首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

Swing中的JTable中添加Checkbox不能选中,该如何处理

2012-02-09 
Swing中的JTable中添加Checkbox不能选中JTable中的一列我渲染成了CheckBox,但是当鼠标点击后,不能显示出选

Swing中的JTable中添加Checkbox不能选中
JTable中的一列我渲染成了CheckBox,但是当鼠标点击后,不能显示出选中的状态。请高手帮忙解决一下啊。在线等!
JTable的model:

class EntitySynchroTableModel extends AbstractTableModel{
  private List<Boolean> checkBoxValues = new ArrayList<Boolean>();
  private List<ComparisonResultVO> datas;
  private List<ComparisonResultVO> selectdatas;
   
  public EntitySynchroTableModel(){
  datas = new ArrayList<ComparisonResultVO>();
  selectdatas = new ArrayList<ComparisonResultVO>();
  }
   
  public int getRowCount() {
  return datas == null ? 0 : datas.size();
  }

  public int getColumnCount() {
  return columns == null ? 0 : columns.length;
  }

  public Object getValueAt(int rowIndex, int columnIndex) {
  if(null==datas || rowIndex>datas.size()-1)
  return null;
  ComparisonResultVO tempVO = datas.get(rowIndex);
  if(getColumnName(columnIndex).equals(CHOOSE)){
  return this.checkBoxValues.get(rowIndex);
  }
  if(getColumnName(columnIndex).equals(CURNET_RESOURCE)){
  return tempVO.getLocalEntity();
  }
  if(getColumnName(columnIndex).equals(NOTE)){
  return tempVO.getNote();
  }
   
  for(Map.Entry<LocalNetVO,RemoteEntityStatusVO> entity : tempVO.getRemoteEntityMap().entrySet()){
  if(getColumnName(columnIndex).equals(entity.getKey().getFromNetlName())){
  return entity.getValue();
  }
  }
  return null;
  }
   
  public Class<?> getColumnClass(int columnIndex){
  if(getColumnName(columnIndex).equals(CHOOSE)){
  return Boolean.class;
  }
  if(getColumnName(columnIndex).equals(CURNET_RESOURCE))
  return BaseVO.class;
  for(LocalNetVO vo : localNetVOs){
  if(getColumnName(columnIndex).equals(vo.getFromNetlName()))
  return RemoteEntityStatusVO.class;
  }
  if(getColumnName(columnIndex).equals(NOTE)){
  return String.class;
  }
  return null;
  }
   
  public String getColumnName(int column){
  return columns == null ? "" : columns[column];
  }
   
  public void clear(){
  if(null != datas){
  datas.clear();
  fireTableDataChanged();
  }
  }
   
  public void setData(List<ComparisonResultVO> datas){
  this.datas = datas;
  this.checkBoxValues.clear();
  for(ComparisonResultVO result : datas){
  this.checkBoxValues.add(false);
  }
  fireTableDataChanged();
  }
   
  public void removeRow(int rowIndex){
  if(null != datas){
  datas.remove(rowIndex);
  fireTableDataChanged();
  }
  }
   
  public int getColumnIndexByName(String columnName){


  for(int i = 0 ; i < columns.length ; i++){
  if (columnName.equals(columns[i])){
  return i;
  }
  }
  return -1;
  }
   
  @Override
  public boolean isCellEditable(int rowIndex, int columnIndex) {
  if(this.getColumnName(columnIndex).equals(CHOOSE)){
  return true;
  }
  return false;
  }
  }

CheckBoxRenderer及Editor:

class CheckBoxRender extends JCheckBox implements TableCellRenderer {
  public CheckBoxRender(){
  super();
  }
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
  JCheckBox box = new JCheckBox();
  box.setHorizontalAlignment(JLabel.CENTER);
  box.setSelected(Boolean.TRUE.equals(value)); 
  return box;
  }
  }
   
  class CheckBoxEditor extends DefaultCellEditor {
  public CheckBoxEditor() {
  this(new JCheckBox());
  }
   
  public CheckBoxEditor(JCheckBox checkBox) {
  super(checkBox);
  checkBox.setHorizontalAlignment(JLabel.CENTER);
  }
  }

[解决办法]

Java code
    public class MyComboBoxRenderer extends JCheckBox implements TableCellRenderer {        public MyComboBoxRenderer() {            super();        }        public Component getTableCellRendererComponent(JTable table, Object value,                boolean isSelected, boolean hasFocus, int row, int column) {            if (isSelected) {                setForeground(table.getSelectionForeground());                super.setBackground(table.getSelectionBackground());            } else {                setForeground(table.getForeground());                setBackground(table.getBackground());            }            this.setSelected((Boolean)value);            return this;        }    }    public class MyComboBoxEditor extends DefaultCellEditor {        public MyComboBoxEditor() {            super(new JCheckBox());        }    }
[解决办法]
[code=Java][/code]
import java.awt.event.*; 
 import javax.swing.*; 
 import javax.swing.table.*; 
 import java.awt.*; 
 class JtableComboBoxTest extends JFrame
 { 
 private JTable table; 
 public JtableComboBoxTest(){ 
 String[] array=new String[11]; 
 for(int i=0;i <10;i++) 
 array[i]=""+(i+1); 
 array[10]="未选择"; 
 JComboBoxCellEditor editor=new JComboBoxCellEditor(array); 
 table=new JTable(new Object[][]{{"未选择",1},{"未选择",2},{"未选择",3},{"未选择",4},{"未选择",5},{"未选择",6}}, 
 new Object[]{"Column1","Column2"}); 
 TableColumnModel colModel=table.getColumnModel(); 
 colModel.getColumn(0).setCellEditor(editor); 
 this.add(new JScrollPane(table),BorderLayout.CENTER); 
 this.setSize(200,200); 
 this.setVisible(true); 
 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
 } 
 public static void main(String[] args)


 { 
 new JtableComboBoxTest(); 
  
 } 
 class JComboBoxCellEditor extends DefaultCellEditor 
 { 
 private Object needRemove=null;//下次点击JComboBox时,需要删除的选项 
 private Object needAdd=null;//下次点击JComboBox时,需要添加的选项 
 private Object value;//当前comboBox显示的值 
 private JComboBox comboBox=null; 
 public JComboBoxCellEditor(Object[] value){ 
 super(new JComboBox(value)); 
 } 
 public Component getTableCellEditorComponent(JTable table, Object value,
 boolean isSelected, int row, int column){ 
 if(comboBox==null){//初始化comboBox 
 comboBox=(JComboBox)super.getTableCellEditorComponent(table, value, isSelected, row, column); 
 comboBox.addItemListener(new ItemHandler());//添加事件监听 
 comboBox.setSelectedIndex(10); 
 } 
 this.value=value;//当前JComboBox显示的选项 
 if(needAdd!=null) 
 comboBox.addItem(needAdd); 
 if(needRemove!=null) 
 comboBox.removeItem(needRemove); 
 return comboBox; 
 } 
 private class ItemHandler implements ItemListener 
 { 
 public void itemStateChanged(ItemEvent e){ 
 needRemove=comboBox.getSelectedItem(); 
 //当JComboBox显示的选项与用户选择的选项不同时 
 //需要将原来的显示的选项加入JComoboBox 
 if(!comboBox.getSelectedItem().equals(value)&&!"未选择".equals(value)){ 
 needAdd=value; 
 } 
 else 
 needAdd=null; 
 }
 } 
 } 
 
 } 
看看 这个例子 希望对你 有帮助!

热点排行
Bad Request.