JTable中的JCheckBox状态无法改变,也无法选中:下面是我的源代码,请热心的人帮助,自己查资料什么的弄了好久了,先谢了

时间:2022-09-05 08:03:29
public class TestSetRouterPane extends JPanel{

/**
 * @param args
 */
JTable testTable = new JTable() ;
JPanel sPanel = new JPanel() ;

static List routList = new ArrayList() ;
public TestSetRouterPane() {

DBManageFactory factory = new RouteManagerFactory() ;
final IBeanManager manager = factory.getDBManager() ;
routList  =  manager.getAll() ;
testTable.setModel(new RouterTableModel(
)) ;
testTable.getTableHeader().setReorderingAllowed(false) ;
testTable.getTableHeader().setResizingAllowed(false) ;

//表头的第一列设置为JCheckBox
final TableColumn column = testTable.getTableHeader().getColumnModel().getColumn(0) ;
testTable.getTableHeader().setBorder(BorderFactory.createLineBorder(Color.gray)) ;
final HeaderCellRenderer check = new HeaderCellRenderer() ;
column.setHeaderRenderer(check) ;

//将JCheckBox设置为可选的
testTable.getTableHeader().addMouseListener(new MouseAdapter() { 
@Override 
public void mouseClicked(MouseEvent e){ 
if(testTable.getColumnModel().getColumnIndexAtX(e.getX())==0){//如果点击的是第0列,即checkbox这一列 
JCheckBox Checkbox = (JCheckBox)check; 
boolean b = !check.isSelected(); 
check.setSelected(b);
testTable.getTableHeader().repaint(); 


}); 



//整个第一列的修饰
FirstColumnCellRender columnCheck = new FirstColumnCellRender() ;
testTable.getColumnModel().getColumn(0).setCellRenderer(columnCheck) ;
columnCheck.setHorizontalAlignment(JLabel.CENTER);



sPanel.setLayout(new BorderLayout()) ;
JScrollPane scrollPane = new JScrollPane(testTable) ;
sPanel.add(scrollPane, BorderLayout.CENTER) ;
add(sPanel, BorderLayout.CENTER) ;

}


class FirstColumnCellRender extends JCheckBox implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {

// TODO Auto-generated method stub
if(((RouteBean)(routList.get(row))).getGateway().equals("直连")){
return null ;
} else {
return this  ;
}

}
}

public static void main(String[] args) {
// TODO Auto-generated method stub

JFrame frame = new JFrame () ;
JPanel panel = new TestSetRouterPane() ;
frame.add(panel) ;
frame.setSize(800, 600) ;
frame.setVisible(true) ;
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
}

}

class RouterTableModel extends DefaultTableModel {
    
private static final long serialVersionUID = 1L;
public int getColumnCount() {

// TODO Auto-generated method stub
return 6;
}

public int getRowCount() {
// TODO Auto-generated method stub
return TestSetRouterPane.routList.size() ;
}

public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
switch (columnIndex) {

case 1 :
return ((RouteBean)TestSetRouterPane.routList.get(rowIndex)).getId()+ ""  ; 
case 2 :
return ((RouteBean)TestSetRouterPane.routList.get(rowIndex)).getDestination();
case 3 :
return PortConfigPane.intToString(((RouteBean)TestSetRouterPane.routList.get(rowIndex)).getSubnetMask()) ;
case 4 :
return ((RouteBean)TestSetRouterPane.routList.get(rowIndex)).getGateway() ;
case 5 :
return ((RouteBean)TestSetRouterPane.routList.get(rowIndex)).getInterFace();
default : 
return null ;
}
}

public String getColumnName(int c) {
// TODO Auto-generated method stub
switch(c)
{
case 0 :
return "false" ;
case 1 :
return "序号" ;
case 2 :
return "目的" ;
case 3 :
return "子网掩码" ;
case 4 :
return "网关" ;
case 5 :
return "接口" ;
default :
return super.getColumnName(c) ;
}
}
public boolean isCellEditable(int row, int column) {
return false ;
}

}
class HeaderCellRenderer extends JCheckBox implements TableCellRenderer {

public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean arg3, int row, int arg5) {

// TODO Auto-generated method stub

setHorizontalAlignment(JLabel.CENTER); 
       
return this ;
}
}

11 个解决方案

#1


 public boolean isCellEditable(int row, int column) {
        return false;
    }

单元格都无法编辑,这里有问题

#2


@coolrain82谢谢您,不知道该怎么修改?

#3


public boolean isCellEditable(int row, int column)
{
if (column==0) {
return true;
}
return false;
}
这样修改下,试试。

#4


界面部分没有问题的,可以选中并改变状态。

#5


@switkid我这样试过了,可以选择了,但是在JCheckBox上面不出现选中的那个对号?
@my_panpan如何改变状态?

#6


@switkid 这个函数中的true或者false貌似对界面的结果就没啥影响,是不是因为我在getValue函数中设置了第一列的返回值的原因?

#7


可以肯定的是界面部分完全没有问题,这个你可屏蔽掉业务证实,你可以尝试调试下看是不是其中的业务数据部分出现异常了?

#8


//获取鼠标点击的行的位置(及行数)
Point mousepoint =e.getPoint();
System.out.println("获取鼠标点击的行的位置(及行数"+tab.rowAtPoint(mousepoint));


testTable.getTableHeader().addMouseListener(new MouseAdapter() { 
@Override 
public void mouseClicked(MouseEvent e){ 
Point mousepoint =e.getPoint();
if(tab.rowAtPoint(mousepoint)&&columnAtPoint(mousepoint) ==0){//如果点击的是第0行第0列checkbox这一列 
JCheckBox Checkbox = (JCheckBox)check; 
boolean b = !check.isSelected(); 
check.setSelected(b);
testTable.getTableHeader().repaint(); 


}); 


你应该是没有获取到选择行列的对象 所以你一直不可以选择;

#9


引用 8 楼 w5167839 的回复:
//获取鼠标点击的行的位置(及行数)
Point mousepoint =e.getPoint();
System.out.println("获取鼠标点击的行的位置(及行数"+tab.rowAtPoint(mousepoint));


testTable.getTableHeader().addMouseListener(new MouseAdapter() { 
@Override 
public void mouseClicked(MouseEvent e){ 
Point mousepoint =e.getPoint();
if(tab.rowAtPoint(mousepoint)&&columnAtPoint(mousepoint) ==0){//如果点击的是第0行第0列checkbox这一列 
JCheckBox Checkbox = (JCheckBox)check; 
boolean b = !check.isSelected(); 
check.setSelected(b);
testTable.getTableHeader().repaint(); 


}); 


你应该是没有获取到选择行列的对象 所以你一直不可以选择;

您指出的是表头的选择,我现在表头的第一列实现了可以选择,但是表的第一列不可以选择

#10



tab.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(new JCheckBox()));//可编辑复选框
tab.getColumnModel().getColumn(4).setCellRenderer(new TestTableCellRenderer1());
//渲染成复选框的形式;
//这两步不写,复选框就显示不了;
//重写getTableCellRandererComponent方法;你出错的地方,没有将你点击复选框的动作,获取且操作;
class TestTableCellRenderer1 extends JCheckBox implements TableCellRenderer{

@Override
public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) {
System.out.println("value -:"+value+"-");
//value是点击返回的值;
if((boolean)value){
this.setSelected(true);
}else{
this.setSelected(false);
}

return this;
}

}

你把改变状态的操作写在了MouseListener中,但是它没有监听到你要的动作,正确的要在getTableCellRendererComponent()中,而你这个里面没有操作,所以你选不中也改变不了,

#11


解决了,虽然是自己找到了方法,还是谢谢大家的帮助,方法就是使用DefaultModel:
class StrategyTableModel extends  DefaultTableModel {

public StrategyTableModel(String[] columnNames, Object[][] cells) {
super(cells, columnNames) ;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass() ;
}
}
想办法吧自己的数据写成这种集合的形式

#1


 public boolean isCellEditable(int row, int column) {
        return false;
    }

单元格都无法编辑,这里有问题

#2


@coolrain82谢谢您,不知道该怎么修改?

#3


public boolean isCellEditable(int row, int column)
{
if (column==0) {
return true;
}
return false;
}
这样修改下,试试。

#4


界面部分没有问题的,可以选中并改变状态。

#5


@switkid我这样试过了,可以选择了,但是在JCheckBox上面不出现选中的那个对号?
@my_panpan如何改变状态?

#6


@switkid 这个函数中的true或者false貌似对界面的结果就没啥影响,是不是因为我在getValue函数中设置了第一列的返回值的原因?

#7


可以肯定的是界面部分完全没有问题,这个你可屏蔽掉业务证实,你可以尝试调试下看是不是其中的业务数据部分出现异常了?

#8


//获取鼠标点击的行的位置(及行数)
Point mousepoint =e.getPoint();
System.out.println("获取鼠标点击的行的位置(及行数"+tab.rowAtPoint(mousepoint));


testTable.getTableHeader().addMouseListener(new MouseAdapter() { 
@Override 
public void mouseClicked(MouseEvent e){ 
Point mousepoint =e.getPoint();
if(tab.rowAtPoint(mousepoint)&&columnAtPoint(mousepoint) ==0){//如果点击的是第0行第0列checkbox这一列 
JCheckBox Checkbox = (JCheckBox)check; 
boolean b = !check.isSelected(); 
check.setSelected(b);
testTable.getTableHeader().repaint(); 


}); 


你应该是没有获取到选择行列的对象 所以你一直不可以选择;

#9


引用 8 楼 w5167839 的回复:
//获取鼠标点击的行的位置(及行数)
Point mousepoint =e.getPoint();
System.out.println("获取鼠标点击的行的位置(及行数"+tab.rowAtPoint(mousepoint));


testTable.getTableHeader().addMouseListener(new MouseAdapter() { 
@Override 
public void mouseClicked(MouseEvent e){ 
Point mousepoint =e.getPoint();
if(tab.rowAtPoint(mousepoint)&&columnAtPoint(mousepoint) ==0){//如果点击的是第0行第0列checkbox这一列 
JCheckBox Checkbox = (JCheckBox)check; 
boolean b = !check.isSelected(); 
check.setSelected(b);
testTable.getTableHeader().repaint(); 


}); 


你应该是没有获取到选择行列的对象 所以你一直不可以选择;

您指出的是表头的选择,我现在表头的第一列实现了可以选择,但是表的第一列不可以选择

#10



tab.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(new JCheckBox()));//可编辑复选框
tab.getColumnModel().getColumn(4).setCellRenderer(new TestTableCellRenderer1());
//渲染成复选框的形式;
//这两步不写,复选框就显示不了;
//重写getTableCellRandererComponent方法;你出错的地方,没有将你点击复选框的动作,获取且操作;
class TestTableCellRenderer1 extends JCheckBox implements TableCellRenderer{

@Override
public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) {
System.out.println("value -:"+value+"-");
//value是点击返回的值;
if((boolean)value){
this.setSelected(true);
}else{
this.setSelected(false);
}

return this;
}

}

你把改变状态的操作写在了MouseListener中,但是它没有监听到你要的动作,正确的要在getTableCellRendererComponent()中,而你这个里面没有操作,所以你选不中也改变不了,

#11


解决了,虽然是自己找到了方法,还是谢谢大家的帮助,方法就是使用DefaultModel:
class StrategyTableModel extends  DefaultTableModel {

public StrategyTableModel(String[] columnNames, Object[][] cells) {
super(cells, columnNames) ;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass() ;
}
}
想办法吧自己的数据写成这种集合的形式