我有三个复选框为行中的所有都得到选择三列,但我想选择一个,从该行。如果一个人选择对方是取消选择

问题描述:

我有行中的所有都得到选择了三个复选框为三列,但我想选择一个,从该行。如果一个人选择另外两个是取消选择....我有三个复选框为行中的所有都得到选择三列,但我想选择一个,从该行。如果一个人选择对方是取消选择

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class CheckABunch extends JPanel { 

    private static final int CHECK_COL = 2; 
    @SuppressWarnings("unused") 
    private static Object[][] DATA = new Object[1][1]; 
    private static final String[] COLUMNS = {"Number", "Present","Absent","Chk"}; 
    private DataModel dataModel ; 
    private JTable table; 
    private DefaultListSelectionModel selectionModel; 
    @SuppressWarnings("unused") 
    private static Integer cntrow = 0; 
    private static JCheckBox jc1,jc2,jc3; 



    public CheckABunch() { 
     super(new BorderLayout()); 

     //accessing data from database 

     final String driver = "com.mysql.jdbc.Driver"; 
     final String connection ="jdbc:mysql://localhost/search"; 
     final String user = "root"; 
     final String password = "root"; 

     Connection con; 
     Statement st; 
     ResultSet rs; 
     try { 
      Class.forName(driver); 
      con = DriverManager.getConnection(connection, user, password); 
      st = con.createStatement(); 
      rs = st.executeQuery("Select count(*) from test;"); 
      Object[][] DATA = new Object[1][1]; 
      if(rs.first()){ 
       DATA = new Object[rs.getInt(1)][COLUMNS.length]; 
       cntrow = rs.getInt(1); 
      } 

      rs = st.executeQuery("Select * from test;"); 
      int i = 0; 
      while (rs.next()) { 
        DATA[i][0] = rs.getString(2); 
        DATA[i][1] = new Boolean(false); 
        DATA[i][2] = new Boolean(false); 
        DATA[i][3] = new Boolean(false); 
        ++i; 
       } 
      dataModel = new DataModel(DATA, COLUMNS); 
      table = new JTable(dataModel); 
      /* 
      * for (int j = 0; j < columns.length; j++) { 
       System.out.println(columns[j]); 
      } 
      */ 
      this.add(new JScrollPane(table)); 
      this.add(new ControlPanel(), BorderLayout.PAGE_END); 
      table.setPreferredScrollableViewportSize(new Dimension(250, 175)); 
      selectionModel = (DefaultListSelectionModel) table.getSelectionModel(); 

      if (!con.isClosed()) { 
       con.close(); 
      } 
     }catch(Exception e){ 
      System.out.println(e); 
     } 


    } 

    private class DataModel extends DefaultTableModel { 

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

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      if (columnIndex == 1 || columnIndex == 2 || columnIndex == 3) { 
       return getValueAt(0, 1).getClass(); 
      } 
      return super.getColumnClass(columnIndex); 
     } 
     @Override 
     public boolean isCellEditable(int row, int column) { 
      return true; 
     } 
    } 

    //j panel for two buttons 
    private class ControlPanel extends JPanel { 

     public ControlPanel() { 
      this.add(new JLabel("Selection:")); 
      this.add(new JButton(new SelectionAction("Clear", false))); 
      this.add(new JButton(new SelectionAction("Check", true))); 
     } 
    } 


    private class SelectionAction extends AbstractAction { 

     boolean value; 

     public SelectionAction(String name, boolean value) { 
      super(name); 
      this.value = value; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      for (int i = 0; i < dataModel.getRowCount(); i++) { 
       if (selectionModel.isSelectedIndex(i)) { 
        dataModel.setValueAt(value, i, CHECK_COL); 
       } 
      } 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("CheckABunch"); 
     frame.add(new CheckABunch()); 
     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

这听起来像是**单选按钮的用例** –

+1

您应该为此使用单选按钮。如果用户需要从一组选项中选择一个,那么他们明确地在那里。 – PMF

不要使用JCheckBox的,而是用个JRadioButton,这里的关键是:添加所有单选按钮相同的ButtonGroup对象。

ButtonGroup buttonGroup = new ButtonGroup(); 
JPanel radioPanel = new JPanel(new GridLayout(1, 0)); 
for (int i = 0; i < stringArray.length; i++) { 
    JRadioButton radioButton = new JRadioButton(stringArray[i]); 
    radioPanel.add(radioButton); 
    buttonGroup.add(radioButton); 
} 

顺便说一句,其他问题与您的代码:

  • 你从来没有告诉我们有关您的问题的代码 - 在你创建并添加您的复选框。是的,我们看到你在哪里声明JCheckBox的变量,但没有代码,你用JCheckBox的对象或者你把它放在你的GUI初始化。
  • 另一方面,您正在显示很多与当前问题完全无关的代码,这会干扰我们理解您的问题的能力。
  • 您在上面的代码中过度使用了static访问修饰符,后面的代码可能会影响后续操作。例如,你的JCheckBox变量和你的DATA字段不应该是静态的。