2016-10-12 5 views
1

私はJTableを持っており、3つの異なる列に3つのJComboBoxを追加しています。 今、私はすべての行に対して選択した項目を設定したいと思います。問題は、私はそれを行うにはすべての行のIDが必要です。 だから私は別のリスナーを試して、最良の結果がFocusListenerに付属していましたが、私はいつもまず行をクリックしてからJComboBoxをクリックしなければならず、これは面倒です。ここ は一例であり:ここでJTable内のJComboboxのsetSelectedItem

JTable table = new JTable(); 
    Vector<ArrayList<Object>> data = new Vector<ArrayList<Object>>(); 
    for (int i = 0; i < 5; i++) 
    { 
     ArrayList<Object> object = new ArrayList<Object>(); 
     object.add(i); 
     object.add("name"); 
     object.add(i+1); 
     object.add(i+1); 
     object.add(i+1); 
     data.add(object); 
    } 
    DefaultTableModel tableModel = new DefaultTableModel() { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 

     @Override 
     public boolean isCellEditable(int row, int column) { 
      if (column < 2) 
       return false; 
      return true; 
     } 
    }; 
    tableModel.setColumnIdentifiers(new String[] {"ID", "Name", "OK", "Other", "Error"}); 
    tableModel.addTableModelListener(new TableModelListener() 
    { 

     @Override 
     public void tableChanged(TableModelEvent e) 
     { 
      if (e.getType() == TableModelEvent.UPDATE) 
      { 
       int row = e.getFirstRow(); 
       int column = e.getColumn(); 
       TableModel table_model = (TableModel) e.getSource(); 
       ArrayList<Object> changed_data = (ArrayList<Object>) table_model.getValueAt(row, column); 
       String row_id = String.valueOf(table_model.getValueAt(row, 0)); 
       for (ArrayList<Object> list : data) 
       { 
        String compare_id = String.valueOf(list.get(0)); 
        if (row_id.equals(compare_id)) 
        { 
         list.set(column, String.valueOf(changed_data.get(0))); 
         for (int i = table_model.getRowCount()-1; i >= 0 ; i--) 
         { 
          tableModel.removeRow(i); 
         } 

         for (ArrayList<Object> object : data) 
         { 
          Vector<String> vector = new Vector<String>(); 
          vector.addElement(String.valueOf(object.get(0))); 
          vector.addElement(String.valueOf(object.get(1))); 
          vector.addElement(String.valueOf(object.get(2))); 
          vector.addElement(String.valueOf(object.get(3))); 
          vector.addElement(String.valueOf(object.get(4))); 
          tableModel.addRow(vector); 
         } 

         TableColumn column_ok = table.getColumnModel().getColumn(2); 
         TableColumn column_other = table.getColumnModel().getColumn(3); 
         TableColumn column_error = table.getColumnModel().getColumn(4); 

         JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data); 
         JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data); 
         JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data); 

         column_ok.setCellEditor(new DefaultCellEditor(combobox_ok)); 
         column_other.setCellEditor(new DefaultCellEditor(combobox_other)); 
         column_error.setCellEditor(new DefaultCellEditor(combobox_error)); 
         break; 
        } 
       } 
      } 
     } 
    }); 
    table.setModel(tableModel); 
    for (ArrayList<Object> object : data) 
    { 
     Vector<String> vector = new Vector<String>(); 
     vector.addElement(String.valueOf(object.get(0))); 
     vector.addElement(String.valueOf(object.get(1))); 
     vector.addElement(String.valueOf(object.get(2))); 
     vector.addElement(String.valueOf(object.get(3))); 
     vector.addElement(String.valueOf(object.get(4))); 
     tableModel.addRow(vector); 
    } 

    TableColumn column_ok = table.getColumnModel().getColumn(2); 
    TableColumn column_other = table.getColumnModel().getColumn(3); 
    TableColumn column_error = table.getColumnModel().getColumn(4); 

    JComboBox<ArrayList<Object>> combobox_ok = new JComboBox<ArrayList<Object>>(data); 
    JComboBox<ArrayList<Object>> combobox_other = new JComboBox<ArrayList<Object>>(data); 
    JComboBox<ArrayList<Object>> combobox_error = new JComboBox<ArrayList<Object>>(data); 

    column_ok.setCellEditor(new DefaultCellEditor(combobox_ok)); 
    column_other.setCellEditor(new DefaultCellEditor(combobox_other)); 
    column_error.setCellEditor(new DefaultCellEditor(combobox_error)); 

    JScrollPane scrollPane = new JScrollPane(); 
    scrollPane.getViewport().add(table); 

    JFrame frame = new JFrame(); 
    frame.add(scrollPane); 
    frame.setSize(400, 200); 
    frame.setVisible(true); 

、最初の行、第3列(「OK」)には、行を表すJComboBoxの異なるエントリに選択することができます。つまり、ある行には、別の行を参照する3つのJComboBoxがあります。 このようなJComboBoxをクリックすると、最初の項目が選択され、クリックする前に見た番号の項目は選択されません。

多分私は何をしたいのか理解していますか?

+1

早いほど良いのヘルプについては、[MCVE]または[ショート、自己完結、正しい例](http://www.sscce.org/)を投稿してください。 –

+0

可能な限り、何がどこで、どうやって間違っているのか、そして望む効果は何かを、できるだけ具体的に説明してください。私はあなたの質問をこの形式で理解することはできません。 –

+0

例をコーディングしたときに質問を更新します。 – mavok

答えて

2

このようなJComboBoxをクリックすると、常に最初の項目が選択され、クリックする前に見た番号の項目は選択されません。

次の単純化された完全な例は、セルのエディタがアクティブなときに常に選択されたエントリを表示します。コンボのdefault rendererを置き換えて、必要に応じて別の結果を表示することができます。さらに、

  • getPreferredScrollableViewportSize()をオーバーライドして、テーブルの望ましいサイズを設定します。

  • 可能であれば、タイプパラメータを使用します。 exampleの場合は、必要に応じてgetColumnClass()を上書きします。

  • hereおよびhereのように、従属データの場合は、getValueAt()が上書きされます。

  • 以下のisCellEditable()の簡略化された実装に注意してください。

image

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.util.Arrays; 
import java.util.Vector; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 

/** 
* @see https://stackoverflow.com/q/39993746/230513 
*/ 
public class TableComboTest { 

    private Vector<Vector<String>> createData() { 
     Vector<Vector<String>> data = new Vector<Vector<String>>(); 
     for (int i = 0; i < 5; i++) { 
      Vector<String> rowVector = new Vector<String>(); 
      rowVector.add(String.valueOf(i)); 
      rowVector.add("name"); 
      rowVector.add(String.valueOf(i + 1)); 
      rowVector.add(String.valueOf(i + 1)); 
      rowVector.add(String.valueOf(i + 1)); 
      data.add(rowVector); 
     } 
     return data; 
    } 

    private void display() { 
     Vector<Vector<String>> data = createData(); 
     Vector<String> names = new Vector<>(Arrays.asList("ID", "Name", "OK", "Other", "Error")); 
     DefaultTableModel tableModel = new DefaultTableModel(data, names) { 

      @Override 
      public boolean isCellEditable(int row, int column) { 
       return column > 1; 
      } 
     }; 
     JTable table = new JTable(tableModel) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(getPreferredSize().width, getRowHeight() * 4); 
      } 
     }; 

     TableColumn column_ok = table.getColumnModel().getColumn(2); 
     TableColumn column_other = table.getColumnModel().getColumn(3); 
     TableColumn column_error = table.getColumnModel().getColumn(4); 

     String[] choices = new String[]{"1", "2", "3", "4", "5"}; 
     JComboBox<String> combobox_ok = new JComboBox<>(choices); 
     JComboBox<String> combobox_other = new JComboBox<String>(choices); 
     JComboBox<String> combobox_error = new JComboBox<String>(choices); 

     column_ok.setCellEditor(new DefaultCellEditor(combobox_ok)); 
     column_other.setCellEditor(new DefaultCellEditor(combobox_other)); 
     column_error.setCellEditor(new DefaultCellEditor(combobox_error)); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new TableComboTest()::display); 
    } 
} 
+0

ありがとうございました! – mavok

+0

あなたは大歓迎です。それはうれしかったです。 – trashgod

関連する問題