2017-02-28 16 views
0

同じテーブルで実行されるアクションに基づいて、JTable内の特定のセルにコンポーネント(JComboBox)を設定する必要があります。JTable内の単一のセルでJComboBoxを更新する

私はJTableをセットアップしました。列AのすべてのセルにJComboBoxが設定されます。

私はこのコードを次のように変更したいと思います。ユーザーが特定の行のJComboBoxでオプションを選択すると、同じ行(B列)の次のフィールドが異なる項目を持つ新しいJComboBoxが設定されています。

ここで問題となるのは、B列全体に同じJComboBoxを挿入したくないということです。テーブルの各行は、列Aでの選択に基づいて、列BのJComboBoxで異なるオプションを持つことができます。

これを行うにはどうすればよいですか?

String sql = "SELECT * from tblDepartment ORDER BY deptName"; 
    int size = 0; 
    int count = 0; 
    try { 
     pst = conn.prepareStatement(sql); 
     rs = pst.executeQuery(); 
     List<String> list = new ArrayList<>(); 
     while (rs.next()) {//adds each item to the list for the combo box 
      list.add(rs.getString("deptName")); 
     } 
     count = list.size(); 
     String[] items = list.toArray(new String[list.size()]); 
     JComboBox<String> jcb = new JComboBox<>(items); 
     TableColumn tc = tblCon.getColumnModel().getColumn(2); 
     TableCellEditor tce = new DefaultCellEditor(jcb);//adds the combo box to the relevant cell in the table. 
     tc.setCellEditor(tce); 
    } catch (SQLException e) { 
     JOptionPane.showMessageDialog(null, e); 
    } 
+0

あなたは 'table.setValueAt(jcb、row、column);でテーブルに直接設定することができます。 – XtremeBaumer

答えて

0

カスタムTableCellEditorを試しましたか? getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)というオーバーライド可能なメソッドを使用できます。ここでは、JComboBoxが表示されるはずの行と列を明示的に定義できます。ここで

JCheckBoxと例です。

public class EditBoolean extends AbstractCellEditor implements TableCellEditor { 

     private JCheckBox box; 

     public EditBoolean() { 
      // This is the component that will handle the editing of the cell value 
      box = new JCheckBox(); 
     } 

     // This method is called when editing is completed. 
     // It must return the new value to be stored in the cell. 
     @Override 
     public Object getCellEditorValue() { 
      return box.isSelected(); 
     } 

     // This method is called when a cell value is edited by the user. 
     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      if(column == 2 && row == 4){ 

       if (value instanceof Boolean) { 
        box.setSelected((Boolean) (value)); 
       } else { 
        box.setSelected(Boolean.getBoolean((String) value)); 
       } 
       return box; 
      } 
     } 
} 
1

あなたが特定のエディタを返すためにJTablegetCellEditor(...)メソッドをオーバーライドすることができます。

import java.awt.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.border.*; 
import javax.swing.table.*; 

public class TableComboBoxByRow extends JPanel 
{ 
    List<String[]> editorData = new ArrayList<String[]>(3); 

    public TableComboBoxByRow() 
    { 
     setLayout(new BorderLayout()); 

     // Create the editorData to be used for each row 

     editorData.add(new String[]{ "Red", "Blue", "Green" }); 
     editorData.add(new String[]{ "Circle", "Square", "Triangle" }); 
     editorData.add(new String[]{ "Apple", "Orange", "Banana" }); 

     // Create the table with default data 

     Object[][] data = 
     { 
      {"Color", "Red"}, 
      {"Shape", "Square"}, 
      {"Fruit", "Banana"}, 
      {"Plain", "Text"} 
     }; 
     String[] columnNames = {"Type","Value"}; 

     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model) 
     { 
      // Determine editor to be used by row 
      public TableCellEditor getCellEditor(int row, int column) 
      { 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1 && row < 3) 
       { 
        JComboBox<String> comboBox1 = new JComboBox<String>(editorData.get(row)); 
        return new DefaultCellEditor(comboBox1); 
       } 
       else 
        return super.getCellEditor(row, column); 
      } 
     }; 

     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane); 
//  table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer2()); 
    } 
/* 
    class ComboBoxRenderer2 extends DefaultTableCellRenderer 
    { 
     @Override 
     public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
      JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      label.setIcon(UIManager.getIcon("Table.descendingSortIcon")); 
      return label; 
     } 
    } 
*/ 
    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("Table Combo Box by Row"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new TableComboBoxByRow()); 
     frame.setSize(200, 200); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

上記の例では、エディタは単に行によって決まります。

エディタは、行と前の列のデータによって決まります。

関連する問題