Avatar billede trp79 Nybegynder
07. april 2003 - 15:58 Der er 3 kommentarer og
1 løsning

JTable for en JTable newbie

Jeg har en frame hvori jeg modtager et par arraylist's. I framen skal der være en JTable der er knyttet til en JScrollbar. JTablen skal bestå af 3 kolonner og firmaList.size() (en arraylist) rækker.

Jeg har lavet framen og har knyttet en JTable til en JScrollbar. Men hvordan laver jeg den sådan at JTablen er firmaList.size() "høj" og hvordan putter jeg værdier i de enkelte dele i tabellen?

Jeg har aldrig arbejdet med JTable før så jeg vil gerne have forklaringer og selvfølgelig også gerne noget kode :o)

Mvh
Torben

Her er som min klasse ser ud nu:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.text.*;
import javax.swing.event.*; //Bruges til ListSelectionListener
import java.io.*;

public class Stat1 extends javax.swing.JFrame {

    final ArrayList omsListe;
    final ArrayList firmaListe;

    public int minAar = -1;
    public int maxAar = -1;
    public Omsaetning omsTemp = null;

    public int minTemp;
    public int maxTemp;
    public int tempOms;
    public int iAltOms;

    Dimension screenSize; //Bruges til placering af frame
    Dimension selfBounds; //Bruges til placering af frame
    Toolkit toolkit = Toolkit.getDefaultToolkit(); //Bruges til placering af frame

    public Stat1(final ArrayList omsListe, final ArrayList firmaListe  ) {
        this.omsListe = omsListe;
        this.firmaListe = firmaListe;

        setSize(381,418);
        setResizable(false);
        screenSize = toolkit.getScreenSize();
        selfBounds = getSize();
        setLocation((screenSize.width - selfBounds.width) / 2, (screenSize.height - selfBounds.height) / 2);

        initComponents();

        for(int j=0;j<omsListe.size();j++)        //Søger omsListe igennem for det tidligste og seneste omsætningsår
          {
            omsTemp = (Omsaetning)omsListe.get(j);
            if(minAar==-1)
            {
                minAar=Integer.parseInt(omsTemp.getAar());
            }
            else if(minAar!=-1)
            {
                if(minAar>Integer.parseInt(omsTemp.getAar()))
                minAar=Integer.parseInt(omsTemp.getAar());
            }
            if(maxAar==-1)
            {
                maxAar=Integer.parseInt(omsTemp.getAar());
            }
            else if(maxAar!=-1)
            {
                if(maxAar<Integer.parseInt(omsTemp.getAar()))
                maxAar=Integer.parseInt(omsTemp.getAar());
            }
        }

          for(int i=minAar; i<=maxAar; i++)//Omsætningsårene tilføjes i comboboksene
          {
            jCBoxAar1.addItem(""+i);
            jCBoxAar2.addItem(""+i);
        }

          jBStat.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent event)
            {
                minTemp=Integer.parseInt((String)jCBoxAar1.getSelectedItem());//Det valgte år gemmes som integer
                maxTemp=Integer.parseInt((String)jCBoxAar2.getSelectedItem());
//                jTARes.setText("");

                iAltOms=0;
                for(int a=0; a<omsListe.size(); a++) //Finder den totale omsætning
                {
                    omsTemp = (Omsaetning)omsListe.get(a);
                    if(Integer.parseInt(omsTemp.getAar())<=maxTemp && Integer.parseInt(omsTemp.getAar())>=minTemp)
                    {
                        iAltOms+=Integer.parseInt(omsTemp.getOms());
                    }
                }
                System.out.println("Total Oms fra: "+minAar+"-"+maxAar+": "+iAltOms);
//                jTARes.append("Total Oms fra: "+minAar+"-"+maxAar+":\t\t"+iAltOms+"\n\n");

                for (int c=0; c<firmaListe.size(); c++)//Finder omsætning for hvert firma
                {
                    Firma ftemp = (Firma)firmaListe.get(c);
                    tempOms=0;
                    for(int b=0; b<omsListe.size(); b++)
                    {
                        omsTemp = (Omsaetning)omsListe.get(b);
                        if(omsTemp.getFirma().equals(ftemp.getNavn()) && Integer.parseInt(omsTemp.getAar())<=maxTemp && Integer.parseInt(omsTemp.getAar())>=minTemp)
                        {
                            tempOms+=Integer.parseInt(omsTemp.getOms());
                        }
                    }
                    System.out.println(ftemp.getNavn()+": "+ tempOms);
//                    jTARes.append(ftemp.getNavn()+":\t\t"+ tempOms+"\n");
                    //jTARes.append("------------------------------\n");

                }


            }});

    }

        private void initComponents() {
        jCBoxAar2 = new javax.swing.JComboBox();
        jCBoxAar1 = new javax.swing.JComboBox();
        jBStat = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable(firmaListe.size(), 2);
        lStartAar = new javax.swing.JLabel();
        lSlutAar = new javax.swing.JLabel();
        lOverskrift = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        lOmsIAlt = new javax.swing.JLabel();

        getContentPane().setLayout(null);

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        getContentPane().add(jCBoxAar2);
        jCBoxAar2.setBounds(140, 90, 90, 20);

        getContentPane().add(jCBoxAar1);
        jCBoxAar1.setBounds(20, 90, 90, 20);

        jBStat.setText("Beregn");
        getContentPane().add(jBStat);
        jBStat.setBounds(270, 90, 90, 20);

        jScrollPane2.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                //{null, null},
                //{null, null},
                //{null, null},
                //{null, null}
            },
            new String [] {
                "Firma", "Omsætning", "i %"
            }
        ));

//        jTable1.setModel(omsListe.size(), omsListe.size());

        jScrollPane2.setViewportView(jTable1);

        getContentPane().add(jScrollPane2);
        jScrollPane2.setBounds(20, 150, 340, 230);

        lStartAar.setText("Start \u00e5r");
        getContentPane().add(lStartAar);
        lStartAar.setBounds(20, 70, 50, 16);

        lSlutAar.setText("Start \u00e5r");
        getContentPane().add(lSlutAar);
        lSlutAar.setBounds(140, 70, 50, 16);

        lOverskrift.setFont(new java.awt.Font("Book Antiqua", 1, 24));
        lOverskrift.setText("Statistik");
        getContentPane().add(lOverskrift);
        lOverskrift.setBounds(150, 10, 120, 30);

        lOmsIAlt.setText("Samlet oms\u00e6tning i perioden:");
        getContentPane().add(lOmsIAlt);
        lOmsIAlt.setBounds(20, 130, 250, 16);

        getContentPane().add(jSeparator1);
        jSeparator1.setBounds(0, 50, 380, 10);

        pack();
    }

    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        dispose();
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel lStartAar;
    private javax.swing.JLabel lOmsIAlt;
    private javax.swing.JComboBox jCBoxAar1;
    private javax.swing.JComboBox jCBoxAar2;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel lOverskrift;
    private javax.swing.JLabel lSlutAar;
    private javax.swing.JButton jBStat;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JTable jTable1;
    // End of variables declaration

}
Avatar billede viht Nybegynder
08. april 2003 - 11:47 #1
Et simpelt JTable eksempel.

Du skal bruge en tablemodel som styrer tabellens data.
//ATableModel.java:
import javax.swing.table.AbstractTableModel;
import javax.swing.*;

import java.util.ArrayList;

public class ATableModel extends AbstractTableModel {
    private String[] columns = { "Navn", "Adresse", "Telefonnummer" };
      private ArrayList data;

    public ATableModel() {
        data = new ArrayList();
    }

  public int getColumnCount() {
      return columns.length;
  }
   
  public int getRowCount() {
      return data.size();
  }

  public String getColumnName(int column) {
      return columns[column];
  }

  public Object getValueAt(int row, int column) {
      TableElement element = (TableElement)data.get(row);
      if( column == 0 )
            return element.getNavn();
      else if( column == 1 )
          return element.getAdresse();
      else if( column == 2 )
          return element.getTelefonnummer();
      return null;
  }

  public Class getColumnClass(int column) {
      return getValueAt(0, column).getClass();
  }

  public boolean isCellEditable(int row, int column) {
      return true; // alle celler er editerbare
  }

  public void setValueAt(Object value, int row, int column) {
      switch( column ) {
          case 0: {
              ((TableElement)data.get(row)).setNavn((String)value);
          } break;
          case 1: {
              ((TableElement)data.get(row)).setAdresse((String)value);
          } break;
          case 2: {
              ((TableElement)data.get(row)).setTelefonnummer((Integer)value);
          } break;
      }
      fireTableCellUpdated(row, column);
    }
   
    public void addTableElement(TableElement element) {
        data.add(element);
        fireTableRowsInserted(data.size(), data.size());
    }
   
    public void removeTableElement(int index) {
        if( !(index == -1) ) {
            data.remove(index);
            fireTableRowsDeleted(index, index);
        }
    }
    public void removeAll() {
          int slut = data.size();
          data.clear();
          fireTableRowsDeleted(0, slut);
    }
}

Dette objekt repræsenterer en række i tabellen.
//TableElement.java:
public class TableElement {
   
  private String navn;
  private String adresse;
  private Integer telefonnummer;


    public TableElement(String navn, String adresse, Integer telefonnummer) {
        this.navn = navn;
        this.adresse = adresse;
        this.telefonnummer = telefonnummer;
    }
   
    public void setNavn(String navn) {
        this.navn = navn;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    public void setTelefonnummer(Integer telefonnummer) {
        this.telefonnummer = telefonnummer;
    }
    public String getNavn() {
        return (this.navn);
    }

    public String getAdresse() {
        return (this.adresse);
    }

    public Integer getTelefonnummer() {
        return (this.telefonnummer);
    }

    public String toString() {

        StringBuffer toString = new StringBuffer();
        toString.append("\nnavn = ");
        toString.append(navn);
        toString.append("\nadresse = ");
        toString.append(adresse);
        toString.append("\ntelefonnummer = ");
        toString.append(telefonnummer);
        toString.append("\n");
       
        return new String(toString);
    }
}

En test klasse.
//TableTest.java:
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;
import java.awt.event.*;
import java.awt.*;

public class TableTest extends JFrame {
   
    private JTable table;
    private ATableModel tableModel;

    public TableTest() {
        super("TableTest");
        setSize(400,400);
        getContentPane().setLayout(new BorderLayout());
       
        tableModel = new ATableModel();
        table = new JTable(tableModel);
        table.getTableHeader().setReorderingAllowed(false);
        table.getTableHeader().setResizingAllowed(false);
       
        table.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent event) {
               
            }
        });
       
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
       
        JPanel buttons = new JPanel();
        JButton addButton = new JButton("Tilføj");
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
              addElement();
            }
        });
        buttons.add(addButton);

        getContentPane().add(buttons, BorderLayout.SOUTH);
      }
   
    private void addElement() {
       
        JTextField nameField = new JTextField("Navn");
        JTextField adresseField = new JTextField("Adresse");
        JTextField telefonnummerField = new JTextField("75834029");
       
        String[] options = new String[] { "Ok", "Annuller" };
        Object[] messages = new Object[] {    nameField,
                                                        adresseField,
                                                        telefonnummerField
                                                    };
       
        int ret = JOptionPane.showOptionDialog    (    this,
                                                                messages,
                                                                "Indtast",
                                                                JOptionPane.DEFAULT_OPTION,
                                                                JOptionPane.INFORMATION_MESSAGE,
                                                                null,
                                                                options,
                                                                options[0]
                                                            );
        if( ret == 0 ) {
            TableElement element = new TableElement(    nameField.getText(),
                                                                    adresseField.getText(),
                                                                    new Integer(telefonnummerField.getText())
                                                                );
            tableModel.addTableElement(element);
        }
    }
    public static void main(String[] args) {
        new TableTest().show();
    }
}
Avatar billede trp79 Nybegynder
08. april 2003 - 19:10 #2
Er en JTable dynamisk?
Tanken er nemlig den at når man trykker på knappen skal den udfra de valgte år i comboboksen skrive værdier i JTablen (se http://www.confunded.dk/TP/sc.JPG)

Hvis det ikke som standard er dynamisk hvordan gør man det det så, hvis man altså overhovedet kan?
Avatar billede trp79 Nybegynder
08. april 2003 - 19:51 #3
Okey, sorry - var lige lidt for hurtig der....
Selvfølgelig er din udgave dynamisk, men det er en JTable da ikke som standard?
Avatar billede trp79 Nybegynder
08. april 2003 - 20:37 #4
Jeg har fået det til at funke nu, brugte hele din klasse istedet :o) :o)
Super lækkert :o)
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