0

さて、こちらの例で行ったように、JComboBox を特定のセルに追加したテーブル設定ができましたが、何らかの理由で、そのセルが選択されるまでコンボ ボックスが表示されません。そのセルを選択すると、コンボ ボックスが開き、選択できるリストが表示されます。選択を変更するかどうかに関係なく、テーブル内の別のセルをクリックすると、コンボ ボックスから選択された項目のテキストが、テーブルに表示される単純な文字列のように表示されます。

私の質問は、最初にセルを選択しなくても、選択した値を JComboBox に表示するにはどうすればよいですか?

編集:私が言及を忘れたことの1つは次のとおりです。事前に宣言するのでDefaultTableModel dataはなく、アイテムは後で DTM に追加されます。model.addRow();

4

2 に答える 2

2

これは通常の動作です。テーブルはレンダラーとエディターを使用します。セルのデフォルトのレンダラーは単なる JLabel なので、表示されるのはテキストだけです。セルをクリックするとエディタが呼び出され、コンボ ボックスが表示されます。

セルを編集していないときでもコンボ ボックスのように見せたい場合は、その列のコンボ ボックス レンダラーを作成する必要があります。

詳細については、カスタム レンダラーの使用に関する Swing チュートリアルのセクションを参照してください。

于 2013-02-21T22:36:10.263 に答える
1

この例のように、独自の Renderer を作成してみることができます。

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

または、この例のようにデフォルトのレンダラーをカスタマイズできます。

final JComboBox combo = new JComboBox(items);
TableColumn col = table.getColumnModel().getColumn(ITEM_COL);
col.setCellRenderer(new 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;
    }
    });

最初の例では、クリック後にセルを JComboBox のように見せます。2 番目の例では、JComboBox がクリック可能であることを示す矢印アイコンを JComboCox に追加します。2 番目の例を使用しました。結果はこちらで確認できます。

于 2014-11-07T09:54:27.100 に答える