2015-01-06 1 views
0

JTable과 관련된 작은 프로젝트에서 사용자가 버튼을 클릭하고 행을 테이블에 추가해야합니다 (이 버튼의 이름은 addrow입니다). 필자는 기본 테이블 모델을 확장하는 사용자 지정 테이블 모델 (Mytablemodel)을 사용했습니다. 테이블이 처음 다섯 행과 4 열로 구성됩니다. 이후에 사용자가 버튼을 클릭하여 행을 더 추가 할 수 있습니다.사용자 정의 테이블 모델을 사용하여 JTable에 새 행을 삽입하는 방법은 무엇입니까?

아무 것도하지 않는 addrow 버튼을 제외하고 내 코드의 모든 것이 올바르게 작동합니다. 나는 어떤 도움을 주셔서 감사합니다. 코드에 대한

public class AddingNewRows extends JFrame { 
JTable mytable; 
JButton addrow; 
String[] columns={"Admission number","Name","School","Year"}; 
TableColumn tc; 
int defaultrows=5; 
int rows=new Mytablemodel().getRowCount(),columnscount=new Mytablemodel().getColumnCount(); 
List data=new ArrayList(); 
Mytablemodel mytbm; 
// 
public AddingNewRows(){ 
super("adding rows"); 
for(int initialrows=0; initialrows<5; initialrows++){ 
    String[] items={"1","2","3","4"}; 
data.add(items); 
} 
mytbm=new Mytablemodel(); 
mytable=new JTable(mytbm); 

JScrollPane scroll=new JScrollPane(mytable); 
addrow=new JButton("ADD ROW"); 
// 
JPanel buttonpanel=new JPanel(); 
buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS)); 
buttonpanel.setAlignmentX(Component.RIGHT_ALIGNMENT); 
buttonpanel.add(addrow); 

// 
add(scroll,BorderLayout.CENTER); 
add(buttonpanel,BorderLayout.SOUTH); 

addrow.addActionListener(new Myactions()); 

} 
public class Mytablemodel extends DefaultTableModel{ 

@Override 
public String getColumnName(int column) { 
    return columns[column]; 
} 
@Override 
public Object getValueAt(int row, int col){ 
return ((String[])data.get(row))[col]; 
} 
@Override 
public boolean isCellEditable(int row, int col){ 
    return true; 
} 
@Override 
public void setValueAt(Object value,int row, int col){ 
    ((Object[])data.get(row))[col]=value; 
    fireTableCellUpdated(row,col); 

} 
@Override 
public Class getColumnClass(int column){ 
    return getValueAt(0,column).getClass(); 
} 
@Override 
public int getColumnCount(){ 
    return columns.length; 
} 

@Override 
public int getRowCount(){ 
    return increaserows; 
} 

@Override 
public void addRow(Object[] mynewdata){ 
    int rownum=data.size(); 
    System.out.println(rownum); 
    data.add(madata); 
fireTableRowsInserted(rownum,rownum); 
} 

} 
// 
private class Myactions implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent event){ 
if(event.getSource()==addrow){ 
    Object[]newdata={"","","",""}; 
    mytbm.addRow(newdata); 
} 
} 
} 
public static void main(String[] args) { 

AddingNewRows frame=new AddingNewRows(); 
frame.setVisible(true); 
    frame.setSize(400,400); 
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

} 
+1

모든 소문자로 타이핑 한 단어는 웅얼 거리는 사람의 말을 듣는 것처럼 읽기가 어렵습니다. 문장의 시작 부분에있는 대문자, I라는 단어, 'ArrayList'또는 Oracle과 같은 적절한 이름을 사용하십시오. –

+1

'Mytablemodel extends AbstractTableModel {'스스로 대신 ** DefaultTableModel' **을 확장하십시오. 그것은 당신을 위해 이런 종류의 물건을합니다. 하지만 더 빨리 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소 완성 입증 가능한 예) 또는 [SSCCE] (http://www.sscce.org/) (Short, Self 포함, 올바른 예). –

+0

@AndrewThompson 테이블에 입력 된 모든 데이터는 나중에 onther 단추를 통해 데이터베이스에 저장되며 정상적으로 작동합니다. 내가 왜 사용자 정의 테이블 모델을 사용했는지 그 이유는 DefaultTableModel을 사용하여 데이터를 데이터베이스에 저장할 수 없다고 생각하기 때문입니다. 또한 fireTableRowsInserted (int, int) 메소드에 문제가 있음을 나타냅니다. 매개 변수 자체 및 메서드 호출 위치 및시기 –

답변

2

일부 노트 :

  • 당신은 외부 에서 명시 적으로 fireXxx() 방법 중 하나를 호출하지합니다 않습니다. 이것들은 필요할 때 AbstractTableModel 하위 클래스에 의해 내부적으로 호출되도록 고안되었습니다. 참고 : IMHO는 이 protected이어야하며 올바르게 사용하지 않으려면 public이 아니어야합니다. 그러나 에 대한 이유는 공개했습니다.

  • 버튼이 이 아닌 새 테이블 모델을 만드는 것처럼 보이므로 의미가 없습니다. 테이블 모델에 에 addRow(...) 메소드를 제공하면 새 행을 추가 할 수 있습니다. 대부분 행이 추가 될 때마다 테이블 모델의 기본 데이터 구조 인 2 차원 배열을 확대해야합니다.

  • @AndrewThompson이 이미 제안했듯이 DefaultTableModel은 으로 테이블 모델의 기능을 수행합니다.

  • rowscolumnscount 속성 초기화를 확인하십시오. 그것은 내게 맞는 것 같지 않다 . 한편

, 당신은 코멘트에 말 :

나는 문제가 fireTableRowsInserted(int,int) 방법을 이해하는 데 문제가 있습니다. 방법

이 메소드를 호출 할 때 또는 매개 변수 스스로가와 내가 두 번째 점에서 만들 수 제안했습니다 그 addRow(...) 내에서 호출해야합니다. 이 방법은 데이터 구조를 확대하고 에 새로운 행이 삽입되었음을 알립니다. 매개 변수는 각각 첫 번째 및 마지막 인덱스입니다. 팁 : 테이블 모델 끝에 새로운 단일 행을 추가하면 첫 번째 인덱스와 마지막 인덱스가 모두 같고 기본 데이터 구조의 새 크기 -1이됩니다. 물론 여러 행을 삽입 할 수 있으며 반드시 테이블 모델의 끝 부분에 삽입 할 필요는 없으므로 적절한 인덱스를 찾아야합니다. 표시된 here 예제에서는 데이터 구조로 List 개의 사용자 정의 객체를 사용합니다.

+0

19 처음이자 마지막 색인을 말할 때, 정확히 무슨 뜻입니까? 예를 들어, 나는 5 행을 가지고 있는데, 6 행을 추가하려고 할 때 fireTableRowsUpdated (6,6)를 말할 것인가? –

+0

그런 경우 Java 시작의 인덱스가 0부터 시작하여 (인덱스 5는 6 번째 행이기 때문에)'fireTableRowsInserted (5,5)'를 호출해야합니다. 참고 새로운 행을 실제로 추가하기를 원하기 때문에 *** 행이 *** (not * updated *)로 삽입되었음을 알립니다. @gikarasojokinene – dic19

+0

따라서 첫 번째 인덱스는 삽입 된 행을 나타내며 두 ​​번째 인덱스는 행에 있어야하는 열을 나타냅니다. 내가 맞습니까? –

0

질문에 따라 사용자가 addrow 버튼을 클릭 할 때마다 새 행을 추가하려고합니다. addrow 메서드를 직접 만들지 않고 DefaultTableModel을 사용하여 목표를 달성하십시오. 아래 예제에서 DefaultTableModel 생성자의 매개 변수는 테이블이 실행될 초기 행 (5)과 열 (4)을 나타내며 사용자는 addrow 버튼을 클릭하여 더 많은 행을 추가 할 수 있습니다.

public class AddingNewRows extends JFrame { 
DefaultTableModel def; 
JTable mytable; 
JButton addrow; 
// 
public AddingNewRows(){ 
super("adding rows"); 

def=new DefaultTableModel(5,4); 
mytable=new JTable(def); 

JScrollPane scroll=new JScrollPane(mytable); 
addrow=new JButton("ADD ROW"); 
// 
JPanel buttonpanel=new JPanel(); 
buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS)); 
buttonpanel.add(addrow); 

// 
add(scroll,BorderLayout.CENTER); 
add(buttonpanel,BorderLayout.SOUTH); 

addrow.addActionListener(new Myactions()); 

} 

private class Myactions implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent event){ 
if(event.getSource()==addrow){ 
Object[]newdata={"","","",""}; 
def.addRow(newdata); 
} 
} 
} 
public static void main(String[] args) { 
AddingNewRows frame=new AddingNewRows(); 
frame.setVisible(true); 
frame.setSize(400,400); 
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

} 
관련 문제