jtable的行数由while(rs.next()) {......}确定,现在要设某列为单选按钮编辑,在这列中,只能单选一个,请问怎样做?

解决方案 »

  1.   

    设某列为单选按钮,
    JTable table=new JTable();
    TableColumn selection=table.getColumn("selection");
    selection.setCellRenderer(new BulbRenderer());
    selection.setCellEditor(new BulbEditor());
    .................
    ...................
    .....................
    //BulbRenderer 绘制球状按钮
    class BulbRenderer extends DefaultTableCellRenderer{
    private ImageIcon darkBulb=new ImageIcon ("button.jpg"),
                      brightBulb=new ImageIcon ("button.jpg");
    public BulbRenderer (){
    setHorizontalAlignment(JLable.CENTER);
    }
    public Component getTableCellRendererComponent(
    JTable table,Object value,boolean isSelected,boolean hasFocus,int row ,int col){
    Boolean b=(Boolean)value;
    setlcon(b.booleanValue()?brightBulb:darkBulb);
    return this;
    }
    }
    //显示一个闪亮的球状按钮
    class BulbEditor{
    BulbRenderer  render =new BulbRenderer ();
    public BulbEditor(){
    render.addMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent e){
    SwingUtilities.invokeLater(new Runnable(){
    public void run(){
    setCellEditorValue(Boolean.TURE);
    fireEditingStopped();
    }
    });
    }
    });
    }
    public Component getTableCellRendererComponent(
    JTable table,Object value,boolean isSelected,int row ,int col){
    return render.getTableCellRendererComponent(
    Jtable,value,true,true, row ,col);
    }
    }
      

  2.   

    setCellEditorValue(Boolean.TURE);这一句有错误,是否要新建这个方法?怎么写?
    有没有人用jradiobutton,buttongroup做成功的?
      

  3.   

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import javax.swing.tree.*;
    import java.awt.event.MouseEvent;
    import java.util.EventObject; 
    abstract public class AbstractCellEditor 
    implements TableCellEditor {
    protected EventListenerList listenerList = 
    new EventListenerList();
    protected Object value;
    protected ChangeEvent changeEvent = null;
    protected int clickCountToStart = 1;public Object getCellEditorValue() {
    return value;
    }
    public void setCellEditorValue(Object value) {
    this.value = value;
    }
    public void setClickCountToStart(int count) {
    clickCountToStart = count;
    }
    public int getClickCountToStart() {
    return clickCountToStart;
    }
    public boolean isCellEditable(EventObject anEvent) {
    if (anEvent instanceof MouseEvent) {
    if (((MouseEvent)anEvent).getClickCount() < 
    clickCountToStart)
    return false;
    }
    return true;
    }
    public boolean shouldSelectCell(EventObject anEvent) {
    return true;
    }
    public boolean stopCellEditing() {
    fireEditingStopped();
    return true;
    }
    public void cancelCellEditing() {
    fireEditingCanceled();
    }
    public void addCellEditorListener(CellEditorListener l) {
    listenerList.add(CellEditorListener.class, l);
    }
    public void removeCellEditorListener(CellEditorListener l) {
    listenerList.remove(CellEditorListener.class, l);
    }
    protected void fireEditingStopped() {
    Object[] listeners = listenerList.getListenerList();
    for (int i = listeners.length-2; i>=0; i-=2) {
    if (listeners[i] == CellEditorListener.class) {
    if (changeEvent == null)
    changeEvent = new ChangeEvent(this);
    ((CellEditorListener)
    listeners[i+1]).editingStopped(changeEvent);

    }
    }
    protected void fireEditingCanceled() {
    Object[] listeners = listenerList.getListenerList();
    for (int i = listeners.length-2; i>=0; i-=2) {
    if (listeners[i]==CellEditorListener.class) {
    if (changeEvent == null)
    changeEvent = new ChangeEvent(this);
    ((CellEditorListener)
    listeners[i+1]).editingCanceled(changeEvent);

    }
    }
    }
      

  4.   

    class BulbEditor extends AbstractCellEditor {
    ………………………………………………
    我给你的demo是从一个项目中截取的,是有关某列为单选按钮的代码
      

  5.   

    class BulbEditor 必须实现
    public Component getTableCellEditorComponent(JTable arg0, Object arg1, 
                boolean arg2, int arg3, int arg4) {
            // TODO 自动生成方法存根
            return null;
        }  而你给的代码中没有,
    abstract public class AbstractCellEditor 需要改类名,改为了SingleCellEditor
    用你的代码试了一下,鼠标点击没任何反应。
    给这列初始化值,应该怎么写,我给的是new Boolean(false)
      

  6.   

    //扩展AbstractTableModel
    class StereoDeckModel extends AbstractTableModel {
    String[] columnNames = {
    "In Use", "Manufacturer"
    };
    Object[][] data = {
    { Boolean.FALSE, "Sony"}, { Boolean.FALSE, "Phillips"}, { Boolean.TRUE, "Kenwood"}, { Boolean.FALSE, "Blaupunkt"}, { Boolean.FALSE, "Akai"}, { Boolean.FALSE, "Sony"}, { Boolean.FALSE, "Kenwood"}, 
    };
    public Object getValueAt(int row, int col) {
    return data[row][col];
    }
    public int getRowCount() { 
    return data.length; 
    }
    public int getColumnCount() { 
    return columnNames.length;
    }
    public String getColumnName(int col) {
    return columnNames[col];
    }
    public Class getColumnClass(int col) {
    return data[0][col].getClass();
    }
    public void setValueAt(Object value, int row, int col) {
    data[row][col] = value;
    fireTableCellUpdated(row, col);
    }
    public boolean isCellEditable(int row, int col) {
    Class cls = getColumnClass(col);
    String name = getColumnName(col);return (cls == Boolean.class && !name.equals("Dolby")) ||
    cls == Integer.class || cls == Double.class;
    }
    public void updateBulbs(int selectedRow) {
    for(int r=0; r < getRowCount(); ++r) {
    data[r][0] = new Boolean(r == selectedRow);
    }
    }
    }
      

  7.   

    //创建测试类
    public class Test extends JFrame {
    JTable table = new JTable(new StereoDeckModel());public Test() {
    initializeInUseColumn();
    //sizeColumns();table.setSelectionMode(
    ListSelectionModel.SINGLE_SELECTION);table.getSelectionModel().addListSelectionListener(
    new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent e) {
    StereoDeckModel model = 
    (StereoDeckModel)table.getModel(); if(!e.getValueIsAdjusting()) {
    model.updateBulbs(table.getSelectedRow());
    }
    }
    });
    getContentPane().add(new JScrollPane(table),
    BorderLayout.CENTER);
    }
    private void initializeInUseColumn() {
    TableColumn inUseColumn = table.getColumn("In Use");inUseColumn.setCellRenderer(new BulbRenderer());
    inUseColumn.setCellEditor(new BulbEditor());
    }
    public static void main(String args[]) {
    GraphicJavaApplication.launch(
    new Test(), "Car Stereo Deck", 300,300,559,368);
    }
    }
    class GraphicJavaApplication extends WindowAdapter {
    public static void launch(final JFrame f, String title,
    final int x, final int y, 
    final int w, int h) {
    f.setTitle(title);
    f.setBounds(x,y,w,h);
    f.setVisible(true);f.setDefaultCloseOperation(
    WindowConstants.DISPOSE_ON_CLOSE);f.addWindowListener(new WindowAdapter() {
    public void windowClosed(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    }
      

  8.   

    //创建绘制器
    class BulbRenderer extends DefaultTableCellRenderer {
    private ImageIcon darkBulb = new ImageIcon("C:/expand.gif.gif"),
    brightBulb = new ImageIcon("C:/fly.gif");public BulbRenderer() {
    setHorizontalAlignment(JLabel.CENTER);
    }
    public Component getTableCellRendererComponent(
    JTable table, Object value,
    boolean isSelected,
    boolean hasFocus,
    int row, int col) {
    Boolean b = (Boolean)value;
    setIcon(b.booleanValue() ? brightBulb : darkBulb);
    return this;
    }
    }
      

  9.   

    测试了一下,选择好像没什么规律,会同时选中几个,
    有没一个完整的,测试成功的,在行数不确定的jtable中,设某列为单选按钮的代码?
      

  10.   

    我这个demo的行是确定的,你可以给改成不确定的,而BulbRenderer 和BulbEditor 是对TableColumn selection的绘制和编辑,与其他列没有关系,你是不是没有jtable的相关资料啊,把邮箱给我,我发份资料给你,你先看看吧
      

  11.   

    thanks.给个完整的例子看看,有没用jradiobutton做的?