質問

個々のJComboBoxをJTableの各セルに入れたい。すなわち。 JComboBoxのコンテンツは、各セルで同一ではありません。

基本的に、次のコードを呼び出してJTableにJComboBoxの行を追加できるようにしたいと思います。誰もが考えていますか?ありがとう

JComboBox cb1 = new JComboBox(...);
JComboBox cb2 = new JComboBox(...);
model.addRow(new Object[] {"Row name", cb1, cb2} );

JComboBox cb3 = new JComboBox(...);
JComboBox cb4 = new JComboBox(...);
model.addRow(new Object[] {"Row name 2", cb3, cb4} );

私が見つけることができる最も近いコード例は次のとおりです。ただし、JComboBoxのコンテンツが個々の列で同一である場合に使用します。必要な解決策ではありません。

TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyComboBoxEditor(values));

where

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
役に立ちましたか?

解決

最も簡単な方法は、独自の TableModel

public class MyModel extends AbstractTableModel {
    List rows;

    public int getRowCount() {
        return rows.size();
    }

    public int getColumnCount() {
         return 4;
    }

    public Object getValueAt(int row, int column) {
        return rows.get(row).getCol(col);  //assuming your row "Object" has a getCol()
    }

    public Class<?> getColumnClass(int col) {
        return Boolean.class;
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        rows.get(rowIndex).getCol(columnIndex).setValue(aValue);
    }

}

これをJTableにロードします。ブール値のデフォルトのセルレンダラーを置き換えていない場合、getColumnClass()の実装により、すべてのセルがチェックボックスとしてレンダリングされます。これらのチェックボックスへのユーザー入力はすべて、setValueAt()で収集されます。

他のヒント

このコードでJTableを拡張します:

@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}

これにより、値を取得するコンボボックスごとに一意のJComboBoxセルエディターが作成されます。

これで問題が解決するはずです。 .getColumn(int column)でコンボボックスを設定する必要がある列の説明

private void addComboToTable(JComboBox combo) {
    TableColumn gradeColumn = YourTable.getColumnModel().getColumn(0);
    JComboBox comboBox = combo;
    comboBox.removeAllItems();
    try {
        comboBox.addItem("Item 1");
        comboBox.addItem("Item 2");
        comboBox.addItem("Item 3");
    } catch (NullPointerException e) {
    } catch (Exception e) {
        e.printStackTrace();
    }
    gradeColumn.setCellEditor(new DefaultCellEditor(comboBox));
}

オーバーライドする必要があります:

Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)

... TableCellEditorで。このメソッドに渡される値は、JComboBoxに入れることができるものです。つまり、その特定のセルの「値」は、コレクションに変換できるものである必要があります。潜在的に単なるオブジェクトのリストであるか、JComboBoxに作成できるフィールドを持つPOJOである可能性があります。

したがって、MyComboBoxEditorを編集してそのメソッドをオーバーライドし、モデルを変更して、実際に他のいくつかのオブジェクトを表すオブジェクトを許可します。

JComboBoxのコンテンツは、行選択ごとに同一にレンダリングされます。 JTableは、列ごとに複数のエディターを持つ機能を提供しません。 行の追加選択をサポートするには、JTableクラスを拡張する必要があります。

この記事では、非常によく説明しています。 http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

cellEditorに加えて、cellRendererを実行してセル内のコンボボックスをペイントする必要があります。これを見てください:

 public void example(){  

      TableColumn tmpColum =table.getColumnModel().getColumn(1);
      String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" };
      JComboBox comboBox = new JComboBox(DATA);

      DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox);
      tmpColum.setCellEditor(defaultCellEditor);
      tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox));
      table.repaint();
   }


/**
   Custom class for adding elements in the JComboBox.
*/
class CheckBoxCellRenderer implements TableCellRenderer {
        JComboBox combo;
        public CheckBoxCellRenderer(JComboBox comboBox) {
            this.combo = new JComboBox();
            for (int i=0; i<comboBox.getItemCount(); i++){
                combo.addItem(comboBox.getItemAt(i));
            }
        }
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            combo.setSelectedItem(value);
            return combo;
        }
    }
@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}

そして、toStringJComboBoxメソッドをオーバーライドします。

このページが役立つ場合があります、列内のすべてのセルに同じコンボボックスを持つことに制限されているようですが、

メソッドTableCellEditor getCellEditor(int row、int column)をオーバーライドするには、JTableのサブクラスを作成する必要があります。

これにより、任意の行と列の組み合わせに任意のセルエディターを設定できます。デフォルトの方法は、列全体にセルエディタを設定することです。

(getCellRendererをオーバーライドすることにより、個々のセルレンダラーを設定することもできます。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top