Question

J'essaie de remplir une JTable existante dans un JForm existant.Tout va bien, à l'exception du formatage de CellRenderer (les formats informatiques à une monnaie £) n'est pas maintenu une fois que la table est transmise au JForm d'origine.Les données sont correctes mais le formatage échoue.

Cependant, il est maintenu dans la routine populatettable_new2.

J'ai la routine suivante:

public static void startFormPopulateResourcesTable2() throws
        SQLException, ParseException {
    String SQL;

    SQL = "SELECT tbl_deals.ID, tbl_stocks.stock_name AS Stock, ";
    SQL = SQL + "tbl_deals.purchase_date AS `Purchase Date`, ";
    SQL = SQL + "tbl_premium_types.premium_type AS Type, ";
    SQL = SQL + "tbl_deals.share_quantity AS Qty, ";
    SQL = SQL + "tbl_deals.total_cost_of_purchase AS `Total ";
    SQL = SQL + "Purchase Cost`, tbl_deals.sell_date AS ";
    SQL = SQL + "`Sale Date`, tbl_stocks.ID, ";
    SQL = SQL + "tbl_deals.purchase_share_price AS `Original ";
    SQL = SQL + "Share Price`, tbl_deals.target_share_price_today ";
    SQL = SQL + "AS `Target Price Today`, ";
    SQL = SQL + "tbl_deals.target_share_price_30_days AS `Target ";
    SQL = SQL + "Price 30 Days`, tbl_stocks.web_site_link, ";
    SQL = SQL + "tbl_stocks.forum_web_site_address FROM ";
    SQL = SQL + "tbl_premium_types INNER JOIN (tbl_stocks INNER ";
    SQL = SQL + "JOIN tbl_deals ON tbl_stocks.ID = ";
    SQL = SQL + "tbl_deals.stock_id) ON tbl_premium_types.ID = ";
    SQL = SQL + "tbl_stocks.premium_type_id ORDER BY ";
    SQL = SQL + "tbl_stocks.stock_name";
    theModules.FormMessages.setStart_forumWebSiteAddressColumnNumber(12);
    theModules.FormMessages.setStart_stockIDColumnNumber(7);
    theModules.FormMessages.setStart_WebSiteAddressListBoxColumn(11);

    int[] visibleColumnNumbers;
    visibleColumnNumbers = new int[5];
    visibleColumnNumbers[0] = 0;
    visibleColumnNumbers[1] = 6;
    visibleColumnNumbers[2] = 7;
    visibleColumnNumbers[3] = 11;
    visibleColumnNumbers[4] = 12;

    int[] currencyColumnNumbers;
    currencyColumnNumbers = new int[4];
    currencyColumnNumbers[0] = 5;
    currencyColumnNumbers[1] = 8;
    currencyColumnNumbers[2] = 9;
    currencyColumnNumbers[3] = 10;

    Statement stmt = DBase.Connect1.DoConnect();
    Admin.FormControllers.populateTable_new2(SQL,
            theModules.FormMessages.getStart_tblDeals(),
            visibleColumnNumbers, stmt, currencyColumnNumbers);

}

... qui appelle celui-ci:

public static void populateTable_new2(String SQL, javax.swing.JTable thisTable, int[] invisibleColumnNumbers, Statement stmt, int[] currencyColumnNumbers) throws SQLException, ParseException {
    Statement thisSTMT;
    thisSTMT = DBase.Connect1.DoConnect();
    ResultSet rst;
    rst = thisSTMT.executeQuery(SQL);
    int theRowCount;
    DefaultTableModel thisDefaultTableModel;
    ResultSetMetaData meta = rst.getMetaData();
    int numberOfColumns = meta.getColumnCount();
    theRowCount
            = DBase.DatabaseValidation.countOfRecordsetRecordsWithUndefinedTable(SQL,
                    stmt);

    String[] theColumnName = new String[numberOfColumns];
    for (int n = 0; n < numberOfColumns; n++) {
        theColumnName[n] = meta.getColumnLabel(n + 1);
    }

    Object[][] theTableData = new Object[theRowCount][numberOfColumns];
    int n = 0;
    while (rst.next()) {

        for (int nn = 0; nn < numberOfColumns; nn++) {
            theTableData[n][nn] = rst.getString(nn + 1);
        }
        n = n + 1;
    }

    thisDefaultTableModel = new DefaultTableModel(theTableData,
            theColumnName);

    thisTable.setModel(thisDefaultTableModel);

    for (n = 0; n < thisTable.getColumnCount(); n++) {
        for (int nn = 0; nn < currencyColumnNumbers.length; nn++) {
            if (currencyColumnNumbers[nn] == n) {
                TableColumn thisColumn;
                thisColumn = thisTable.getColumnModel().getColumn(n);
                TableCellRenderer renderer = new FormatRenderer(NumberFormat.getCurrencyInstance());
                thisColumn.setCellRenderer(renderer);
            }
        }

        for (int nn = 0; nn < invisibleColumnNumbers.length; nn++) {
            if (invisibleColumnNumbers[nn] == n) {
                TableColumn thisColumn;
                thisColumn = thisTable.getColumnModel().getColumn(n);
                thisColumn.setMinWidth(0);
                thisColumn.setMaxWidth(0);
                thisColumn.setWidth(0);
                thisColumn.setPreferredWidth(0);
            }
        }

    }
}

Pouvez-vous m'aider à vous assurer que le formatage cellulaire fonctionne toujours une fois que la table est transmise à l'original JForm.Merci

Était-ce utile?

La solution

Chaque fois que vous créez et ajoutez un nouveau tablemodel à un JTABLE Un nouveau TableColumnModel est créé pour correspondre aux nouvelles données, de sorte que tous les rendriers personnalisés que vous avez affectés à une tableenne sont perdus.

Cependant, il est maintenu dans la routine populatettable_new2.

Dans cette routine, vous ajoutez les rendriers à la nappeColumn après avoir ajouté la table à la table.

Tout va bien, à l'exception du formatage de CellRenderer (les formats informatiques à la monnaie £) n'est pas maintenu une fois que la table est transmise à l'original JForm.

Ne comprend pas vraiment cette déclaration, mais je suppose que vous créez une fois de plus en créant un nouveau modèle à la table, mais n'attribuez pas les rendriers aux tableaux.

ou, en supposant que la structure de votre modèle est identique et que seules les données changent, alors après la première fois que vous créez le JTABLE avec un tabladile, vous pouvez utiliser:

table.setAutoCreateColumnsFromModel(false);  

et la nappolummodel ne sera pas recréée à chaque fois que vous utilisez un nouveau modèle pour la table.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top