자동차 프로그램의 심사 일정 테이블을 표시하고 편집 할 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);
}
});
}
를 클릭 "여기를 클릭"[예] (http://stackoverflow.com/a/8260663/230513)에 대한 참고. – trashgod