2015-07-10 146 views
1

我有一個JTable,它有3列,前兩列是複選框。我已經通過覆蓋DefaultTableModel將它們複選框。就像這樣:僅當選中複選框時,JTable複選框纔會更改

tableData = new DefaultTableModel(columnNames, 0) { 
     /** 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      if (columnIndex == 0 || columnIndex == 1) 
       return Boolean.class; 
      return super.getColumnClass(columnIndex); 
     } 
} 

我的問題是,如果你在單元格中的任意位置單擊該複選框將選中或取消選中。我希望它只在盒子本身被點擊時纔會這樣做。

我的確看到了做這個的其他選項,但他們需要一個不同的方法來創建表格中的複選框。有沒有簡單的方法來實現這一點,保持我已經開始的方法?

+0

我這一點,我在這裏發碼那畫ROLL_OVER爲JCheckBox的幾次,那麼JCheckBox的焦點必須有代碼行,或者可以在這裏解決。 – mKorbel

+0

爲什麼你想讓你的應用程序更少用?用戶會喜歡更廣泛的區域來點擊。 –

+0

那麼這將是因爲附近的列實際上選擇的項目,所以我認爲這將是令人討厭的嘗試選擇項目...而是改變一個複選框的值。 –

回答

2

JPanel的中心爲JTable的默認設置也許一個JCheckBoxBooleanTableCellEditor可能比較簡單:

import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class CheckBoxPanelCellTest { 
    private JComponent makeUI() { 
    String[] columnNames = {"String", "Boolean"}; 
    Object[][] data = { 
     {"AAA", true}, {"bbb", false} 
    }; 
    DefaultTableModel model = new DefaultTableModel(data, columnNames) { 
     @Override public Class<?> getColumnClass(int column) { 
     if (column == 1) { 
      return Boolean.class; 
     } 
     return super.getColumnClass(column); 
     } 
     @Override public boolean isCellEditable(int row, int column) { 
     return column == 1; 
     } 
    }; 
    JTable table = new JTable(model) { 
     @Override public void updateUI() { 
     setDefaultEditor(Boolean.class, null); 
     super.updateUI(); 
     setDefaultEditor(Boolean.class, new CheckBoxPanelEditor()); 
     } 
    }; 
    table.setRowHeight(24); 
    table.setRowSelectionAllowed(true); 
    table.setShowVerticalLines(false); 
    table.setIntercellSpacing(new Dimension(0, 1)); 
    table.setFocusable(false); 
    return new JScrollPane(table); 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override public void run() { 
     createAndShowGUI(); 
     } 
    }); 
    } 
    public static void createAndShowGUI() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    f.getContentPane().add(new CheckBoxPanelCellTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 

class CheckBoxPanelEditor extends AbstractCellEditor implements TableCellEditor { 
    private final JPanel p = new JPanel(new GridBagLayout()); 
    private final JCheckBox checkBox = new JCheckBox(); 
    public CheckBoxPanelEditor() { 
    super(); 
    checkBox.setOpaque(false); 
    checkBox.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent e) { 
     fireEditingStopped(); 
     } 
    }); 
    p.add(checkBox); 
    p.setBorder(BorderFactory.createEmptyBorder(0, 1, 0, 0)); 
    } 
    @Override public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column) { 
    checkBox.setSelected(Objects.equals(value, Boolean.TRUE)); 
    p.setBackground(table.getSelectionBackground()); 
    return p; 
    } 
    @Override public Object getCellEditorValue() { 
    return checkBox.isSelected(); 
    } 
}