добавить jcheckBox в Jtable с помощью графического интерфейса

после поиска в google и stackoverflow и просмотра некоторых ответов я все еще не могу решить эту проблему.

у меня есть jtable, и я заполняю его из базы данных (derpy-JDBC). я хочу добавить флажок в свою jtable с помощью графического интерфейса.. я изменил тип столбца на логический и добавил эти строки

JCheckBox checkBox = new javax.swing.JCheckBox();
jTable1.getColumn("status").setCellEditor(new DefaultCellEditor(checkBox));

но это не работает правильно. это моя попытка

public class showp1 extends javax.swing.JFrame implements  ActionListener  {

    /** Creates new form showp1 */
    public showp1() {
        initComponents();
        this.setLocationRelativeTo(null);
        jButton1.addActionListener(this);
        jButton2.addActionListener(this);
      jTextField1.addActionListener(this);

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jTextField1 = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "id", "area", "location", "status"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Boolean.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jScrollPane1.setViewportView(jTable1);

        jButton1.setText("jButton1");

        jButton2.setText("jButton2");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 320, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(jButton1)
                            .addGap(73, 73, 73)
                            .addComponent(jButton2)
                            .addGap(166, 166, 166))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))))
                .addGap(10, 10, 10))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addGap(64, 64, 64))
        );

        pack();
    }// </editor-fold>                        

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  

       myDbConnection dbconnect;
        // TODO add your handling code here:


               ArrayList<String> list = new ArrayList<String>();
        try {

         dbconnect = new myDbConnection();
            ResultSet resultSet =null;
            resultSet = dbconnect.excuteQuery("SELECT id, area,location, status1 FROM pledges ");



                while (resultSet.next()){
                   list.add(resultSet.getString(1));
                    list.add(resultSet.getString(2));
                    list.add(resultSet.getString(3));
                    list.add(resultSet.getString(4));
                }


        } catch (Exception e) {
            System.out.println(e);
        }

        Object[][] record;

        int myListCount = list.size()/4;
        record = new Object[myListCount][4];
        int count = 1;
       // JCheckBox checkBox = new javax.swing.JCheckBox();
        for (int ii = 1; ii<=myListCount;ii++) {
            for(int i=1;i<=4;i++){
                record[ii-1][i-1] = list.get(count-1);
                count++;

            }

        }
        //TableColumnModel columnModel = jTable1.getColumnModel();
         //columnModel.getColumn(3).setCellEditor(new DefaultCellEditor(checkBox));

        jTable1.setModel(new DefaultTableModel(record, new String[]{"id", "area", "location","status1"}) {
        @Override
     public Class<?> getColumnClass(int columnIndex) {
        if (getColumnName(columnIndex).equals("status1")) {
           return Boolean.class;
        }
        return super.getColumnClass(columnIndex);
     }
  });


 public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new showp1().setVisible(true);
            }
        });
} }

извините за этот ужасный код ^^" заранее спасибо


person m.basleem    schedule 20.04.2011    source источник
comment
Хорошо, попробуйте проверить мой пост о том, как добавить JToggleButton к каждой строке в JTable. В моем примере кода я поместил один столбец с логическим типом. Он говорит вам, что вам не нужно специально отображать jCheckBox, если вы хотите иметь JCheckBox в каждой строке для столбцов с логическим типом, поскольку по умолчанию , DefaultTableModel будет автоматически отображать такие столбцы как модель класса JCheckBox .com/questions/5334444/индивидуальный-jtable-look/   -  person eee    schedule 21.04.2011
comment
@eee, пока ваш пример креативен - он полностью против качающихся ветров ;-)   -  person kleopatra    schedule 30.04.2011
comment
пожалуйста, изучите и используйте соглашения об именах Java   -  person kleopatra    schedule 30.04.2011


Ответы (1)


Прочтите руководство по Oracle Swing JTable, и вы увидите, что вам не нужно напрямую использовать модуль визуализации или редактор ячеек, все, что вам нужно сделать, это вернуть правильный класс столбца Boolean.class, и Swing предоставит вам правильный модуль визуализации и редактор. Это делается путем переопределения метода getColumnClass(int column) TableModel.

e.g.,

  jTable1.setModel(new DefaultTableModel(record, new String[]{"id", "area", "location",
     "status1"}) {
     @Override
     public Class<?> getColumnClass(int columnIndex) {
        if (getColumnName(columnIndex).equals("status1")) {
           return Boolean.class;
        }
        return super.getColumnClass(columnIndex);
     }
  });

Обратите внимание, что для этой работы запись должна быть двумерным массивом Object[][], а не String[][], а столбец status1 должен содержать логические данные, а не данные String, но это должно быть достаточно просто для вам исправить, когда вы заполняете массив записей во вложенных циклах for.

person Hovercraft Full Of Eels    schedule 20.04.2011
comment
я обновил код в своем вопросе и сделал все, как вы сказали (измените запись на объект и столбец status1, содержащий логические данные), но все еще показывает мне сообщение об ошибке - person m.basleem; 20.04.2011
comment
пожалуйста, не имя столбца в базе данных - статус1, а в Jtable - статус, а тип этого столбца в jtable - логическое значение, а в базе данных - целое число. - person m.basleem; 20.04.2011
comment
@mbasleem: добавьте дополнение к своему вопросу, показывающее вашу последнюю попытку решения вашего кода с использованием моей идеи. Было бы предпочтительнее, если бы вы могли опубликовать небольшую компилируемую программу, которая показывает вашу попытку, которую мы могли бы запустить без необходимости использования базы данных - SSCCE - person Hovercraft Full Of Eels; 21.04.2011
comment
я боюсь, что я не могу сделать то, что вы сказали, потому что я не знаю, как это сделать без базы данных, а также я хочу, чтобы это было с базой данных ... но в любом случае я обновил вопрос и поставил весь код .. Я надеюсь, что теперь все ясно .. спасибо за вашу заботу - person m.basleem; 21.04.2011
comment
Ваш текущий код не завершен, так как в нем отсутствует множество объявлений переменных и методов, но, тем не менее, мы сможем лучше помочь вам с небольшим компилируемым и запускаемым примером программы. Я понимаю, что вы хотите использовать базу данных в своей основной программе, но это не так сложно смоделировать с помощью простого ArrayList или двумерного массива тестовых данных. Если вы уже решили свою проблему, пожалуйста, проигнорируйте мой совет, но если вы хотите максимально быстро получить нашу помощь, я настоятельно рекомендую вам создать SSCCE (см. ссылку). - person Hovercraft Full Of Eels; 21.04.2011