就是一个表里面带有一列JCheckBox,想通过监听JCheckBox,来获取对应行值行的值。小程序拿去就可以运行,大虾们帮我看看为什么监听不到呢?要是有更好的实现程序,提供给小弟更是不甚感激。紧急求救!!!
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;public class TestTableChange extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
JCheckBox cb1 = new JCheckBox();
JCheckBox cb2 = new JCheckBox();
JCheckBox cb3 = new JCheckBox();
cb1.addActionListener(new CheckBoxListener());
cb2.addActionListener(new CheckBoxListener());
cb3.addActionListener(new CheckBoxListener());
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{cb1,"01","语文"},{cb2,"02","数学"},{cb3,"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
//设置编辑器
column.setCellEditor(new DefaultCellEditor(new JCheckBox()));
//设置渲染器
column.setCellRenderer(new CheckBoxRenderer());
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
//CheckBoxRenderer 是一个自己编写的实现TableCellRenderer接口的类
class CheckBoxRenderer implements TableCellRenderer{
public JCheckBox chk;
public CheckBoxRenderer(){
this.chk = new JCheckBox();
}
//其中主要要实现这个函数
public Component getTableCellRendererComponent(JTable arg0, Object value, boolean isSelected, boolean arg3, int arg4, int arg5) {
this.chk.setSelected(Boolean.TRUE == value);
this.chk.setEnabled(isSelected);
this.chk.setHorizontalAlignment(JCheckBox.CENTER);
return this.chk;
}
}
class CheckBoxListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JCheckBox cb = (JCheckBox)e.getSource();
if(cb.isSelected()){
System.out.println("选择到了");
}
}
}
public static void main(String[] args) {
new TestTableChange();
}
}
你CheckBoxRenderer里的checkBox不是cb1,cb2,cb3啊.
你要么在renderer里注册下.
要么这样,因为我看你renderer里这样写:this.chk.setSelected(Boolean.TRUE == value);
那么当点击的时候把那个cell里的值直接改了,就在外面注册table的mouse单击事件,setValueAt()里放Boolean.TRUE或者Boolean.FALSE.不用注册checkbox的事件.
public class TestTableChange extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{new JCheckBox(),"01","语文"},{new JCheckBox(),"02","数学"},{new JCheckBox(),"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
//设置编辑器
column.setCellEditor(new DefaultCellEditor(new JCheckBox()));
//设置渲染器
column.setCellRenderer(new CheckBoxRenderer());
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
//CheckBoxRenderer 是一个自己编写的实现TableCellRenderer接口的类
class CheckBoxRenderer implements TableCellRenderer{
public JCheckBox chk;
public CheckBoxRenderer(){
this.chk = new JCheckBox();
this.chk.addActionListener(new CheckBoxListener());
}
//其中主要要实现这个函数
public Component getTableCellRendererComponent(JTable arg0, Object value, boolean isSelected, boolean arg3, int arg4, int arg5) {
this.chk.setSelected(Boolean.TRUE == value);
this.chk.setEnabled(isSelected);
this.chk.setHorizontalAlignment(JCheckBox.CENTER);
return this.chk;
}
}
class CheckBoxListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JCheckBox cb = (JCheckBox)e.getSource();
if(cb.isSelected()){
System.out.println("选择到了");
}
}
}
public static void main(String[] args) {
new TestTableChange();
}
}
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;public class TestTableChange extends JFrame implements ItemListener{
JScrollPane tsp;
JTable table;
JCheckBox cb1 = new JCheckBox();
JCheckBox cb2 = new JCheckBox();
JCheckBox cb3 = new JCheckBox();
JCheckBox[] boxes=new JCheckBox[3];
public TestTableChange(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {/* cb1.addActionListener(new CheckBoxListener());
cb2.addActionListener(new CheckBoxListener());
cb3.addActionListener(new CheckBoxListener());*/
cb1.addItemListener(this);
cb1.setName("cb1");
cb2.addItemListener(this);
cb2.setName("cb2");
cb3.addItemListener(this);
cb3.setName("cb3");
boxes[0]=cb1;
boxes[1]=cb2;
boxes[2]=cb3;
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{cb1,"01","语文"},{cb2,"02","数学"},{cb3,"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
//设置编辑器
column.setCellEditor(new DefaultCellEditor(new JCheckBox()));
//设置渲染器
column.setCellRenderer(new CheckBoxRenderer(boxes));
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
//CheckBoxRenderer 是一个自己编写的实现TableCellRenderer接口的类
class CheckBoxRenderer implements TableCellRenderer{
public JCheckBox chk;
private JCheckBox[] boxes;
public CheckBoxRenderer(){
// this.chk = new JCheckBox();
}
public CheckBoxRenderer(JCheckBox[] boxes){
this.boxes=boxes;
}
//其中主要要实现这个函数
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
chk=boxes[row];
chk.setSelected(Boolean.valueOf(value.toString()));
// chk.setEnabled(isSelected);
chk.setHorizontalAlignment(JCheckBox.CENTER);
return chk;
}
}
class CheckBoxListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("action");
JCheckBox cb = (JCheckBox)e.getSource();
if(cb.isSelected()){
System.out.println("选择到了");
}
}
}
public static void main(String[] args) {
new TestTableChange();
}
public void itemStateChanged(ItemEvent e) {
JCheckBox box=(JCheckBox)e.getItem();
System.out.println(box.getName()+" is selected");
}
}
这样试试看
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;public class csdntest{
public static void main(String[] args) {
TestTableChange f = new TestTableChange();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.show();
}
}
class TestTableChange extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
cb1.addActionListener(new CheckBoxListener());
cb2.addActionListener(new CheckBoxListener());
cb3.addActionListener(new CheckBoxListener());
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{cb1,"01","语文"},{cb2,"02","数学"},{cb3,"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
//设置编辑器
column.setCellEditor(new DefaultCellEditor(new JCheckBox()));
//设置渲染器
column.setCellRenderer(new CheckBoxRenderer());
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
//CheckBoxRenderer 是一个自己编写的实现TableCellRenderer接口的类
class CheckBoxRenderer implements TableCellRenderer{
public JCheckBox chk;
public CheckBoxRenderer(){
this.chk = new JCheckBox();
}
//其中主要要实现这个函数
public Component getTableCellRendererComponent(JTable arg0, Object value, boolean isSelected, boolean arg3, int arg4, int arg5) {
this.chk.setSelected(Boolean.TRUE == value);
this.chk.setEnabled(isSelected);
this.chk.setHorizontalAlignment(JCheckBox.CENTER);
return this.chk;
}
}
class CheckBoxListener implements ActionListener {
public CheckBoxListener(){
cb1.getSize();
}
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(source == cb1 && cb1.isSelected()){
System.out.println("选择到了");
}
if(source == cb2 && cb2.isSelected()){
System.out.println("选择到了");
}
if(source == cb3 && cb3.isSelected()){
System.out.println("选择到了");
}
}
}
private JCheckBox cb1 = new JCheckBox();
private JCheckBox cb2 = new JCheckBox();
private JCheckBox cb3 = new JCheckBox();
}
刚上完夜班,还是没解决,不过这样写好点,lz你那样写再好的机器也会崩的...
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;public class TestTableChange extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
JCheckBox cb1 = new JCheckBox();
JCheckBox cb2 = new JCheckBox();
JCheckBox cb3 = new JCheckBox();
//cb1.addActionListener(new CheckBoxListener());
//cb2.addActionListener(new CheckBoxListener());
//cb3.addActionListener(new CheckBoxListener());
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{cb1,"01","语文"},{cb2,"02","数学"},{cb3,"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
//设置编辑器
column.setCellEditor(new DefaultCellEditor(cb1));
//设置渲染器
column.setCellRenderer(new CheckBoxRenderer(cb1));
column.setCellRenderer(new CheckBoxRenderer(cb2));
column.setCellRenderer(new CheckBoxRenderer(cb3));
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
//CheckBoxRenderer 是一个自己编写的实现TableCellRenderer接口的类
class CheckBoxRenderer implements TableCellRenderer{
public JCheckBox chk;
public CheckBoxRenderer(JCheckBox chk){
this.chk = chk;
chk.addActionListener(new CheckBoxListener());
}
//其中主要要实现这个函数
public Component getTableCellRendererComponent(JTable arg0, Object value, boolean isSelected, boolean arg3, int arg4, int arg5) {
this.chk.setSelected(Boolean.TRUE == value);
this.chk.setEnabled(isSelected);
this.chk.setHorizontalAlignment(JCheckBox.CENTER);
return this.chk;
}
}
class CheckBoxListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JCheckBox cb = (JCheckBox)e.getSource();
if(cb.isSelected()){
System.out.println("选择到了");
}
}
}
public static void main(String[] args) {
new TestTableChange();
}
}
[/code]
恩,小弟学了2个月JAVA了,还是个菜鸟中的菜鸟,这个问题想了一天了,在网上也找了好久 ,一直没解决。写那个渲染器,和编辑器是为了能显示和编辑CHECKBOX,现在就是监听不到。或者如果能监听table的checkbox的那一列某个单元格是否被点击了(我发现只要点击到那一列的区域checkbox就响应了),好像麻烦点也能绕弯实现。可是小弟这方面也没搞明白。
现在急需有个给我改好的列子程序出现,期盼中。
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class TestTableChange2 extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange2(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{new Boolean(true),"01","语文"},{new Boolean(true),"02","数学"},{new Boolean(true),"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
public static void main(String[] args) {
new TestTableChange();
}
}
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;import javax.swing.DefaultCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;public class TestTableChange extends JFrame implements ItemListener{
JScrollPane tsp;
JTable table;
JCheckBox cb1 = new JCheckBox();
JCheckBox cb2 = new JCheckBox();
JCheckBox cb3 = new JCheckBox();
JCheckBox[] boxes=new JCheckBox[3];
public TestTableChange(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {/* cb1.addActionListener(new CheckBoxListener());
cb2.addActionListener(new CheckBoxListener());
cb3.addActionListener(new CheckBoxListener());*/
cb1.addItemListener(this);
cb1.setName("cb1");
cb2.addItemListener(this);
cb2.setName("cb2");
cb3.addItemListener(this);
cb3.setName("cb3");
boxes[0]=cb1;
boxes[1]=cb2;
boxes[2]=cb3;
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{cb1,"01","语文"},{cb2,"02","数学"},{cb3,"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(0);
//设置编辑器
column.setCellEditor(new DefaultCellEditor(new JCheckBox()));
//设置渲染器
column.setCellRenderer(new CheckBoxRenderer(boxes));
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
//CheckBoxRenderer 是一个自己编写的实现TableCellRenderer接口的类
class CheckBoxRenderer implements TableCellRenderer{
public JCheckBox chk;
private JCheckBox[] boxes;
public CheckBoxRenderer(){
// this.chk = new JCheckBox();
}
public CheckBoxRenderer(JCheckBox[] boxes){
this.boxes=boxes;
}
//其中主要要实现这个函数
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
chk=boxes[row];
chk.setSelected(Boolean.valueOf(value.toString()));
// chk.setEnabled(isSelected);
chk.setHorizontalAlignment(JCheckBox.CENTER);
return chk;
}
}
class CheckBoxListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("action");
JCheckBox cb = (JCheckBox)e.getSource();
if(cb.isSelected()){
System.out.println("选择到了");
}
}
}
public static void main(String[] args) {
new TestTableChange();
}
public void itemStateChanged(ItemEvent e) {
JCheckBox box=(JCheckBox)e.getItem();
System.out.println(box.getName()+" is selected");
for(int i=0;i<boxes.length;i++){
System.out.println(boxes[i].isSelected()?boxes[i].getName()+"当前被选中":boxes[i].getName()+"当前没有被选中");
}
}
}不知道你具体什么意思,看看吧
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class TestTableChange2 extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange2(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{new Boolean(true),"01","语文"},{new Boolean(true),"02","数学"},{new Boolean(true),"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
public static void main(String[] args) {
//这里有用的代码好像就是下面这么一句哦
//你根本就没有用到TestTableChange2类啊
//下面这个不还是用的以前那个类嘛......
new TestTableChange();
}
}
java -classpath $(JDBCHOME):TableExample.jar TableExample,冒号应该是分号。例下的命令是能够运行起来的,运行起来后还需要配置数据库,我使用的是mysql数据库java -cp D:\share\apache-tomcat-5.5.17\apache-tomcat-5.5.17\server\lib\mysql-connector-java-5.0.4-bin.jar;C:\Sun\AppServer\jdk\demo\jfc\TableExample\TableExample.jar TableExample配置数据库
Dataurl:
jdbc:mysql://127.0.0.1:3306/poentity?useUnicode=true&characterEncoding=gbk
Driver:
com.mysql.jdbc.Driver
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class TestTableChange2 extends JFrame {
JScrollPane tsp;
JTable table;
public TestTableChange2(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{new Boolean(true),"01","语文"},{new Boolean(true),"02","数学"},{new Boolean(true),"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
}
public static void main(String[] args) {
new TestTableChange2();
}
}
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;public class TestTableChange2 extends JFrame implements MouseListener{
JScrollPane tsp;
JTable table;
public TestTableChange2(){
this.setBounds(400, 400, 400, 400);
init();
this.setVisible(true);
}
private void init() {
String[] columnNames = {"选择情况","课程编号","课程名称"};
Object[][] obj = {{new Boolean(true),"01","语文"},{new Boolean(true),"02","数学"},{new Boolean(true),"03","历史"}};
DefaultTableModel model = new DefaultTableModel(obj,columnNames);
table = new JTable(model);
tsp = new JScrollPane(table);
this.add(tsp,BorderLayout.CENTER);
table.addMouseListener(this);
}
public static void main(String[] args) {
new TestTableChange2();
}
public void mouseClicked(MouseEvent e) {
int row=table.getSelectedRow();
int column=0;
System.out.println("第"+(row+1)+"行:"+table.getValueAt(row, column));
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}看看这是不是你需要的