Avatar billede Bennysørensen Praktikant
18. december 2003 - 01:45 Der er 5 kommentarer

Et simpelt regneark, selv-opdaterende

Jeg har endnu en opgave: "Lav et program med en JTable, der skal have størrelsen 4x5 felter. Man skal kunne skrive i de 3 øverste rækker, mens hvert felt i den nederste række automatisk beregnes som summen af felterne i søjlen, hvor tomme felter eller tekst regnes som 0."

Well, jeg er nået et stykke, men synes at det her må kunne laves ualmindeligt meget lettere. Et problem er at JTable tager et todimensionelt array af Objects, og så kan jeg ikke bare klaske int's ind over det hele. Det er lykkedes mig at få beregnet på array'et, men det er noget klamp: Gentagelser, gentagelser, gentagelser.
Kan det passe at man skal lave en inputbuffer og en eventlistener til hvert enkelt felt for at beregne automatisk? Hvordan gøres det let? Man kan vel lave en calculateAll(), der så trigges af events, kan det gøres uden at skulle assigne 20 eventlisteners? Og hvis det skal gøres, hvordan gøres det så simpelt uden at ligne resten af det kludder jeg har lavet?

Venligst (og her er noget klamp-kode):

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class JTable2 extends JFrame
{

    private    JPanel topPanel;
    private    JTable table;
    private    JScrollPane scrollPane;
        String s1 = "1", s2 = "2", s3 = "3", s4 = "4", s6 = "6", s7 = "7", s8 = "8", s9 = "9", s11 = "11",
        s12 = "12", s13 = "13", s14 = "14", s16 = "16", s17 = "17", s18 = "18", s19 = "19";
       
        int i5 = Integer.parseInt(s1)+Integer.parseInt(s2) +Integer.parseInt(s3)+Integer.parseInt(s4);
        int i10 = Integer.parseInt(s6)+Integer.parseInt(s7) +Integer.parseInt(s8)+Integer.parseInt(s9);
        int i15 = Integer.parseInt(s11)+Integer.parseInt(s12) +Integer.parseInt(s13)+Integer.parseInt(s14);
        int i20 = Integer.parseInt(s16)+Integer.parseInt(s17) +Integer.parseInt(s18)+Integer.parseInt(s19);
       
        String s5 = String.valueOf(i5);
        String s10 = String.valueOf(i10);
        String s15 = String.valueOf(i15);
        String s20 = String.valueOf(i20);
   

    public JTable2()
    {
       
        setTitle( "JTable2" );
        setSize( 400, 140 );
        setBackground( Color.gray );

       
        topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );

        String columnNames[] = { "1", "2", "3", "4" };
        String dataValues[][] =
        {
            { s1, s6, s11, s16 },
            { s2, s7, s12, s17 },
            { s3, s8, s13, s18 },
            { s4, s9, s14, s19 },
                        { s5, s10, s15, s20 }
        };

        table = new JTable( dataValues, columnNames );
                System.out.println(getValueAt(1,4));
               
        scrollPane = new JScrollPane( table );
        topPanel.add( scrollPane, BorderLayout.CENTER );
    }
    public static void main( String args[] )
    {
        JTable2 mainFrame = new JTable2();
        mainFrame.setVisible( true );
        }
}
Avatar billede jakoba Nybegynder
18. december 2003 - 01:57 #1
du kunne jo lave en metode der får et kolonnenummer som parameter og returnerer talværdien (eller 0)

int findTalVerdiSum( int colNr ) {
    int sum 0;
    for (int rowNr=0; rowNr<4; rowNr++ ) {
        sum += Integer.parseInt( dataValues[rowNr][colNr] )
    }
    return sum
}

for (int colNr=0; colNr<4; colNr++ ) {
    dataValues[4][colNr] = new String( findTalVerdiSum( colNr ) );
}

mvh JakobA
Avatar billede jakoba Nybegynder
18. december 2003 - 01:57 #2
Ups. Jeg har vist byttet om på kolonner og rækker, men princippet skulle være rimeligt klart.
Avatar billede viciodk Praktikant
18. december 2003 - 02:12 #3
Du mangler vist også nogle ;'er (mindre detalje) :)
Avatar billede jakoba Nybegynder
18. december 2003 - 02:17 #4
Det har du ret i.  For meget javascript :(
Avatar billede labanos Nybegynder
18. december 2003 - 08:15 #5
har du overvejet at bruge en TableModelListener på din model?... der kan du jo så passende smide den simple metode der regner sammen? Og selvfølgelig begrænse den til kun at genberegne den kolonne der blev ændret i?
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