2011-09-08 4 views
4

JComboBox가 포함 된 열이있는 JTable이 있습니다.셀의 JComboBox에 ItemEvent가있을 때 CellRow를 얻는 방법

JComboBox에 첨부 된 ItemListener가 있으며 변경 사항에 따라 작동합니다.

그러나 ItemListener에는 변경된 ComboBox가 포함 된 행을 가져 오는 메서드가 없습니다.

ComboBox에 변경 사항이있을 때 같은 행의 다른 열을 사용하려면 행 번호가 필요합니다.

도움을 주시면 감사하겠습니다.


이것은 간략하고 간결한 코드입니다. 달성하고자하는 것은 itemListener가 변경 사항을 선택하면 ComboBox의 Table Row를 얻는 것입니다. 당신이 Using a Combo Box as an Editor을처럼

import java.awt.*; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.io.IOException; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class Example extends JFrame { 

    private static final long serialVersionUID = 1L; 
    public static int maxX, maxY; 
    public static final String[] columnHeads = {"Col 1", "Col 2", "Col 3"}; 

    public static void main(String args[]) throws IOException { 
     Example example = new Example(); 
    } 

    public Example() { 
     //Create Table Model 
     DefaultTableModel model = new DefaultTableModel(); 

     for (int index = 0; index < columnHeads.length; index++) { 
      model.addColumn(columnHeads[index]); 
     } 

     //Create Table 
     JTable table = new JTable(model); 
     JScrollPane scrollPane = new JScrollPane(table); 

     //List for ComboBox 
     String[] list = {"Item1", "Item2", "Item3"}; 

     //Create ComboBox 
     JComboBox itemTypes = attachComboBoxRenderer(table, 2, list); 

     //Attach Item Listener 
     itemTypes.addItemListener(new ComboBoxListener()); 
     ((DefaultTableModel) table.getModel()).insertRow(
      table.getRowCount(), new Object[]{"C1", "C2", ""}); 
     this.setTitle("Example"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container container = getContentPane(); 

     //MAIN Panel 
     final JPanel main = new JPanel(); 
     main.setLayout(new GridBagLayout()); 
     main.add(scrollPane); 

     container.add(main); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static JComboBox attachComboBoxRenderer(
     JTable table, int column, Object[] values) { 
     JComboBox combo = new JComboBox(values); 
     TableColumn col = table.getColumnModel().getColumn(column); 
     col.setCellRenderer(new ComboBoxRenderer(values)); 
     col.setCellEditor(new DefaultCellEditor(combo)); 
     return combo; 
    } 
} 

class ComboBoxListener implements ItemListener { 

    private static final int SELECTED = 1; 

    @Override 
    public void itemStateChanged(ItemEvent e) { 
     // Get the affected item 
     Object item = e.getItem(); 
     if (item.toString() != null 
      && !"".equals(item.toString()) 
      && e.getStateChange() == SELECTED) { 
      System.out.println(item.toString() + " selected"); 
      //How do I get Row in the Table of the ComboBox that was changed? 
     } 
    } 
} 

class ComboBoxRenderer extends JComboBox implements TableCellRenderer { 

    private static final long serialVersionUID = 1L; 

    public ComboBoxRenderer(Object[] items) { 
     super(items); 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
     boolean isSelected, boolean hasFocus, int row, int column) { 
     if (isSelected) { 
      setForeground(table.getSelectionForeground()); 
      super.setBackground(table.getSelectionBackground()); 
     } else { 
      setForeground(table.getForeground()); 
      setBackground(table.getBackground()); 
     } 
     // Select the current value 
     setSelectedItem(value); 
     return this; 
    } 
} 
+1

당신이 "하는 JComboBox를 포함하는 열"에 의해 무엇을 의미합니까? 렌더링 구성 요소로, 편집 구성 요소로, 데이터로? – kleopatra

답변

9

는 소리가 난다. 그렇다면 TableCellEditor 메소드 getTableCellEditorComponent()에는 row이 매개 변수로 포함됩니다. 관련 예시가 here입니다.

부록 : 편집 한 행의 값을 변경하려면 해당 행의 관련 값을 기준으로 모델이 "다른 열"에 대한 올바른 값을 반환하도록하십시오. 또는 example과 같이 업데이트를 실행하기 전에 모델의 setValueAt() 메서드에서 관련 값을 업데이트하십시오.

부록 : 예제를 기반으로 아래 코드는 모델의 getValueAt() 메서드를 재정의하여 종속 열을 항목 열과 동기화 된 상태로 유지합니다.

enter image description here

import java.awt.*; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 
import java.io.IOException; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableColumn; 

/** @see http://stackoverflow.com/questions/7350445 */ 
public class DependentColumn extends JFrame { 

    private static final int DEPENDENT_COL = 1; 
    private static final int ITEM_COL = 2; 
    private static final String[] columnNames = {"Col 1", "Col 2", "Col 3"}; 

    public static void main(String args[]) throws IOException { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       DependentColumn dc = new DependentColumn(); 
      } 
     }); 
    } 

    public DependentColumn() { 
     this.setTitle("Example"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create Model & Table 
     DefaultTableModel model = new DefaultTableModel(columnNames, 0) { 

      @Override 
      public Object getValueAt(int row, int col) { 
       if (col == DEPENDENT_COL) { 
        return "C2:" + this.getValueAt(row, ITEM_COL); 
       } else { 
        return super.getValueAt(row, col); 
       } 
      } 
     }; 
     for (int i = 0; i < 16; i++) { 
      model.addRow(new Object[]{"C1", "C2", "Item1"}); 
     } 
     JTable table = new JTable(model); 
     table.setPreferredScrollableViewportSize(new Dimension(320, 120)); 

     //Create ComboBox 
     String[] items = {"Item1", "Item2", "Item3"}; 
     JComboBox combo = new JComboBox(items); 
     TableColumn col = table.getColumnModel().getColumn(ITEM_COL); 
     col.setCellEditor(new DefaultCellEditor(combo)); 
     combo.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       if (e.getStateChange() == ItemEvent.SELECTED) { 
        System.out.println(e.getItem() + " selected"); 
       } 
      } 
     }); 

     this.add(new JScrollPane(table)); 
     this.pack(); 
     this.setLocationRelativeTo(null); 
     this.setVisible(true); 
    } 
} 
+0

추가 안내가 필요하면 [sscce] (http://sscce.org/)가 도움이 될 수 있습니다. – trashgod

+0

빠른 응답을 보내 주셔서 감사합니다. 하지만 getTableCellEditor() 메서드를 사용하려면 행 값을 지정해야하며 CellEditor 구성 요소를 반환합니다. 선택한 구성 요소에서 행이 무엇인지 알아야합니다. – JeffS

+0

나는 정교했다. 그러나, 당신의 [sscce] (http://sscce.org/)가 없다면 나는 추측하고 있습니다. – trashgod

관련 문제