2014-09-08 4 views
0

자동차 프로그램의 심사 일정 테이블을 표시하고 편집 할 Java 응용 프로그램을 개발 중입니다. 이 표에서 각 행은 타임 슬롯을 나타내며 각 열은 판사를 나타냅니다. Cell (ts, j)의 내용은 자동차 ID와 소유자 ID가있는 텍스트 문자열입니다. 각 차량에는 2 명 또는 3 명의 심사 위원이있을 것이므로 각 열차에는 해당 시간대에서 심사중인 2 또는 3 개의 셀이 있습니다. 또한, 판사가 배정되지 않는 한 여러 차가 동시에 판단 될 수 있습니다.테이블 모델 데이터 바꾸기

차와 자동차의 타임 슬롯 할당은 심사 위원의 과제가 매우 복잡하며 앱의 컨텍스트 외부에서 생성됩니다. IOW, 파일에서 초기 할당을 읽고 Swing JTable의 Header 및 RowData 테이블을 채울 수 있습니다. 이 시점에서 내 응용 프로그램은 그냥 괜찮아요. 내 애플 리케이션의 목적은 공연의 아침 필드에서 심사 일정표 조정을 허용하는 것입니다. 예를 들어 판사가 나타나지 않거나 수석 판사가 차를 다른 시간대로 옮길 수 있습니다. 따라서 File Open 메뉴 항목 외에도 "Move Entry"및 "Change Judge"와 같은 편집 옵션이 있습니다.

그러나 그러한 변경 사항은 판사가 동시에 두 대의 차량을 판단 할 것으로 기대하지 않는 것과 같은 특정 규칙을 준수해야한다는 점에 유의하십시오. 즉, 사용자가 직접 표시된 내용을 편집하도록 할 수는 없습니다. 따라서 필자가 취한 접근법은 테이블을 구성하는 데이터를 변경하는 방법을 사용하고,이를 사용하여 테이블을 처음 생성 된 방식대로 정확하게 재구성합니다.

그 배경으로, 여기 내 문제가있다 : 표시된 테이블이 변경되지 않습니다. 데이터를 처음 만들고 다시 편집 한 후에 사용되는 업데이트 테이블 메서드는 다음과 같습니다. zippd JAR 파일이 있습니다. This is a simplified version 나는 Netbeans에서 일하고있다.

public void updateScheduleTable(){ 
scheduletable = new javax.swing.JTable(); 
schedulescrollpane = new javax.swing.JScrollPane(); 
scheduletable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF); 
List<ConcoursTestModel.TableColHeader> headerList; 
// 
// The schedule table header items must be extracted from theConcoursModel 
// 
headerList = theConcoursModel.UpdateScheduleTableHeader(); 

// Transfer list to array because that's what the table model constructor expect... 
ConcoursTestModel.TableColHeader[] headerArray = new ConcoursTestModel.TableColHeader[headerList.size()]; 
headerList.toArray(headerArray); // fill the headerArray 

// 
// The schedule table RowData must also be extracted from theConcoursModel 
// 
Object [][] rowArray = theConcoursModel.UpdateScheduleTableRowData(headerList); 
// Now construct the Table Model 


scheduletable.setModel(new javax.swing.table.DefaultTableModel(
    rowArray, 
    headerArray 
)); 
schedulescrollpane.setViewportView(scheduletable); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addContainerGap()) 
       .addComponent(schedulescrollpane))) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(24, 24, 24) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(schedulescrollpane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
    ); 

    JTableHeader tableHeader = scheduletable.getTableHeader(); 
    tableHeader.setBackground(java.awt.Color.lightGray); 
    Dimension d = super.getPreferredSize(); 
    d.height = HEADER_HEIGHT; // this doesn't work! 

    // Adjust the column widths to fit the data 
    scheduletable.setRowHeight(ROW_HEIGHT); 
    int width; 
    for(int j = 0; j < scheduletable.getColumnCount(); j++){ 
     // Calculate best column width 
     width = 0; 
     for (int row = 0; row < scheduletable.getRowCount(); row++) { 
      TableCellRenderer renderer = scheduletable.getCellRenderer(row, j); 
      Component comp = scheduletable.prepareRenderer(renderer, row, j); 
      width = Math.max (comp.getPreferredSize().width, width); 
     }   
     TableColumn c = scheduletable.getColumnModel().getColumn(j); 
     c.setPreferredWidth(width); 
    } 

}

내 문제를 해결
/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(ConcoursTestGUIDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(ConcoursTestGUIDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(ConcoursTestGUIDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(ConcoursTestGUIDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the dialog */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      ConcoursTestGUIDialog dialog = new ConcoursTestGUIDialog(new javax.swing.JFrame(), true); 
      dialog.addWindowListener(new java.awt.event.WindowAdapter() { 
       @Override 
       public void windowClosing(java.awt.event.WindowEvent e) { 
        System.exit(0); 
       } 
      }); 
      dialog.setVisible(true); 
     } 
    }); 
} 
+0

를 클릭 "여기를 클릭"[예] (http://stackoverflow.com/a/8260663/230513)에 대한 참고. – trashgod

답변

0

: 나는 updateScheduleTable 모든 호출로 새로운 스크롤 창 및 scheduletable를 생성 한 것 같다(). ConcoursTestGUIDialog()에서 scheduletable을 생성하면 올바르게 작동합니다. 압축 된 JAR 파일을 업로드하여 원본 게시물의 링크와 함께 다운로드 할 수 있습니다. [또는 다운로드하려면 여기를 클릭] [1]

[1] : http://www.efsowell.us/ed/Concours/ConcoursTest.zip 다음 작업이야 여기