15

個々の JComboBoxes を JTable の各セルに配置したいと考えています。すなわち。JComboBox の内容は、各セルで同一ではありません。

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

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

どこ

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
4

9 に答える 9

9

次のコードで 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 セル エディターが作成されます。

于 2009-06-03T20:13:14.717 に答える
3

これで問題が解決すると確信しています。.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));
}
于 2011-11-22T05:07:01.540 に答える
2

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;
        }
    }
于 2013-05-24T15:47:59.993 に答える
2

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

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

于 2011-11-24T21:39:17.217 に答える
2

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

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

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

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

于 2009-01-19T13:45:45.880 に答える
1
@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);
}

toString次に、からのメソッドをオーバーライドしますJComboBox

于 2010-04-19T20:35:03.343 に答える
0

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

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

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

于 2009-03-20T01:55:19.263 に答える
0

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

于 2009-01-19T13:17:56.013 に答える
-8

最も簡単な方法は、独自の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()で収集されます。

于 2009-01-19T16:47:59.053 に答える