2013-05-11 3 views
0

JTable이 있습니다. 그리고 나는 이와 같은 방법으로 컬럼을 추가했습니다. JTable 채우기시 반복되는 값

private void createSearchResultTable() { 
    DefaultTableColumnModel columnModel = new DefaultTableColumnModel(); 
    String columnNames[] = {"Title", "Author", "Edition", "Availability", "Reserve"}; 

    for (int i = 0; i < columnNames.length; i++) { 
     TableColumn column = new TableColumn(); 
     column.setHeaderValue(columnNames[i]); 
     columnModel.addColumn(column); 
    } 
    tblBookSearchResults.setColumnModel(columnModel); 

    ButtonColumn buttonColumn = new ButtonColumn(tblBookSearchResults, reserveBook, 4); 
    buttonColumn.setMnemonic(KeyEvent.VK_ENTER); 
} 

enter image description here

는 지금은 MySQL 데이터베이스에서 검색 한 데이터로의 JTable을 채우는거야.

private boolean populateSearchResultTable(String title, String author, String publisher) { 
    con = DatabaseHandler.connectToDb(); 
    try { 
     if (title.trim().length() != 0) { 
      pst = con.prepareStatement("SELECT title, author, edition, status FROM book WHERE title LIKE ? "); 
      pst.setString(1, "%" + title + "%"); 
     } 
     else if (author.trim().length() != 0) { 
        // Say, this query is getting executed 
      pst = con.prepareStatement("SELECT title, author, edition, status FROM book WHERE author LIKE ? "); 
      //pst.setString(1, "%" + author + "%"); 
        pst.setString(1, "Dan"); 
     } 
     else if (publisher.trim().length() != 0) { 
      pst = con.prepareStatement("SELECT title, author, edition, status FROM book WHERE publisher LIKE ? "); 
      pst.setString(1, "%" + publisher + "%"); 
     } 
     rs = pst.executeQuery(); 
     int rowNum = 0; 
     while (rs.next()) {     
      tblBookSearchResults.setValueAt(rs.getString(1), rowNum, 1); 
     } 
     return true; 
    } catch (Exception e) { 
     JOptionPane.showMessageDialog(null, e.getLocalizedMessage()); 
    } 
    finally { 

    } 
    return false; 
} 

데이터 세트가 문제없이 검색되지만 값을 JTable로 설정하면 다음과 같이 표시됩니다.

enter image description here

첫 번째 값은 모든 열이 반복됩니다. 왜 이런 일이 일어나는지 알 수 없습니까? 이 문제를 해결하는 방법에 대한 제안은 감사하겠습니다.

감사합니다.

+0

더 나은 도움을 더 빨리 얻으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 일부 데이터를 하드 코딩합니다. –

답변

2

JTable을 업데이트 할 때 JTable#setValue을 사용하지 말고 대신 새 행을 추가하거나 모델을 통해 기존 행을 수정하십시오.

또한, 당신은 rowNum 값을 증가하지 않는, 그래서 당신은 항상

간단한 테이블의 첫 번째 행 예와 상호 작용하고

추가 할 스윙 Timer를 사용하는 간단한 예 모델에 새 행 ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 

public class TestTableModel01 { 

    public static void main(String[] args) { 
     new TestTableModel01(); 
    } 

    public TestTableModel01() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       final DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D", "E"}, 0); 
       JTable table = new JTable(model); 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       Timer timer = new Timer(500, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         if (model.getRowCount() < 100) { 
          int row = model.getRowCount(); 
          model.addRow(new Object[]{ 
           row + "x" + 0, 
           row + "x" + 1, 
           row + "x" + 2, 
           row + "x" + 3, 
           row + "x" + 4 
          }); 
         } else { 
          ((Timer)(e.getSource())).stop(); 
         } 
        } 
       }); 
       timer.start(); 
      } 
     }); 
    } 
} 
+0

나는 자바에 대해 아주 익숙해있어서 언급 한이 모델을 사용하는 것에 익숙하지 않다. 조금 더 자세히 설명해 주시겠습니까? 그리고 증가하는 실수를 지적 해 주셔서 감사합니다. 수정했지만 지금은 [this] (http://i.imgur.com/HP08Htz.png) – Isuru

+0

처럼 보입니다 [테이블 사용 방법] (http://docs.oracle.com/javase/)을보십시오. tutorial/uiswing/components/table.html). 스윙은 뷰/컨트롤을 모델로부터 분리하는 MVC (modle, control, view) 패러다임의 형태를 채택합니다. – MadProgrammer

+0

안녕하세요! 나는 너의 모범을 도우 려 노력했다. 'JFrame' 부분에 테이블을 추가하는 것과 관련된 한가지 문제를 제외하면 데이터가로드되고 있습니다. 위 코드 예제에서 완전히 새로운'JFrame'을 만듭니다. 맞습니까? 나는 기존의'JFrame'에 테이블을 추가하고 싶지 않습니다. [Here 's] (http://pastebin.com/DCMjYdqw) 내가 지금까지 가지고있는 코드. 현재 양식이 표를 제외하고 표시됩니다. – Isuru