Avatar billede langkiller Nybegynder
22. februar 2013 - 16:11 Der er 5 kommentarer og
1 løsning

JTable opdateres med en thread - fjern lag

Har en Jtable der opdaterer sig selv igennem en tråd/Thread, men den laver sådan en grim "hakke-bevægelse" når den opdaterer.. kan man undgå det på nogen måde. Eller opdatere jtable automatisk på en anden måde .
Min tråd:
thread = new Thread(new Runnable() {
            public void run() {
                try {
                    while (true) {
                            dvd = new DVDSortering();
                            data = dvd.sorterDvd(searchField.getText());
                            model = new DefaultTableModel(data, cols);
                            tableDVD.setModel(model);
                       
                        Thread.sleep(1000);
                    }
                } catch (Exception e) {
                }
            }
        });
        thread.start();
Avatar billede arne_v Ekspert
22. februar 2013 - 16:24 #1
For det foerste burde du bruge EventQueue.invokeLater til at opdatere GUI med.

For det andet skal du nok ikke lave en ny model, men bare informere om at data i model er aendret.
Avatar billede langkiller Nybegynder
22. februar 2013 - 16:31 #2
Er det noget du har et eksempel på. Det du siger giver ikke så meget mening for mig.
men er det noget i denne her stil ?

EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    dvd = new DVDSortering();
                    data = dvd.sorterDvd(searchField.getText(), sorterEfter);
                    model = new DefaultTableModel(data, cols);
                    tableDVD.setModel(model);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
Avatar billede arne_v Ekspert
22. februar 2013 - 17:05 #3
yes

det loeser ikke dit problem, men man maa aldrig opdatere GUI direkte fra en traad
Avatar billede arne_v Ekspert
22. februar 2013 - 17:07 #4
Et eksempel fra lageret:


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class UpdateTable extends JFrame {
    private int n = 0;
    private MyModel model = new MyModel();
    public UpdateTable() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("Simple table");
        JTable tbl = new JTable(model);
        getContentPane().add(new JScrollPane(tbl), BorderLayout.CENTER);
        JButton btn = new JButton("Add");
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev) {
                n++;
                model.add(n, "This is row " + n);
            }
        });
        getContentPane().add(btn, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new UpdateTable();
                f.setVisible(true);
            }
        });
    }
}

class MyModel extends AbstractTableModel {
    private List<String> colnam = new ArrayList<String>();
    private List<List<String>> data = new ArrayList<List<String>>();
    public MyModel() {
        colnam.add("F1");
        colnam.add("F2");
    }
    @Override
    public int getColumnCount() {
        return colnam.size();
    }
    @Override
    public int getRowCount() {
        return data.size();
    }
    @Override
    public String getColumnName(int colix) {
        return colnam.get(colix);
    }
    @Override
    public Object getValueAt(int rowix, int colix) {
        return data.get(rowix).get(colix);
    }
    public void add(int f1, String f2) {
        List<String> row = new ArrayList<String>();
        row.add(Integer.toString(f1));
        row.add(f2);
        data.add(row);
        fireTableDataChanged();
    }
}


Her skulle der saa laves en sort metode som sorterer data og saa kalder fireTableDataChanged.
Avatar billede langkiller Nybegynder
05. marts 2013 - 00:10 #5
tak for hjælpen arne_v. smid et svar :)
Avatar billede arne_v Ekspert
05. marts 2013 - 00:24 #6
svar
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