문제

나는 jtable의 각 셀에 개별 Jcomboboxes를 넣고 싶습니다. 즉. 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));

어디

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에로드하십시오. Boolean 's의 기본 셀 렌더러를 교체하지 않은 경우 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)

... 식탁보에서. 이 방법에 전달되는 값은 Jcombobox에 넣을 수있는 것입니다. 즉, 해당 셀의 '가치'는 컬렉션으로 번역 될 수있는 것이 필요하다는 것을 의미합니다. 잠재적으로 객체 목록 일 수도 있고 jcombobox로 만들 수있는 필드가있는 포조 일 수도 있습니다.

따라서 MyComboBoxEditor를 편집하여 해당 메소드를 무시하고 모델을 변경하여 실제로 다른 여러 개체를 나타내는 객체를 허용하십시오.

jtable은 열당 하나 이상의 편집기를 가질 수있는 기능을 제공하지 않기 때문에 Jcombobox 컨텐츠는 각 행 선택마다 동일하게 렌더링됩니다. 행에 대한 추가 선택을 지원하려면 JTable 클래스를 확장해야합니다.

이 기사는 매우 잘 설명합니다.http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

CellEditor 외에도 Cellrenderer가 셀에 Combobox를 페인트하기 위해 수행해야합니다.

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

그런 다음, toString 방법 JComboBox.

이 페이지 컬럼의 모든 셀에서 동일한 콤보 박스를 갖는 것으로 제한된 것 같습니다.

테이블 셀로이터 getCellEditor (int row, int column)를 무시하려면 JTABLE의 서브 클래스를 만들어야합니다.

이를 통해 모든 행 및 열 조합에 대해 임의의 셀 편집기를 설정할 수 있습니다. 기본 방법은 전체 열의 셀 편집기를 설정하는 것입니다.

(GetCellrenderer를 재정의하여 개별 셀 렌더러를 설정할 수도 있습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top