2015-06-26 30 views
2

我有一个JTable。它有四列;最后一列是复选框列。我想根据条件启用或禁用复选框。根据条件设置JTable单元禁用或启用?

考虑到最后一列值(复选框值)为true,则不允许用户取消选中该复选框。如果值为false,则允许用户选择复选框。

有什么办法吗?我试过表iscellEditable(),setRowSelectionAllowed()。但是,这些方法并不符合我的理念。

+0

请告诉我们你的代码,它会更容易回答 –

回答

2

基于此example,下面的代码基于该行的模型状态来规定isCellEditable()实现。一旦选中,一行就不能被取消选中。您可以根据需要使用合适的renderer更改这些行的外观,如here所示。

image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.table.DefaultTableModel; 

/** 
* @see https://stackoverflow.com/a/31082475/230513 
* @see https://stackoverflow.com/questions/7920068 
* @see https://stackoverflow.com/questions/4526779 
*/ 
public class CheckOnce extends JPanel { 

    private static final int CHECK_COL = 1; 
    private static final Object[][] DATA = { 
     {"One", Boolean.FALSE}, {"Two", Boolean.FALSE}, 
     {"Three", Boolean.FALSE}, {"Four", Boolean.FALSE}, 
     {"Five", Boolean.FALSE}, {"Six", Boolean.FALSE}, 
     {"Seven", Boolean.FALSE}, {"Eight", Boolean.FALSE}, 
     {"Nine", Boolean.FALSE}, {"Ten", Boolean.FALSE}}; 
    private static final String[] COLUMNS = {"Number", "CheckBox"}; 
    private DataModel dataModel = new DataModel(DATA, COLUMNS); 
    private JTable table = new JTable(dataModel); 

    public CheckOnce() { 
     super(new BorderLayout()); 
     this.add(new JScrollPane(table)); 
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     table.setPreferredScrollableViewportSize(
      new Dimension(250, 10 * table.getRowHeight())); 
    } 

    private class DataModel extends DefaultTableModel { 

     public DataModel(Object[][] data, Object[] columnNames) { 
      super(data, columnNames); 
     } 

     @Override 
     public void setValueAt(Object aValue, int row, int col) { 
      super.setValueAt(aValue, row, col); 
     } 

     @Override 
     public Class<?> getColumnClass(int col) { 
      if (col == CHECK_COL) { 
       return getValueAt(0, CHECK_COL).getClass(); 
      } 
      return super.getColumnClass(col); 
     } 

     @Override 
     public boolean isCellEditable(int row, int col) { 
      Object o = getValueAt(row, col); 
      boolean b = o instanceof Boolean && (Boolean) o; 
      return col == CHECK_COL && !b; 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("CheckOne"); 
     frame.add(new CheckOnce()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+1

谢谢,我自定义此代码为我的方便。现在它的工作正常。 – Thirunavukkarasu