2014-10-25 2 views
1

나는 내 모델 (AbstractTableModel을 확장)을 가진 JTable을 가지고 있는데, 나는 JButton을 클릭 할 때 그것에 행을 추가하고 싶다.AbstractTableModel을 사용하여 JTable에 행을 추가하는 방법은 무엇입니까?

모델에 행을 추가하는 방법을 모르겠습니다. 여기

내 모델 :

public class MembersModel extends AbstractTableModel { 
    String[] columnNames = { 
    "Name", 
    "Money Spent", 
    "Percent", 
    "Current Deck" 
    }; 

    Object[][] data = { 
    {"Cajo", new Integer(150), new Integer(0), "Event Deck"}, 
    {"Sekiam", new Integer(200), new Integer(0), "Jeskay"}, 
    {"Nuvas", new Integer(100), new Integer(0), "Big Shit"}, 
    {"Dos", new Integer(100), new Integer(0), "Crap Deck"}, 
    {"Atoj", new Integer(100), new Integer(0), "IDK"} 
    }; 

    public MembersModel(){ 
     super(); 
     calcAllPercent(); 
    } 

    public void calcAllPercent(){ 
     for(int i = 0; i < data.length; ++i){ 
     data[i][2] = calcPercetage((Integer) data[i][1]); 
     } 
    } 

    private int calcPercetage(int money){ 
     return (money*100)/teamMoneySpent(); 
    } 

    private int teamMoneySpent(){ 
     int money = 0; 
     for(int i = 0; i < data.length; ++i){ 
     money += (Integer) data[i][1]; 
     } 
     return money; 
    } 

    public int getColumnCount() { 
     return columnNames.length; 
    } 

    public int getRowCount() { 
     return data.length; 
    } 

    public String getColumnName(int col) { 
     return columnNames[col]; 
    } 

    public Object getValueAt(int row, int col) { 
     return data[row][col]; 
    } 

    public Class getColumnClass(int c) { 
     return getValueAt(0, c).getClass(); 
    } 

    public boolean isCellEditable(int row, int col) { 
     return false; 
    } 

    public void setValueAt(Object value, int row, int col) { 
     data[row][col] = value; 
     calcAllPercent(); 
     fireTableRowsUpdated(0, 4); 
    } 
} 

내가 내 테이블 aswell을 만들거나 모델에 메소드를 추가해야합니까?

답변

3

키는 모델에 사용중인 데이터 핵이 될 것이며 여기에 2 차원 배열 Object[][] data이 있습니다. 그러면 문제는 배열에 다른 행을 추가 한 다음 모델의 수신기에 추가를 알리는 방법입니다. 이 일 수 있습니다. 다른 행과 함께 새로운 데이터 배열을 생성하고이 배열의 모든 데이터를 복사 한 다음 새 데이터를 새로 추가 한 행에 추가하면 왜 그렇게됩니까? 내 돈 내가

  • 이 하나의 테이블 행의 데이터를 보유하는 클래스를 만들 거라고, 나는 여기 MyType를 호출 하겠지만, 당신은 더 나은 이름을 줄 것이다, 그것은 문자열, INT있을 것이다 , int 및 String 필드를 사용하여 테이블의 열에 해당합니다.
  • 행 별 계산을 수행하는 것처럼이 클래스에 위의 모델에있는 메소드 중 일부를 제공하십시오 (예 : calcPercentage(..), teamMoneySpent(...)). 그러면이 정보가 필요할 때 모델에서 행 객체의 메소드를 호출 할 수 있습니다.
  • 내 표 모델 데이터 핵으로 ArrayList<MyType>을 사용하십시오. 아니요. 2 차원 하드 코딩 된 배열.
  • 는 ArrayList를
  • 에 추가 한 다음 여기에 fireTableRowsInserted(...) 것이 적절한 모델 알림 방법을 호출 내 모델 클래스를 메소드에 addRow(MyType myObj) 방법
  • 을 제공합니다.

주, 난 당신이 무슨 뜻인지 모르겠어요

내가 내 테이블 aswell을 만들거나 모델에 메소드를 추가해야합니까? 현재 모델

+0

내가 내 테이블 aswell을 만들거나 모델에 메소드를 추가해야 하는가? ' 내가 내 테이블 aswell을 만들거나 모델에 메소드를 추가해야합니까? JTable을 확장하는 형식을 만들려고했습니다. 도움을 주신 데 감사드립니다. – CarlosMorgado

+0

@CarlosMorgado : 다른 이유로 JTable을 확장해야 할 수도 있지만 현재 질문의 핵심과는 아무 관련이 없습니다. –

+0

알겠습니다. 감사합니다. – CarlosMorgado

3

일부 문제 :

  1. setValueAt() 방법은 잘못된 것입니다. tableCellUpdated(...)을 호출해야합니다. 단일 셀을 업데이트 할 때 전체 테이블에서 데이터를 다시 그리기를 원하지 않습니다. 실제로 테이블을 편집 할 수 없기 때문에 setValueAt(...) 메소드를 구현할 필요조차 없습니다.

  2. getColumnClass(...) 메서드를 재정의하지 않았습니다. 테이블이 적절한 렌더러를 사용하여 데이터를 표시 할 수 있도록하려면이 메서드가 필요합니다.

완전히 새로운 TableModel을 만드는 대신 DefaultTableModel을 확장 할 수 있습니다. 이미 addRow(...) 메소드를 지원합니다.

그러나 호버 크래프트는 이미 단일 행의 모든 ​​데이터를 저장하는 사용자 정의 객체를 만드는 것이 더 나은 설계를 지적했습니다. 이 접근법을 사용하는 솔루션의 경우 솔루션에 Row Table Model을 확인하십시오. 기본 TableModel은 더 복잡하지만 모든 공통 코드가 하나의 클래스에 있으므로 이후에 사용자 정의 TableModels을 쉽게 만들 수 있습니다.

먼저 사용자 정의 객체로 TableModel을 만드는 개념을 더 잘 이해할 수 있도록 호버크라프트 제안을 먼저 구현합니다. 미래에 대한 제안으로이 링크를 포함합니다. ` 에 의해

+0

내 테이블을 편집 할 수 있지만 그 밖의 모든 것을 검사합니다. 감사합니다. – CarlosMorgado

관련 문제