2013-08-10 1 views
0

나는 기존 대화 상자의 새 패널에 jtable을 표시하기 위해 다음 코드를 사용했습니다. 나는 테이블 모델 및 setmodel 메서드에 대한 mytablemodel 클래스를 사용했습니다 (같은 모델 개체를 사용하여 여러 테이블을 생성해야하므로 생성자 대신 메서드를 사용했습니다.) 그러나 일부 내 jtable 어떻게 actionlisten에 대한 내용을 변경하지 않습니다. .same content reappera 입력 값이 변경 되더라도 ... plz help액션 리스너의 이벤트에서 jtable의 내용을 새로 고치는 방법은 무엇입니까?

btnShow.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
     showTable(); 

     } 

    }); 
    panel_1.add(btnShow); 

private void showTable() { 
    fillData(); 
    //filldata used to fill object data for table using date specified by user     


       MyTableModel model=new MyTableModel(); 
       model.setModel(data,col,totalrow); 
       table = new JTable(model); 
       table.setForeground(new Color(255,0,0)); 
       System.out.println("after table"); 
       panel_2.add(new JScrollPane(table)); 
       panel_2.setVisible(true); 
       table.setVisible(true); 
       System.out.println("after scroll pane"); 

} 
+3

질문에 답하면 표에 표시된 데이터를 업데이트하려고합니다. 하지만 청취자는 완전히 새로운 JTable을 만들어 패널에 추가합니다. 그럼 당신의 의도는 정확히 무엇입니까? –

답변

4

매번 새로운 JTable을 생성하지 마십시오. 대신 모델을 가져 와서 데이터를 바꿀/편집하거나 (최상) 테이블에 새 모델 ("ok")을 지정하십시오.

모델의 데이터가 변경된 후에는 "fireTableXXX"메소드를 호출해야합니다.

.fireTableDataChanged()를 호출하면 모든 데이터가 다시로드됩니다. 변경된 행이나 셀을 지정하여 모두 다시로드 할 필요가 없도록하는 방법도 있습니다.

+1

+1 기존 테이블에서 모델을 업데이트/교체합니다. ActionListener가 아니라 적절한 "fireXXX"메소드를 호출하는 모델임을 주목하십시오. – camickr

1

하지만 내 JTable가이 내용

새 테이블을 만드는하지만 표는 GUI에 표시되지 않기 때문에이다

을 변경하지 않는 방법을 몇 가지.

panel_2.add(new JScrollPane(table)); 

이것은 구성 요소를 GUI에 추가하지만 구성 요소의 크기는 (0, 0)입니다. 표시되는 GUI에 구성 요소를 추가 할 때 다음과 같은 코드가 필요합니다.

panel.add (...); panel.revalidate(); panel.repaint(); // 때로는 필요합니다

그러면 레이아웃 관리자가 패널에서 호출되고 추가 된 구성 요소가 적절한 위치에 표시됩니다.

그러나 더 나은 해결 방법은 Xabster에서 제안한 것처럼 표시된 테이블에서 기존 모델을 업데이트/교체하는 것입니다.

관련 문제