我正在开发一个Java应用程序来显示和编辑车展的评判时间表。在此表中,每行代表一个时间段,每列代表一个判断。 Cell(ts,j)的内容是带有车辆ID和所有者ID的文本字符串。由于每辆车将有2或3个裁判,因此在该时段中每辆车将有2或3个单元格。此外,只要没有分配评判,就可以同时判断几辆汽车。
将汽车和汽车的评委分配到时段是一个非常复杂的问题,并且是在我的应用程序的上下文之外生成的。 IOW,我可以从文件中读取初始赋值,并为Swing JTable填充表Header和RowData。在这一点上,我的应用程序做得很好。我的应用程序的目的是允许调整现场,即节目的早晨的评审时间表。例如,法官可能不会出现,或者首席法官可能想要将汽车转移到不同的时段。因此,除了File Open菜单项外,该应用程序还将具有编辑选项,例如“Move Entry”和“Change Judge”。
但是,请注意,任何此类更改都必须遵守某些规则,例如不要期望评委同时判断两辆车等。这意味着我不能让用户直接编辑显示的内容。因此,我采用的方法是使用方法来更改构造表的数据,然后使用它来完全按照构造的方式重建表。
有了这个背景,这是我的问题:显示的表格不会改变。这是在首次创建数据之后使用的Update Table方法,以及在任何编辑之后再次使用的方法。这是一个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 :(得分:0)
我解决了我的问题:似乎我正在创建一个新的滚动窗格和scheduletable,每次调用updateScheduleTable()。通过在ConcoursTestGUIDialog()中创建调度表,它可以正常工作。我现在上传一个压缩的JAR,以便可以使用原始帖子中的链接下载它。 [或点击此处下载] [1]
[1]:http://www.efsowell.us/ed/Concours/ConcoursTest.zip&#34;点击此处&#34;点击此处