2015-06-26 2 views
2

У меня есть JTable. Он имеет четыре столбца; последний столбец - столбец флажка. Я хочу, чтобы флажок был включен или отключен, исходя из условия.Установить JTable Cell Отключить или Включить на основе условия?

Учтите, что последнее значение столбца (значение флажка) истинно, тогда пользователю не разрешено снимать флажок. если значение ложно, тогда пользователю разрешено устанавливать флажок.

Есть ли способ? Я попробовал таблицу 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