Avatar billede roo104 Nybegynder
01. oktober 2003 - 17:22 Der er 16 kommentarer og
2 løsninger

Refresh JTable

Jeg har en applet med en JTable, når jeg trykket på en knap vil jeg have refreshet alle data i JTable'n.

Appletten laver tabellen ud fra en klasse:
table = new ServerTable().getServerTable();
JScrollPane scrollPane = new JScrollPane( table );

Det virker ogå, men jeg kan ikke få den til at refreshe tabellen.

Har lagt en ActionListener på kanppen:
refreshAllButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent as) {
                table = new ServerTable().getServerTable();
                repaint();
            }
        });

Jeg har også prøvet med:
table.updateUI();

Hvordan skal man gøre ?
Avatar billede conrad Nybegynder
01. oktober 2003 - 17:36 #1
prøv table.getModel().fireDataChanged()
Avatar billede conrad Nybegynder
01. oktober 2003 - 17:37 #2
undskyld fireTableDataChanged()
Avatar billede magoo20000 Nybegynder
01. oktober 2003 - 17:58 #3
Spørgsmålet har været fremme flere gange før her på Eksperten, se f.eks. http://www.eksperten.dk/spm/327572 - der er flere muligheder.

Eller søg her på sitet efter JTable.
Avatar billede roo104 Nybegynder
01. oktober 2003 - 18:17 #4
Jeg syntes jeg har været rundt over det hele nu, men alle steder skifter de hver enkelt celle, jeg vil skifte hele tabellen ud med nye objecter, faktisk lave en ny
Avatar billede roo104 Nybegynder
01. oktober 2003 - 18:37 #5
hvor skal fireTableDataChanged() ligges, i min applet eller tabel klassen ?
Avatar billede roo104 Nybegynder
01. oktober 2003 - 19:01 #6
Er det noget specielt når det er i en applet ?
Ingen af de metoder jeg har fundet virker
Avatar billede magoo20000 Nybegynder
01. oktober 2003 - 19:08 #7
fireTableDataChanged() genoptegner alle celler mens fireTableCellUpdated(int række, int kolonne) opdaterer cellen.
Avatar billede magoo20000 Nybegynder
01. oktober 2003 - 19:30 #8
Du er klar over, at Table models fyrer events i TableModelListener interface'et.

Lad os se lidt kode
Avatar billede roo104 Nybegynder
01. oktober 2003 - 19:33 #9
Har extends AbstractTableModel implements TableModel
Skal lige prøve noget, hvis ikke det virker paster jeg koden
Avatar billede magoo20000 Nybegynder
01. oktober 2003 - 19:34 #10
Avatar billede roo104 Nybegynder
01. oktober 2003 - 20:44 #11
Ok, tror jeg er ude i en go gang spagetti kode, men her komme den:

public class HLManager extends javax.swing.JApplet {
   
    public void init() {
      initComponents();
    } 
   
    /** Creates a new instance of HLManager */
    public void initComponents() {   
        //Jtable
        table = new ServerTable().getServerTable();
        JScrollPane scrollPane = new JScrollPane( table );
       
        javax.swing.table.TableColumn column = null;
        for (int i = 0; i < 7; i++) {
            column = table.getColumnModel().getColumn(i);
            switch(i) {             
                case 0:
                    column.setPreferredWidth(10);
                    break;
                   
                case 1:
                    column.setPreferredWidth(250);
                    break;
                   
                case 3:
                    column.setPreferredWidth(100);
                    break;
                   
                case 4:
                    column.setPreferredWidth(100);
                    break;
                   
                default:
                    column.setPreferredWidth(20);
                    break;
            }
        }     
       
        refreshAllButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent as) {
                ServerTable tabel = new ServerTable();
                //table = tabel.getServerTable();
                //table.updateUI();
                repaint();
            }
        });

Og min Tabel klasse:

public class ServerTable extends AbstractTableModel implements TableModel {
    private final JTable table;
    private Vector headings;
    private int rowCount;
    private Vector servers;
   
    public ServerTable() {
        headings = new Vector();
        headings.add("OS");       
        headings.add("Name"); 
        headings.add("Ping"); 
        headings.add("Game"); 
        headings.add("Map"); 
        headings.add("Players"); 
        headings.add("# buddies");   
        headings.add("Ip");
       
        servers = getServerArray();
        rowCount = servers.capacity();
        table = new JTable(servers,headings);
    }
   
    public JTable getServerTable() {
        return table;
    }
   
    public int getColumnCount()
    {
        return headings.size();
    } 
   
    public int getRowCount()
    {
        return rowCount;
    }
   
    public String getColumnName(int col)
    {
        return (String)headings.elementAt(col);
    }
   
    public Object getValueAt(int row, int col)
    {
        return (Object)servers.elementAt(row);
    }
Avatar billede roo104 Nybegynder
01. oktober 2003 - 20:47 #12
Men jeg tror jeg er nødt til at lave mig et klasse diagram, så jeg kan få styr på alle klasse inden jeg går igang, det kan laves 10 gange smartere end det jeg er i gang med nu 10.
Avatar billede _carsten Nybegynder
01. oktober 2003 - 21:48 #13
Prøv:  table = new ServerTable();

Bør opdatere tabel:
refreshAllButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent as) {
                table.fireTableDataChanged()
                table.repaint();  // Måske nødvendig
            }
        });
Avatar billede _carsten Nybegynder
01. oktober 2003 - 21:50 #14
Altså her:

/** Creates a new instance of HLManager */
    public void initComponents() {   
        //Jtable
        table = new ServerTable;
Avatar billede roo104 Nybegynder
02. oktober 2003 - 14:29 #15
Jeg har prøvet at følge eksemplet fra http://www.eksperten.dk/spm/327572
Jeg har en klasse som giver mig et objekt indeholdende en vector med x-antal vectorer, det burde ikke være noget problem at lave en JTable ud fra den. Når jeg trykker refresh skal den lave et nyt objekt med en vector med x-antal vectorer.

Jeg ville tro det bare var at sætte JTable tabel til at pege på et nyt objekt og fyre fireTableDataChanged() af. Men før jeg kan bruge fireTableDataChanged() skal tabellen være lavet som en AbstractTableModel med tilhørende metoder. Som jeg kan se det kan man ikke lige give AbstractTableModel en Vector og bede den lave en JTable, eller er jeg helt galt på den ?
Avatar billede roo104 Nybegynder
05. oktober 2003 - 14:50 #16
Så fik jeg dte til at virke, startede helt forfra, fandt aldrig ud af hvor min fejl lå, men nu virker det. Gik væk fra Vectorer og brugte Object[][], det gjorde det lidt nemmere at opdatere en enkelt række. Mit probelm lå nok også i at det var en række tråde der fyldte i tabellen, og den kunne ikke tegnes før alle tråde var færtige.
Det var ikke nødvendig med repaint(), fireTableDataChanged() var nok.
Hvis conrad og _carsten smider et svar kan i få 5 point hver, ellers går de til magoo.
Avatar billede _carsten Nybegynder
05. oktober 2003 - 19:32 #17
magoo20000 har svaret, så lad ham få point.
Avatar billede conrad Nybegynder
05. oktober 2003 - 21:37 #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