Avatar billede fastpoint Nybegynder
10. maj 2005 - 00:22 Der er 17 kommentarer og
1 løsning

JTabbedPane og JTable spørgsmål

Hvordan fylder man kolonner ud korrekt i en JTable?
pt. ser det sådan ud.

    raekker[0][0] = String.valueOf(vin.hentVareID());
    raekker[0][1] = vin.hentVareNavn();
    raekker[0][2] = String.valueOf(vin.hentUdsalgsPris());
    raekker[0][3] = String.valueOf(vin.hentTilbudPris());
    raekker[0][4] = vin.hentOmroede();
    raekker[0][5] = vin.hentLand();
    raekker[0][6] = String.valueOf(antal);

raekker er et 2 dimensionelt String array. I API'et kan man se de skriver Object[][] er det så forkert vi anvender String? Det virker fint.

Kan man gøre det lettere? Det er objekters indhold vi skal indsætte i vores JTable.

JTabbedPane.

Kan man disable enkelte faner? hvordan?
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 00:31 #1
Man kan lave sin egen TableModel:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/table/AbstractTableModel.html

Jeg laver lige et hurtigt eksempel der illustrerer det.
Avatar billede fastpoint Nybegynder
10. maj 2005 - 00:34 #2
tak! glemte lige et spørgsmål til angående JTabbedPane.
Hvilken metode skal man kalde hvis man fra faneblad 1 gerne vil blive sendt over til faneblad 3 efter et knap tryk event?
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 00:46 #3
Her kommer eksemplet med JTable og TableModel:

import java.awt.*;
import javax.swing.table.*;
import javax.swing.*;
import java.util.*;

public class JTableTest extends JFrame
{
    private MyTableModel model = new MyTableModel();
    private JTable table = new JTable (model);
   
    public JTableTest()
    {
        this.setSize(400, 400);
        this.getContentPane().add(new JScrollPane (table));
       
        for (int i = 0; i<10; i++)
            model.addTableElement(new MyObject (i, "Navn: " + i));
    }
   
    private class MyObject
    {
        int id;
        String name;
       
        public MyObject (int id, String name)
        {
            this.id = id;
            this.name = name;
        }
       
        public int getId()
        {
            return id;
        }
       
        public String getName ()
        {
            return name;
        }
       
        public void setId (int id)
        {
            this.id = id;
        }
       
        public void setName (String name)
        {
            this.name = name;
        }
    }
       
    private class MyTableModel extends AbstractTableModel
    {
        private String[] columns = new String[] {"Id", "Navn"};
        private ArrayList data;

        public MyTableModel()
        {
            data = new ArrayList();
        }
       
        public int getColumnCount()
        {
            return columns.length;
        }
       
        public int getRowCount()
        {
            return data.size();
        }
       
        public String getColumnName(int column)
        {
            return columns[column];
        }
       
        public MyObject getValueAt(int row)
        {
            return (MyObject)data.get(row);
        }
       
        public Object getValueAt(int row, int column)
        {
            MyObject element = (MyObject) data.get(row);
       
            switch (column)
            {
                case 0: return element.getId();
                case 1: return element.getName();
            }
            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: ((MyObject) data.get(row)).setName(value.toString());
                case 1: ((MyObject) data.get(row)).setId(Integer.parseInt(value.toString()));
            }
            fireTableCellUpdated(row, column);
        }
       
        public void addTableElement(MyObject 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);
        }
    }
   
    public static void main (String[] args)
    {
        new JTableTest().setVisible(true);
    }
}



Det smarte ved ovenstående er, at godt nok skal man skrive sin egen TableModel, men når det er gjort, er det rigtig nemt at fylde data i.
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 00:50 #4
Og mht JTabbedPane så kan man disable/enable enkelte faner med følgende:
pane.setEnabledAt(int index, boolean enabled);

Og for at vælge aktiv tab er der denne metode:
pane.setSelectedIndex(int index);

Her er noget godt læsning:
http://java.sun.com/docs/books/tutorial/uiswing/components/tabbedpane.html
og:
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTabbedPane.html
Avatar billede fastpoint Nybegynder
10. maj 2005 - 01:01 #5
har lidt problemer med at få eksemplet til at fungere.
skal det hele ind under en klasse? JTableTest
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 01:02 #6
Ja, for at køre eksemplet skal det hele ind i én klasse.

Når du finder ud af hvordan det fungerer, skal det nok udfaktoreres lidt.
Avatar billede fastpoint Nybegynder
10. maj 2005 - 01:02 #7
retur typen stemmer ikke her

      public Object getValueAt(int row, int column)
        {
            MyObject element = (MyObject) data.get(row);
       
            switch (column)
            {
                case 0: return element.getId();
                case 1: return element.getName();
            }
            return null;
        }
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 01:04 #8
Ahh.. Nej, hvis ikke du kører med java 1.5, skal det lige laves lidt om:

case 0: return String.valueOf (element.getId());
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 01:09 #9
Og følgende linjer:

case 0: ((MyObject) data.get(row)).setName(value.toString());
case 1: ((MyObject) data.get(row)).setId(Integer.parseInt(value.toString()));

Skal lige ændres til:

case 0: ((MyObject) data.get(row)).setId(Integer.parseInt(value.toString())); break;
case 1: ((MyObject) data.get(row)).setName(value.toString()); break;


Jeg havde lige fået byttet rundt på dem og glemt en 'break' :)
Avatar billede fastpoint Nybegynder
10. maj 2005 - 01:21 #10
prøver at danne mig et overblik.

Her gemmer man objektet i en arraylist

  public void addTableElement(MyObject element)
        {
            data.add(element);
            fireTableRowsInserted(data.size(), data.size());
        }

men hvor bliver indholdet er arraylisten hevet ud og op i jtable?
Avatar billede fastpoint Nybegynder
10. maj 2005 - 01:23 #11
private JTable table = new JTable (model);

er det nok? så ved den selv hvad der skal stå i de forskellige kolonner?
Avatar billede fastpoint Nybegynder
10. maj 2005 - 01:25 #12
den er ved at sive en nu:)
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 21:44 #13
1) JTablen tegner/viser sine værdier ved at gå ned i TableModel og spørge på: public Object getValueAt(int row, int column) - og derved hente værdierne.

2) Ja, det er nok. Du definerer i din tablemodel hvilke kolonner der skal være: private String[] columns = new String[] {"Id", "Navn"};


Spørg endelig, hvis der er mere...
Avatar billede mikkelbm Nybegynder
10. maj 2005 - 21:46 #14
2) fortsat - og i din getValueAt metode definerer du hvilke værdier der hører til hvilke kolonner.
Avatar billede fastpoint Nybegynder
11. maj 2005 - 00:00 #15
Når man opretter en helt normal JTable.

new JTable(String[][],String[]);

opdatere indholdet er en JTable sig selv hvis man herefter sætter ny data ind i String[][] ? eller skal man kalde en metode i JTable?
Avatar billede mikkelbm Nybegynder
11. maj 2005 - 12:23 #16
Hvis du anvender en TableModel er det ikke nødvendigt at have en array ved siden af. Det eneste du skal, er at tilføje dine objekter igennem tablemodel med add metoden.
Avatar billede mikkelbm Nybegynder
12. maj 2005 - 18:18 #17
Kommet videre?
Avatar billede mikkelbm Nybegynder
15. maj 2005 - 23:53 #18
??
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