2013-08-19 2 views
2

JTable에 빈 행을 추가하는 데 도움이 필요합니다. 내 JTable에 대한 AbstractTableModel을 사용합니다! 여기에 작은 실행 프로그램이있어서 나를 도와주기가 더 쉽습니다.AbstractTableModel을 사용하여 JTable에 행 추가

메인 클래스 - TestClass.java

package testproject; 

import java.awt.event.ActionEvent; 
import java.util.ArrayList; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JTable; 

public class TestClass { 

    String[] header = {"Name", "Quantity"}; 
    ArrayList<Object[]> data = new ArrayList<Object[]>(); 

    public TestClass() { 
     data.add(new Object[]{"Apple", "234"}); 
     data.add(new Object[]{"Banana", "123"}); 
     data.add(new Object[]{"Cranberry", "346"}); 

     JFrame frame = new JFrame(); 
     JTable table = new JTable(new Model(data, header)); 
     JMenuBar menubar = new JMenuBar(); 
     JMenu editmenu = new JMenu("Edit"); 

     Action addrowaction = new AbstractAction("Add Row") { 
      private static final long serialVersionUID = 1433684360133156145L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       data.add(new Object[9]); 
      } 
     }; 

     frame.add(table); 

     frame.setJMenuBar(menubar); 
     menubar.add(editmenu); 
     editmenu.add(addrowaction); 

     frame.setLocationByPlatform(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.pack(); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new TestClass(); 
      } 
     }); 
    } 
} 

표 모델 -

package testproject; 

import java.util.ArrayList; 

import javax.swing.table.AbstractTableModel; 

public class Model extends AbstractTableModel{ 
    private static final long serialVersionUID = 6889542282067432083L; 

    private String[] header; 
    private ArrayList<Object[]> data; 

    public Model(ArrayList<Object[]> data, String[] header) { 
     this.header = header; 
     this.data = data; 
    } 

    @Override 
    public int getColumnCount() { 
     return header.length; 
    } 

    @Override 
    public String getColumnName(int column) { 
     return header[column]; 
    } 

    @Override 
    public int getRowCount() { 
     return data.size(); 
    } 

    @Override 
    public Object getValueAt(int row, int column) { 
     return data.get(row)[column]; 
    } 

    @Override 
    public void setValueAt(Object value, int row, int column) { 
     data.get(row)[column] = value; 
     fireTableCellUpdated(row, column); 
    } 
} 

Model.java

는 기본적으로 나는 빈 행을 추가하려면 편집 메뉴에서 액션을 사용하고 싶습니다. 제발 다른 링크로 대답하지 마! 나는 그것을 찾았지만 그것을 이해하지 못하거나 내 프로그램에 적합하지 않다!

편집 : 소스가 MadProgrammer으로 업데이트되었습니다! 한 가지 문제가 남아 있습니다. JTable을 어떻게 업데이트하여 창 크기를 조정해야하고 테이블이 업데이트되는 순간에 새 행이 표시됩니까?

  • 도움이 @MadProgrammer 댓글
+2

1- 데이터 모델을 변경하면 배열이이 작업에 적합하지 않습니다. 2 - 테이블 모델에 새로운 행 "객체"를 만들 메소드를 추가하십시오. – MadProgrammer

+0

@MadProgrammer 배열을 변경할 수 없습니다. 전체 프로그램을 기반으로해야합니다. 새 행 객체의 의미는 무엇입니까? – Gerret

+0

행은 대개 어떤 종류의 Object로 표현되며, 사용자의 경우이 배열은 2D 배열입니다. 배열은 당신이 성취하고자하는 것에 적합하지 않습니다. 동적으로 크기를 늘리기가 어렵고 오버 헤드가 높습니다. 'ArrayList'에 데이터를 저장하는 것이 더 좋을 것입니다.'ArrayList '을 사용할 수 있습니다. 여기서'ArrayList'의 각 항목은 행을 나타내며'Object []'는 열 값을 나타냅니다 ... – MadProgrammer

답변

3

주셔서 감사합니다, 배열은 이해하지만, 하드 & 계약을 확장하는 개념 쉽다. 대신 Collection을 사용하십시오. 이 example에서 MyModelArrayList<Row>으로 구현되는 List<Row>을 관리합니다. 각 은 각 열에 대한 속성을 갖는 Plain Old Java Object (POJO)입니다. 생성자를 사용하여 새 행을 삽입하는 메소드를 추가 한 다음 에 열을 추가해보십시오. 이 예제는 혼란을 피하기 위해 정적 중첩 클래스를 사용합니다.

+1

@ 게럿 [에 대한 simlair 질문을 참조하십시오] (http://stackoverflow.com/q/18281553/714968) – mKorbel

+0

@ mKorbel는 매력적인 예제를 인용; 내가 [실수] (http://stackoverflow.com/posts/12352838/revisions)를 만들었다는 것에 유의하십시오. :-) – trashgod

+0

@trashgod 내 편집 pls 좀 봐 주실 래요 :) 나는 한 가지 문제 만 남았습니다! – Gerret

관련 문제