Swing中的JTable中添加Checkbox不能选中
场景:Swing中的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);
}
}
------解决方案--------------------
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;
}
}
}
}
看看 这个例子 希望对你 有帮助!