Avatar billede usse Nybegynder
31. maj 2007 - 22:34 Der er 13 kommentarer og
1 løsning

Hashmap til JTable/TableModel?

Jeg har et problem ang mit hashmap der skal sendes videre over i min jtable, som tablemodel jo styrer. Jeg bruger primært hashmap fordi at jeg definerer et id/key, som skal bruges meget i klassen.

ResultSet requestDonationDB = dbsql.select("EXEC requestDonation "+hospitalID+", "+bloodTypeID+", '"+amount+"', "+sameDelivery+"");
if(requestDonationDB.wasNull() == false)
{
                    while(requestDonationDB.next())
{
int donationID     = requestDonationDB.getInt(1);
String bloodType = requestDonationDB.getString(2);
double bloodPercentage     = requestDonationDB.getDouble(3);
String date = requestDonationDB.getString(4);
boolean request = requestDonationDB.getBoolean(5);
                                        if(donations.containsKey(donationID) == false)
addDonation(new DonationLine(donationID, bloodType, bloodPercentage, date, request));           
                       
}
return "ok";
}

public Object getValueAt(int r, int c)
{
        if(c == 0)
            donationActions.getDonations()
            return donationActions.getDonation(r).getDonationID();
        else if(c == 1)
            return donationActions.getDonation(r).getBloodType();
        else if(c == 2)
            return donationActions.getDonation(r).getBloodPercentage();
        else if(c == 3)
            return donationActions.getDonation(r).getDate();
        else if(c == 4)
            return donationActions.getDonation(r).getRequest();           
        else return false;           
    }

Håber der er nogen der kan hjælpe :)
Avatar billede mikkelbm Nybegynder
31. maj 2007 - 22:49 #1
Jeg kan ikke finde nogen steder hvor du beskriver problemet :) ?
Avatar billede usse Nybegynder
31. maj 2007 - 22:54 #2
Jamen et hashmap indeholder (key, object), og da jeg fra min database f.eks. har tilføjet hashmap der har id 51, 55, 60, 89 med tilhørende objekter. og tabelen tager fra row 0 og ikke 51.. derfor giver det en fejl:
print donation id 52 bloodtype 0+  percentage 9.73 date 2007-05-30 15:19:02.347 request true

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at bloodproject.model.TableModelDonation.getValueAt(TableModelDonation.java:23)
Avatar billede mikkelbm Nybegynder
31. maj 2007 - 23:07 #3
Nåh... Ja, det kan du selvfølgelig ikke. Du skal på en måde have lavet det om så du kan hente på indeks i din hashmap.

Nu ved jeg ikke hvad der sker inde i din donationActions, men du kan lave dit hashmap om på følgende måde:

java.util.HashMap<int, DonationLine> map = new java.util.HashMap<int, DonationLine>();
java.util.List<DonationLine> list = new java.util.ArrayList<DonationLine>(map.values());
DonationLine donationLine = list.get (index); // Her henter du så kolonne nummeret...
Avatar billede mikkelbm Nybegynder
31. maj 2007 - 23:09 #4
Så i stedet for at bruge din metode getDonation (id)
skal du nok lave en ny metode der hedder:

getDonationByIndex (int index)

Hvor du så henter på index i den List du har lavet ud fra values i hashmap'et.
Avatar billede usse Nybegynder
31. maj 2007 - 23:53 #5
public class DonationActions
{
    private HashMap<Integer, DonationLine> donations;
    private    List<DonationLine> list;
    private TableModelDonation tableModel;
    private DBSQL dbsql;
   
    public DonationActions()
    {
        this.dbsql     = new DBSQL();
        donations     = new HashMap<Integer, DonationLine>();
        list         = new ArrayList<DonationLine>(this.donations.values());
        tableModel     = new TableModelDonation(this);
    }
   
    public void addDonation(DonationLine dl)
    {
        donations.put(dl.getDonationID(), dl);
    }   
   
    public TableModelDonation getTableModelDonation()
    {
        return this.tableModel;
    }     
   
    public int getNumberOfRows()
    {
        return this.donations.size();
    }
   
    public DonationLine getDonationByIndex(int index)
    {
        return list.get(index);
    }   
   
    public DonationLine getDonation(int n)
    {
        return (DonationLine)donations.get(n);
    }
   
    public HashMap<Integer, DonationLine> getDonations()
    {
        return this.donations;
    }

    public String requestDonation(int bloodTypeID, int hospitalID, String amount)
    {
        try
        {
            boolean checkAmount = Checks.checkString(amount, 1, 20, 1);
            if(checkAmount == true)
            {
                int sameDelivery;
                if(this.donations.size() > 0)
                    sameDelivery = 1;
                else
                    sameDelivery = 0;

                ResultSet requestDonationDB = dbsql.select("EXEC requestDonation "+hospitalID+", "+bloodTypeID+", '"+amount+"', "+sameDelivery+"");
                if(requestDonationDB.wasNull() == false)
                {
                    while(requestDonationDB.next())
                    {
                        int donationID             = requestDonationDB.getInt(1);
                        String bloodType         = requestDonationDB.getString(2);
                        double bloodPercentage     = requestDonationDB.getDouble(3);
                        String date             = requestDonationDB.getString(4);
                        boolean request         = requestDonationDB.getBoolean(5);
               
                            if(.containsKey(donationID) == false)
                                addDonation(new DonationLine(donationID, bloodType, bloodPercentage, date, request));           
                       
                            System.out.println("donation id "+donationID+" bloodtype "+bloodType+" percentage "+bloodPercentage+" date "+date+" request "+request);
                    }
                    return "ok";
                }
                else
                {
                    return "Try again";
                }       
            }
            else
            {
                return "Amount should be between 1-20";
            }   
       
        }
        catch(Exception exception)
        {
            System.out.println("Exception in "+exception.getClass().getName()+": "+exception);
            return "Could not find your request";
        }           
    }


Her er det grundlæggende, men det virker ikke helt korrekt..
Avatar billede mikkelbm Nybegynder
31. maj 2007 - 23:59 #6
Igen forklarer du ikke hvad problemet er :) ?
Avatar billede usse Nybegynder
01. juni 2007 - 00:11 #7
Meningen med det her er at jeg ud fra donationID fra DB udtrækket skal sammenligne om donationID allerede eksisterer i arrayet som jtable/tablemodel består af, da metoden (requestDonation) kan blive kaldt adskellige gange med samme resultSet. Det er så menignen at jeg vil sammeligne resultSet donationID´et med array donationID´et. Da det jo er samme resultSet, og det vil sige at hvis metoden bliver kaldt igen og igen, opstår der dublikationer, så derfor skal de nye "requests" kun tilføjes :)
Her er et billede af gui hvis det kan hjælpe http://zerocontrol.dk/billeder/req.jpg
Avatar billede usse Nybegynder
01. juni 2007 - 00:13 #8
Her er den stored procedure jeg kalder hvis det kan hjælpe

ALTER PROCEDURE [dbo].[requestDonation]
-- Parameters
@hospitalID int,
@bloodTypeID int,
@amount    int,
@sameDelivery int

AS
-- Local variables
DECLARE @now dateTime
DECLARE @later dateTime
DECLARE @donationAmount int
-- Init variables
SET @now    = GETDATE()
SET @later    = DATEADD(d , 2, GETDATE())
SET @donationAmount = (SELECT COUNT(donationID)
                        FROM donation, donor
                        WHERE donor.bloodTypeID = @bloodTypeID
                        AND donation.cpr = donor.cpr
                        AND request = 'false')
IF(@amount <= @donationAmount)
BEGIN
    IF(@sameDelivery = 0)
    BEGIN
        -- Make new delivery get id
        INSERT INTO delivery(orderDate, deliveryDate, hospitalID) VALUES (@now, @later, @hospitalID)
        DECLARE @deliveryID int
        SET @deliveryID = (SELECT MAX(deliveryID) FROM delivery)
    END
    ELSE IF(@sameDelivery = 1)
    BEGIN
            -- Make new delivery get id
        SET @deliveryID = (SELECT MAX(deliveryID) FROM delivery)
    END

    -- Loop it trough
    DECLARE @count int
    SET @count = 0

    WHILE @count < @amount
    BEGIN

        DECLARE @donationID int

        SET @donationID    = (    SELECT TOP 1 donationID
                            FROM donation, donor, bloodType, delivery
                            WHERE donation.cpr = donor.cpr
                                AND donor.bloodTypeID = @bloodTypeID
                                AND bloodType.bloodTypeID = @bloodTypeID
                                AND DATEDIFF(day, donation.date, GETDATE()) < 10
                                AND request = 'false'
                            GROUP BY donationID)
           
        UPDATE donation SET request = 1 WHERE donationID = @donationID
        INSERT INTO deliveryList (donationID, deliveryID) VALUES (@donationID, @deliveryID)
        SET @count = @count + 1
    END
    -- Send back resultset with the
    SELECT donation.donationID, bloodType, bloodPercentage, date, request 
    FROM donation, donor, bloodType, deliveryList
    WHERE deliveryList.deliveryID = @deliveryID
        AND deliveryList.donationID = donation.donationID
        AND donation.cpr = donor.cpr
        AND donor.bloodTypeID = bloodType.bloodTypeID
        AND donation.request = 'true'
    GROUP BY donation.donationID, bloodType, bloodPercentage, date, request
    ORDER BY donation.donationID DESC
END
Avatar billede mikkelbm Nybegynder
01. juni 2007 - 00:24 #9
Din stored procedure er ikke interessant i den her sammenhæng. Men jeg kan se du rigtig nok har oprettet metoden:

public DonationLine getDonationByIndex(int index)
{
    return list.get(index);


Du skriver:

"men det virker ikke helt korrekt.."

Hvad er det der ikke virker? Er det det at hente på index? Er det dit kald til databasen? Eller hvad er det?
Avatar billede usse Nybegynder
01. juni 2007 - 00:30 #10
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at bloodproject.model.DonationActions.getDonationByIndex(DonationActions.java:47)
    at bloodproject.model.TableModelDonation.getValueAt(TableModelDonation.java:23)
kan det ikke have noget at gøre med at man loade ind values igen på list fra hash ?
Avatar billede mikkelbm Nybegynder
01. juni 2007 - 00:38 #11
Jo, det kan du have ret i. Prøv lige følgende løsning.

public DonationLine getDonationByIndex(int index)
{
    list = new ArrayList<DonationLine>(this.donations.values());
    return list.get(index);


Måske ikke lige den kønneste, men så kan vi da se om det virker.
Avatar billede usse Nybegynder
01. juni 2007 - 00:44 #12
hmm samme problem gah
Avatar billede usse Nybegynder
01. juni 2007 - 07:43 #13
wee.. det virker vidst smid lige et svar :)
Avatar billede mikkelbm Nybegynder
01. juni 2007 - 08:12 #14
Kommer her...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester