JTable aktualisieren

herschel

Grünschnabel
Hallo zusammen,

habe ein Problem mit meiner JTable und dem hinzufügen von neuen Werten..
Aufbau des Programms:
Ich habe eine Main, die sowohl ein workState und die GUI startet.
Die GUI ist in 2 Teile unterteilt. Eine Klasse, die ein Panel ist und die darauf liegende JTable enthält als auch ein Panel, dass die Config enthält.

Das Vorgehen:
Ich möchte aus meinen Textfeldern von der Config die Texte auslesen und sie dann anschließend an das workState übergeben. Anschließend packt die workState die Daten in eine LinkedList und zusätzlich in das Panel, wo die Table ist. Genau hier habe ich das Problem... die Daten werden in zwar in die Table geladen jedoch nicht angezeigt! Ich denke das liegt an der Referenzierung zwischen workState und dem Panel mit dem Table. Jedoch stehe ich komplett auf dem Schlauch wie ich die das vernünftig machen soll. Habe es mit repaint(), fireDataChanged() probiert, jedoch ohne erfolg.... Hat jemand eine Idee??
meine Table
Java:
public class WorkTable extends JPanel {

    /**
     *
     */
    private static final long serialVersionUID = 2053446323153016974L;

    final String[] columnNames = {"Firma", "Datum", "Kosten"};
    public DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
    public JTable table = new JTable(tableModel);
   
    public WorkTable(){
        createGui();
       
        }


    private void createGui() {
        JScrollPane pane = new JScrollPane(table);
        setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Unternehmen"));
        setLayout(new BorderLayout());
        tableModel.addTableModelListener(new TableModelListener(){

            @Override
            public void tableChanged(TableModelEvent arg0) {
                // TODO Auto-generated method stub
                System.out.println("Anzahl: " + table.getRowCount());
                System.out.println("Anzahl der Element: "  +Main.state.company.size());
            }
           
        });
        add(pane, BorderLayout.CENTER);
       
       
        // TODO Auto-generated method stub
       
    }

   

    public void addCompany(Unternehmen u){
        tableModel.addRow(new Object []{u.name,u.date,u.cost});
       
    }

   

    }

und mein WorkState
Code:
public class WorkState {
   
    public LinkedList <Unternehmen> company = new LinkedList();
    public WorkTable workTable = new WorkTable();
   
    JLabel label;
   
    public WorkState(){
       
    }

    public void addCompany(Unternehmen neu, JLabel label) {
        // TODO Auto-generated method stub
        company.add(neu);
        workTable.addCompany(neu);
        setLable(label);
        System.out.println(calCost());
       
    }
   
    public LinkedList<Unternehmen> getCompanyList(){
        return company;
    }

   
    public String setString(){
        String a = "0" ;
        for (int i = 0; i < company.size(); i++){
            a = a + " " + company.get(i).cost;
        }
    return a;

    }
   
    public int calCost(){
        int all = 0;
        for (int i = 0; i< company.size();i++){
        try {
        String cost = company.get(i).cost;
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance();   
        final Number parse = numberFormat.parse(cost);
        all += parse.intValue();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
        return all;
    }
   
    // sets all costs for an output
    // form 4 to 4,00€
    //return String
    public String getCost(){
        String allCosts = "0";
        NumberFormat numberFormat = NumberFormat.getCurrencyInstance();
        allCosts = numberFormat.format(calCost());
        return allCosts;
    }
   
    // sets a label text
    public void setLable(JLabel label){
        String cost = String.valueOf(calCost());
        label.setText(cost);
    }
   
    //creates a format String for an good output
    public String fromCompany(Unternehmen u){
        String company = "";
        company += u.name +"                                 ";
        if (company.length() > 25){
           
            company = company.substring(0, 25);
        }
        String cost = "";
        cost += u.cost +"                                 ";
        if (cost.length() > 25){
       
            cost = cost.substring(0, 25);
        }
        String date = "";
        date += u.date +"                                 ";
        if (date.length() > 25){
           
            date = date.substring(0, 25);
        }
       
        return company + date + cost;
    }

    public void clear() {
        // TODO Auto-generated method stub
        company.clear();
        workTable.removeAll();
       
    }
   
    }
 

youza

Erfahrenes Mitglied
Von der Tabelle her sollte des schon passen hab dir mal ein mini Beispiel zamgestellt:
Main:
Java:
import java.awt.GridLayout;
import java.util.Date;

import javax.swing.JFrame;


public class Main {

    public static void main(String[] args) {
     
        Unternehmen u = new Unternehmen();
        u.setCost("1200");
        u.setDate(new Date());
        u.setName("Gigatronik");
     
        WorkTable wt = new WorkTable();
        wt.addCompany(u);
        JFrame jfTest = new JFrame("Test");
        jfTest.setLayout(new GridLayout(2,0));
        jfTest.add(wt);
        jfTest.add(new AddCompany(wt));
        jfTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfTest.setVisible(true);
    }

}
Deine Worktable:
Java:
import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

public class WorkTable extends JPanel {

    /**
     *
     */
    private static final long serialVersionUID = 2053446323153016974L;

    final String[] columnNames = {"Firma", "Datum", "Kosten"};
    public DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
    public JTable table = new JTable(tableModel);
 
    public WorkTable(){
        createGui();
     
        }


    private void createGui() {
        JScrollPane pane = new JScrollPane(table);
        setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Unternehmen"));
        setLayout(new BorderLayout());
        tableModel.addTableModelListener(new TableModelListener(){

            @Override
            public void tableChanged(TableModelEvent arg0) {
                // TODO Auto-generated method stub
                System.out.println("Anzahl: " + table.getRowCount());
                System.out.println("Anzahl der Element: ");
            }
         
        });
        add(pane, BorderLayout.CENTER);
     
     
        // TODO Auto-generated method stub
     
    }

 

    public void addCompany(Unternehmen u){
        tableModel.addRow(new Object []{u.getName(),u.getDate(),u.getCost()});
     
    }

 

    }

Ein Panel zum hinzufügen von Unternehmen:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class AddCompany extends JPanel implements ActionListener{
    /**
    *
    */
    private static final long serialVersionUID = 1L;
    private JLabel[] jlTitles = new JLabel[3];
    private JTextField jtfDate = new JTextField();
    private JTextField jtfCost = new JTextField();
    private JTextField jtfName = new JTextField();
    private JButton jbAdd = new JButton("hinzufügen");
    private WorkTable wt;
    public AddCompany(WorkTable wt){
        this.wt = wt;
        jlTitles[0] = new JLabel("Name");
        jlTitles[1] = new JLabel("Date");
        jlTitles[2] = new JLabel("Cost");
      
        jbAdd.setActionCommand("ADD");
        jbAdd.addActionListener(this);
      
        this.setLayout(new GridLayout(4,2));
        this.add(jlTitles[0]);
        this.add(jtfName);
        this.add(jlTitles[1]);
        this.add(jtfDate);
        this.add(jlTitles[2]);
        this.add(jtfCost);
        this.add(new JLabel());
        this.add(jbAdd);
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        Unternehmen u = new Unternehmen();
        u.setName(jtfName.getText());
        u.setCost(jtfCost.getText());
        u.setDate(new Date());
        wt.addCompany(u);
      
    }

}

und ein Objekt Unternehmen (welches ich an deiner Stelle in company umbenennen würde):
Java:
import java.util.Date;

public class Unternehmen {
    private String name;
    private Date date;
    private String cost;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public String getCost() {
        return cost;
    }
    public void setCost(String cost) {
        this.cost = cost;
    }
 
 

}

Kannst dich ja vielleicht daran orientieren
Viele Grüße
Youza

@Edit:
Ich glaub aber es liegt daran dass du in deinem WorkState eine eigene Tabelle erstellst... Laufen die Daten dann überhaupt in die richtige WorkTable?