2017-04-01 9 views
1

これは、ドラッグ&ドロップのJava SwingのJTableにチェックボックスを追加するにはどうすればよいですか?

は、ここに私のコード

私はJTableの(製品版の説明)内のすべてのデータの左側にあるチェックボックスを追加したい
prod.removeColumn(prod.getColumnModel().getColumn(0)); 

    String sql = "select prod_id,prod_description,prod_wh_name,prod_fr_name from product order by prod_description asc"; 
    PreparedStatement pst = con.prepareStatement(sql); 
    ResultSet rs = pst.executeQuery(); 
    while(rs.next()) 
    { 
     int columns = rs.getMetaData().getColumnCount(); 
     Object[] row = new Object[columns]; 
     for(int i = 1 ; i <=columns;i++) 
     { 
      row[i - 1] = rs.getObject(i); 
     } 
     ((DefaultTableModel) prod.getModel()).insertRow(rs.getRow() -1,row); 
    } 

、そのための任意のソリューションですか?複数選択できますか?選択したアイテムのデータを取得するにはどうすればよいですか?前もって感謝します!

+1

[コンセプト:編集者とレンダラー](http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)から始めることをお勧めします。 [this](http://stackoverflow.com/questions/23822376/display-jcheckbox-in-jtable/23822410#23822410)または[this](http://stackoverflow.com/questions/23403595/solved-setting-the jtable-in-java/23405029?noredirect = 1#comment35864757_23405029)または[this(http://stackoverflow.com/questions/18099717/how-to-add- jcheckbox-in-jtable/18099876#18099876)してみてください。 – MadProgrammer

+0

あなたの提案をお試しください。ありがとう! –

+0

ようこそ。私は 'mysql'タグを削除することを提案します、それは質問には関係ありません。 – c0der

答えて

1

1つの方法は、「ラッパー」TableModelを作成することです。

この例では、チェックマークを含む列は、既存のTableModelの列の左側に追加されます。

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

public class CheckBoxWrapperTableModel extends AbstractTableModel 
{ 
    private ArrayList<Boolean> checkBoxes = new ArrayList<>(); 

    private DefaultTableModel model; 
    private String columnName; 

    public CheckBoxWrapperTableModel(DefaultTableModel model, String columnName) 
    { 
     this.model = model; 
     this.columnName = columnName; 

     for (int i = 0; i < model.getRowCount(); i++) 
      checkBoxes.add(Boolean.FALSE); 
    } 

    @Override 
    public String getColumnName(int column) 
    { 
     return (column > 0) ? model.getColumnName(column - 1) : columnName; 
    } 

    @Override 
    public int getRowCount() 
    { 
     return model.getRowCount(); 
    } 

    @Override 
    public int getColumnCount() 
    { 
     return model.getColumnCount() + 1; 
    } 

    @Override 
    public Object getValueAt(int row, int column) 
    { 
     if (column > 0) 
      return model.getValueAt(row, column - 1); 
     else 
     { 
      Object value = checkBoxes.get(row); 
      return (value == null) ? Boolean.FALSE : value; 
     } 
    } 

    @Override 
    public boolean isCellEditable(int row, int column) 
    { 
     if (column > 0) 
      return model.isCellEditable(row, column - 1); 
     else 
      return true; 
    } 

    @Override 
    public void setValueAt(Object value, int row, int column) 
    { 
     if (column > 0) 
      model.setValueAt(value, row, column - 1); 
     else 
     { 
      checkBoxes.set(row, (Boolean)value); 
     } 

     fireTableCellUpdated(row, column); 
    } 

    @Override 
    public Class getColumnClass(int column) 
    { 
     return (column > 0) ? model.getColumnClass(column - 1) : Boolean.class; 
    } 

    public void removeRow(int row) 
    { 
     checkBoxes.remove(row); 
     fireTableRowsDeleted(row, row); 
     model.removeRow(row); 
    } 

    private static void createAndShowGUI() 
    { 
     // Create the table with check marks in the first column 

     DefaultTableModel model = new DefaultTableModel(5, 1); 

     for (int i = 0; i < model.getRowCount(); i++) 
     { 
      model.setValueAt("" + i, i, 0); 
     } 

     CheckBoxWrapperTableModel wrapperModel = new CheckBoxWrapperTableModel(model, "Select"); 
     JTable table = new JTable(wrapperModel); 

     // Add button to delete selected rows 

     JButton button = new JButton("Delete Selected Rows"); 
     button.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       for (int i = table.getRowCount() - 1; i >= 0; i--) 
       { 
        Boolean selected = (Boolean)table.getValueAt(i, 0); 
        System.out.println(selected + " : " + i); 

        if (selected) 
        { 
         wrapperModel.removeRow(i); 
        } 

       } 
      } 
     }); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.add(button, BorderLayout.PAGE_END); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 

これは、あなたがアクセス権を持っていない場合でも、あなたは、チェックボックスを追加することができます独自のチェックボックスの列を追加するために作成されたときの元のTableModel

+0

私はこのラッパーのことを学ぶつもりです。ありがとう!もう1つの質問ですが、元のテーブルのprod_idのようなデータを得るために、このラッパーを使ってもいいですか? –

関連する問題