替换表模型数据

时间:2014-09-08 21:47:17

标签: jtable updating

我正在开发一个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);
        }
    });
}

1 个答案:

答案 0 :(得分:0)

我解决了我的问题:似乎我正在创建一个新的滚动窗格和scheduletable,每次调用updateScheduleTable()。通过在ConcoursTestGUIDialog()中创建调度表,它可以正常工作。我现在上传一个压缩的JAR,以便可以使用原始帖子中的链接下载它。 [或点击此处下载] [1]

[1]:http://www.efsowell.us/ed/Concours/ConcoursTest.zip&#34;点击此处&#34;点击此处