0

グーグルとstackoverflowで検索し、いくつかの答えを調べた後、私はまだこの問題で立ち往生しています。

私はjtableを作成し、データベース(derpy-JDBC)から入力しています。 GUIを使用して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);
            }
        });
} }

このひどいコードでごめんなさい^^"事前に感謝します

4

1 に答える 1

2

Oracle Swing JTable チュートリアルを読むと、セル レンダラーやエディターを直接使用する必要がないことがわかります。Boolean.class の正しい列クラスを返すだけで、Swing が正しい列クラスを提供します。あなたのためのレンダラーとエディター。これは、TableModel の getColumnClass(int column) メソッドをオーバーライドすることによって行われます。

例えば、

  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);
     }
  });

これが機能するには、レコードは String[][] ではなく Object[][] の 2 次元配列である必要があり、status1 列は String データではなく Boolean データを保持する必要があることに注意してください。ネストされた for ループでレコード配列を設定するときに修正する必要があります。

于 2011-04-20T15:04:54.153 に答える