小弟近期正在用Swing做一个小工具。遇到一个恼人的问题!
应用场景是这样的.如图所示:
[img]http://dl.iteye.com/upload/attachment/166734/39bcacf0-3531-3303-a84a-745d8e3a0831.jpg[/img]
在表格内显示任务,每条任务对应表格内的一行。
重写了TableCellRenderer,表格的最后两列为进度条和按钮。
通过选中的rowIndex和columnIndex来确定用户点击了按钮所在的单元格。
如果鼠标点选到了"按钮单元格"则 禁用该按钮。
代码如下:
[code="java"]
private void tbl_taskMouseClicked(java.awt.event.MouseEvent evt) {
JTable table= (JTable) evt.getSource();
int colIndex=table.getSelectedColumn();
int rowIndex=table.getSelectedRow();
if(colIndex==4){//如果鼠标点击的单元格为“按钮单元格”
System.out.println("按钮坐标:"+rowIndex+"-"+colIndex);
//获取该单元格的CellRenderer 并 cast to MyTableRenderer
// (MyTableRenderer 是一个继承了JButton实现了TableCellRenderer接口的renderer)
MyTableRenderer mtb=(MyTableRenderer) table.getCellRenderer(rowIndex, colIndex);
mtb.setEnable(false);
}
}
[/code]
以上代码成功通过编译,但问题也随之出现了。
点击第1行的“按钮单元格”,此时该按钮单元格不变灰。此时再点击第2行的“按钮单元格”之后,第一行和第二行的单元格被一起
置灰了..情形如同window内按住"shift"在选择文件的时候出现部分全选的情况。
但我想达到的目的是点选了哪个“按钮单元格”,就让该“按钮单元格”禁用。
[code="java"]
//难道这样定位到的不是唯一一个Cell?还是说跟jtable的select机制发生了冲突?
MyTableRenderer mtb=(MyTableRenderer) table.getCellRenderer(rowIndex, colIndex);
mtb.setEnable(false);
[/code]
同样 ,在设置progressbar的时候也出现这样的问题。。切换界面的时候又发现所有按钮单元格全部置灰。
求教!
[b]问题补充:[/b]
fangfumin 提供的问题解答没法完成。
JButton obj =(JButton)jTable.getValueAt(row, col);
这个无法强制转换成JButton,getValueAt()方法是取得坐标上的值。
package com.huawei.test;
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
public class TestCellEdit implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
JButton but =null;
if(value instanceof JButton)
{
but = (JButton)value;
}
return but==null?new JButton():but;
}
}
table.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
JTable jTable = (JTable)e.getSource();
int row = jTable.getSelectedRow();
int col = jTable.getSelectedColumn();
JButton obj =(JButton)jTable.getValueAt(row, col);
obj.setEnabled(false);// 将按钮设置为不可以使用
jTable.updateUI(); // 刷新表格
}
});
你可以在想表格中添加的时候,添加成new JButton("but4"),然后在写一个类实现TableCellRenderer接口,将数据转换成Button;我把我做的例子给你看下
package com.huawei.test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTable;
public class Test1 extends JFrame
{
/**
*
*/
private static final long serialVersionUID = -6884547763599055532L;
JTable table = null;
public Test1()
{
Vector title =new Vector();
title.add("标题");
Vector<JButton> te = new Vector<JButton>();
Vector<Vector<JButton>> content = new Vector<Vector<JButton>>();
te.add(new JButton("but0"));
content.add(te);
te = new Vector<JButton>();
te.add(new JButton("but1"));
content.add(te);
te = new Vector<JButton>();
te.add(new JButton("but2"));
content.add(te);
te = new Vector<JButton>();
te.add(new JButton("but3"));
content.add(te);
te = new Vector<JButton>();
te.add(new JButton("but4"));
content.add(te);
table = new JTable(content,title);
// table.getColumn("标题").setCellEditor(new DefaultTableCellEdit());
table.getColumn("标题").setCellRenderer( new TestCellEdit());
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JTable jTable = (JTable)e.getSource();
int row = jTable.getSelectedRow();
int col = jTable.getSelectedColumn();
JButton obj =(JButton)jTable.getValueAt(row, col);
obj.setEnabled(false);
jTable.updateUI();
}
});
Container cont = this.getContentPane();
cont.setLayout(new BorderLayout());
cont.add(table,BorderLayout.CENTER);
this.setSize(500, 500);
this.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
public static void main(String[] args)
{
Test1 t = new Test1();
t.setVisible(true);
}
}
你运行下,就可以看到了