2016-04-29 10 views
1

私は、特定のセルが通常のテキスト入力またはコンボボックスであるJTableをレンダリングしています。複数のエディタタイプを連続してJTableを作成するにはどうすればいいですか?

は、私はこのようにそれをしようとすると:あなたはスクリーンショットから見ることができるように

package sandbox.jtablegui; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.Hashtable; 

import javax.swing.*; 
import javax.swing.table.*; 

public class App extends JFrame 
{ 
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3); 

    public App() 
    { 
     String[] colNames = { "Name", "Value" }; 
     final String[] propertyNames = { "Val1", "Val2" }; 
     DefaultTableModel model = new DefaultTableModel(colNames, 2) { 

      // set setting names 
      public Object getValueAt(int row, int col) { 
       if (col == 0) 
        return propertyNames[row]; 
       return super.getValueAt(row, col); 
      } 

      public boolean isCellEditable(int row, int col) { 
       if (col == 0) 
        return false; 
       return true; 
      } 
     }; 

     JComboBox<String> comboBox = new JComboBox<String>(new String[] { "Option1", "Option2" }); 
     final DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox) { 
      @Override 
      public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
       Object val = value; 
       System.out.println(val); 
       if (val == null) { 
        val = ((JComboBox<?>) getComponent()).getItemAt(0); 
        System.out.println(val); 
       } 
       return super.getTableCellEditorComponent(table, val, isSelected, row, column); 
      } 
     }; 

     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 == 1) 
        return comboBoxEditor; 
       else 
        return super.getCellEditor(row, column); 
      } 
     }; 
     RowEditorModel rowEditorModel = new RowEditorModel(); 



     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
    } 

    public static void main(String[] args) 
    { 
     App frame = new App(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public class RowEditorModel { 
     private Hashtable data; 

     public RowEditorModel() { 
      data = new Hashtable(); 
     } 

     public void addEditorForRow(int row, TableCellEditor editor) { 
      data.put(new Integer(row), editor); 
     } 

     public void removeEditorForRow(int row) { 
      data.remove(new Integer(row)); 
     } 

     public TableCellEditor getEditor(int row) { 
      return (TableCellEditor) data.get(new Integer(row)); 
     } 
    } 
} 

ただし、デフォルト値はJTableのには示されていません。

enter image description here

+1

くださいofficia Oracleのチュートリアルに従っているいただきました問題、RowEditorModelが完了していないとして、(XxxTableModelに値を格納する)のより良い方法 – mKorbel

+0

イエスの束は、今では発見があるように思える:このような何かtablemodelは値を管理する必要があります。 http://stackoverflow.com/questions/11858286/how-to-use-custom-jtable-cell-editor-and-cell-renderer? – poseid

答えて

2

コンボボックスの作成時に選択したインデックスの設定は助けることはできません。エディタとして使用するたびに設定する必要があります。

DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox) { 
    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     Object val = value; 
     if (val == null) { 
      val = ((JComboBox<?>) getComponent()).getItemAt(0); 
     } 
     return super.getTableCellEditorComponent(table, val, isSelected, row, column); 
    } 

} 
+0

ありがとう、うーん.. getTableCellEditorComponentはいつ呼び出されますか?私は選択したオプトインをSystem.out.println(val)で表示しようとします。関数が呼び出される兆候はありません。 – poseid

+0

このメソッドは、テーブルが表示するエディタを準備するたびにJTableによって呼び出されます。私の解決策が効果がない場合は、[SSCCE](http://sscce.org)を提供してください。何が間違っているかわかります。 –

+1

@poseidエディタは、テーブルの編集可能なセルがユーザによってクリックされた場合にのみ表示されます。テーブルで見たい場合は、モデルの 'getValueAt()'メソッドでそれを返す必要があります。 –

関連する問題