2013-06-04 3 views
1

테이블을 업데이트하려고하는데 작동하지 않습니다. 테이블을 호출하는 전체 프로그램이 완료 될 때까지 테이블이 표시되지 않습니다. 이걸 어떻게 바꿀 수 있니? 창을 열면 데이터로 JTable을 채우고 싶습니다. 코드 실행을 중단하면 표가 데이터로 채워집니다. 실이 필요합니까? 어떻게 올바르게 사용할 수 있습니까? 내 코드는 아래와 같습니다.JTable의 데이터를 어떻게 채울 수 있습니까?

public class TestGUI extends DefaultTableCellRenderer implements TeststepEventListener { 

    public JFrame frame; 
    private JTable testcase_table; 
    private JTable teststep_table; 

    /** 
    * Create the application. 
    */ 
    public TestGUI() { 
     initialize(); 
     frame.setVisible(true); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 800, 600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JProgressBar progressBar = new JProgressBar(); 
     progressBar.setBounds(50, 68, 700, 14); 
     frame.getContentPane().add(progressBar); 

     JTextPane txtpnAutomotiveHmi = new JTextPane(); 
     txtpnAutomotiveHmi.setText("Automotive HMI"); 
     txtpnAutomotiveHmi.setBounds(362, 21, 205, 20); 
     frame.getContentPane().add(txtpnAutomotiveHmi); 

     testcase_table = new JTable(); 
     testcase_table.setBounds(50, 125, 350, 426); 
     frame.getContentPane().add(testcase_table); 

     teststep_table = new JTable(); 
     teststep_table.setBounds(399, 125, 350, 426); 
     frame.getContentPane().add(teststep_table); 
    } 
    private boolean testcase = true; 

    @Override 
    public void myEventOccurred(TeststepEvent event) { 
     TeststepData data = event.data(); 
     if (testcase) { 
      set_values(data.getDoc(), data.getTestcase()); 
     } 
     testcase = false; 

    } 
    private int i = 0; 
    LinkedList names = new LinkedList(); 

    private void set_values(Document doc, int testcase) { 
     frame.setTitle("Wuratbrot" + i); 
     i++; 
     Element element = doc.getRootElement(); 
     names.clear(); 
     if (element != null) { 
      List<Element> testCases = element.getChildren(); 
      //testcase_table.removeAll(); 
      //String[] title = {"Testcases"}; 


      for (Element testCase : testCases) { 
       names.add(testCase.getAttributeValue("name")); 
      } 

      DisplayData(names); 
     } 

     testcase_table.revalidate(); 
     frame.validate(); 
    } 

    private void DisplayData(List<String> Testcases) { 

     DefaultTableModel aModel = new DefaultTableModel() { 
      //setting the jtable read only 
      @Override 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 
     //setting the column name 
     Object[] tableColumnNames = new Object[1]; 
     tableColumnNames[0] = "TestCases"; 


     aModel.setColumnIdentifiers(tableColumnNames); 
     if (Testcases == null) { 

      testcase_table.setModel(aModel); 

      return; 
     } 

     Object[] objects = new Object[1]; 
     ListIterator<String> lstrg = Testcases.listIterator(); 
     //populating the tablemodel 
     while (lstrg.hasNext()) { 
      String newcus = lstrg.next(); 
      objects[0] = newcus; 


      aModel.addRow(objects); 
     } 

     //binding the jtable to the model 
     testcase_table.setModel(aModel); 
    } 
} 
+0

더 나은 도움을 위해 곧 [SSCCE] (http://sscce.org/), short, runnable, compilable 및 로컬 변수로 하드 코딩 된 DefaultTableModel 값을 사용하십시오. – mKorbel

답변

1

SwingWorker입니다. 데이터 수집은 doInBackground()에서 비동기 적으로 수행 될 수 있으며 process()publish()을 통해 이벤트 발송 스레드에서 TableModel을 안전하게 업데이트합니다. 특히 Sample Usage 섹션과이 tutorial 섹션을 참조하십시오. 또한, 이 청취하는 적절한 업데이트 이벤트가 발생합니다. DefaultTableModel 추가 코드는 필요하지 않습니다. 옆으로, setBounds()보다는 오히려 배치를 사용하십시오.

0

fireTableDataChanged이 필요합니다. 테이블 셀의 값을 변경 한 후 테이블 모델에서 호출해야합니다.

+1

'DefaultTableModel' 메소드는 이벤트를 시작합니다. 모델 외부에서 그것을해서는 안됩니다. – trashgod

+0

네, 확실히 가장 좋은 방법은'AbstractTableModel'을 사용하고 거기에 모든 것을 정의하는 것입니다. 방금 가능한 최소한의 변경으로 솔루션을 제공했습니다. –

관련 문제