2015-01-31 6 views
1

프랑스에서 Euro2016의 팀, 경기 및 골을 표시하는 간단한 프로그램을 만들고 있습니다. 쿼리를 변경할 때 JTable에 문제가 있습니다. 여기 무슨이다 :JTable 새로 고침하는 방법

http://i60.tinypic.com/kcxe1c.png

enter image description here

나는 그것이 작동하는 5 행을 포함하는 다른 하나 (예를 들어) 10 행의 표에서 변경할 때. 그러나 5 행을 포함하는 테이블에서 다른 10 행으로 변경하면 테이블이 변경되지 않고 5 행만 표시됩니다. 다음 코드 : 여기

public class Euro2016GUI extends JFrame { 

private Container container; 
private Sfondo pnlSfondo; 
JTable table; 
JPanel panel; 

static Vector<Vector<String>> data = new Vector<Vector<String>>(); 
static Vector<String> headers = new Vector<String>(); 

public Euro2016GUI() { 
    data.removeAll(data); 
    headers.removeAll(headers); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    this.setSize(600, 400); 
    this.setTitle("Euro2016"); 
    this.setLocationRelativeTo(null); 
    pnlSfondo = new Sfondo(); 

    container = this.getContentPane(); 
    container.add(pnlSfondo); 
} 

public void createTable(String pQuery) { 
    data.removeAll(data); 
    headers.removeAll(headers); 

    Control control = new Control(); 

    panel = new JPanel(new BorderLayout()); 
    panel.setSize(300, 300); 
    panel.setBackground(Color.red); 

    control.getData(pQuery); 
    data = control.getData(); 
    headers = control.getHeaders(); 

    //this is the model which contain actual body of JTable 
    DefaultTableModel model = new DefaultTableModel(data, headers); 

    table = new JTable(model); 
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    table.setEnabled(false); 
    table.setMaximumSize(new Dimension(100, 300)); 

    header_size(); 

    JScrollPane scroll = new JScrollPane(table); 
    //scroll.setSize(600, 400); 
    scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

    this.getContentPane().add(panel); 
    panel.add(scroll, BorderLayout.CENTER); 
} 

public void header_size() { 
    int colonne = table.getColumnModel().getColumnCount(); 
    TableColumn column; 

    for (int i = 0; i < colonne; i++) { 
     column = table.getColumnModel().getColumn(i); 
     column.setPreferredWidth(200); 
    } 
} 

public void cleanData() { 

    if (table != null) { 
     DefaultTableModel dm = (DefaultTableModel) table.getModel(); 
     dm.setRowCount(0); 
     table.revalidate(); 
    } 
    data.removeAll(data); 
    headers.removeAll(headers); 
    } 
} 

CLASS 제어

public class Control { 

private static Vector<Vector<String>> data = new Vector<Vector<String>>(); 
private static Vector<String> headers = new Vector<String>(); 

public void getData(String pQuery) { 

    // Enter Your MySQL Database Table name in below Select Query. 
    String query = pQuery; 
    Connection con = null; 
    ResultSet rs; 
    Statement st = null; 
    int colonne = 0; 

    data.removeAll(data); 
    headers.removeAll(headers); 

    try { 
     con = DBConnectionPool.getConnection(); 
     st = con.createStatement(); 

     rs = st.executeQuery(query); 

     ResultSetMetaData rsmd = rs.getMetaData(); 
     colonne = rsmd.getColumnCount(); 

     for (int i = 1; i <= colonne; i++) { 
      headers.add(rsmd.getColumnName(i)); 
     } 

     while (rs.next()) { 
      Vector<String> d = new Vector<String>(); 

      for (int i = 1; i <= colonne; i++) { 
       d.add(rs.getString(i)); 
      } 
      data.add(d); 
     } 

    } catch (SQLException e) { 
     e.printStackTrace(); 

    } finally { 
     if (st != null) { 
      try { 
       st.close(); 
      } catch (SQLException ex) { 
       Logger.getLogger(DataInJTable.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
     if (con != null) { 
      DBConnectionPool.releaseConnection(con); 
     } 
    } 
} 

public Vector<Vector<String>> getData() { 
    return this.data; 
} 

public Vector<String> getHeaders() { 
    return this.headers; 
} 

}

메뉴의 액션 청취자 : 내가 잘못

... 
//----ROSE---// 
private class OnClickRose implements ActionListener { 

    Sfondo sfondo; 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String str = e.getActionCommand(); 
     str = str.replace("[", ""); 
     str = str.replace("]", ""); 

     String sx = "'"; 
     String dx = "'"; 
     String query = query2.concat(sx.concat(str.concat(dx))); 
     //frame.cleanData(); 

     sfondo = frame.getPnlSfondo(); 
     if (sfondo.isVisible() && sfondo.getParent().isVisible()) { 
      sfondo.setVisible(false); 
     } 

     frame.createTable(query); 
    } 
} 

//----CALENDARIO----// 
private class OnClickCalendario implements ActionListener { 

    Sfondo sfondo; 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     frame.cleanData(); 
     sfondo = frame.getPnlSfondo(); 

     if (sfondo.isVisible() && sfondo.getParent().isVisible()) { 
      sfondo.setVisible(false); 
     } 

     frame.createTable(query4); 
    } 
} 

//----CLASSIFICA MARCATORI----// 
private class OnClickMarcatori implements ActionListener { 

    Sfondo sfondo; 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     frame.cleanData(); 
     sfondo = frame.getPnlSfondo(); 

     if (sfondo.isVisible() && sfondo.getParent().isVisible()) { 
      sfondo.setVisible(false); 
     } 

     frame.createTable(query3); 
    } 
} 
... 

아무도 말해 줄 수 있을까요?

+4

먼저, JTable을 다시 만들 필요는 없습니다. 단일 인스턴스를 만들고 TableModel을 변경하면 나머지 작업도 수행합니다. – MadProgrammer

+0

둘째, contentPane에 JTables를 계속 추가하지만 아무 것도 제거하지 않은 것처럼 보입니다. 이전 구성 요소가 여전히 남아 있기 때문에 문제가 발생할 것입니다. visible ... – MadProgrammer

+0

메뉴를 클릭 할 때마다 새 JPanel을 만들었습니다. 문제는 이전 패널이 여전히 표시 되었기 때문에 패널을 표시 할 때 패널의 가시성을 false로 설정하기로 결정했습니다. 새 쿼리 (메뉴에서 다른 메뉴로 이동할 때). 그것은 잔인한 방법으로도 효과가있는 것처럼 보입니다. 귀하의 조언을 염두에 두겠으며 최대한 빨리 코드 개선을 위해 노력하겠습니다. 내가 너에게 알려줄거야, 고마워. –

답변

-1

기본적으로 테이블을 새로 고치라고 말하면 테이블 모델의 메소드 fireTableDataChanged()를 호출하기 만하면됩니다. 쿼리를 실행 한 후 그래서 귀하의 예제에서, 당신은 단지 호출 할 수

((DefaultTableModel)yourTable.getModel()).fireTableDataChanged(); 

하지만 난 당신이 기본 테이블 모델의 사용을 중지하는 것이 좋습니다, 당신의 자신의 테이블 모델을 구현합니다. 일하기가 훨씬 쉽습니다.

+1

아니요, TableModel 외부에서 TableModel fireXxx 메소드를 호출 할 필요가 없습니다. 데이터가 올바르게 업데이트되면 모델은 필요한 이벤트를 자체적으로 실행합니다. – MadProgrammer

+1

이 답변은 나 빠졌거나 나 빠졌습니다. 테이블에 대한 문제를 해결하려는 경우 완전히 무시하십시오. –

관련 문제