Zeile in DefaultTableModel hinzufügen, ProgressBar

  • Themenstarter Themenstarter HilfmirBitte
  • Beginndatum Beginndatum
H

HilfmirBitte

Gast
Hallo,

ich poste mal direkt ein kurzes lauffähiges beispielprogramm:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;


public class TableBeispiel{
    
   TableModel model;
   JFrame frame;
   JTable table;

   public static void main( String[] args ){

      new TableBeispiel();
      
      
   }

    public TableBeispiel() {
        initFrame();
    }   

   public void initFrame(){
       
      model = new TableModel();
      model.setColumnCount(2);
      model.setRowCount(1);

      table = new JTable( model );

      
      frame = new JFrame( "Beispiel" );

      frame.getContentPane().add( new JScrollPane( table ),BorderLayout.NORTH);

      JButton button = new JButton("DRÜCK");
      button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                new ThreadClass(model, table).start();
            }
        });
      frame.add(button,BorderLayout.SOUTH);
      frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      frame.pack();
      frame.setVisible( true );
   }
}

class ThreadClass extends Thread{

    TableModel model;
    JTable table;

    public ThreadClass(TableModel model,JTable table) {
        this.model = model;
        this.table = table;
    }


    @Override
    public void run() {

        setze();
        
    }

    public void setze(){

       int zahl = 0;
        while(zahl < 200){

            try{
                zahl++;
                model.setValueAt(new Fortschritt(zahl), 0, 1);
                table.repaint();
                Thread.sleep(300);
            }catch(InterruptedException e){}
        }
    }

}


class Fortschritt implements Icon{
    public int wert;
    public Fortschritt(int wert) {
        this.wert = wert;
    }


    public int getIconHeight() {
        return 0;
    }
    public int getIconWidth() {
        return 0;
    }
    public void paintIcon(Component c, Graphics g, int x, int y) {
        g.setColor( Color.GREEN );
        g.fillRect( 0, 0, wert, 20 );
        g.setColor( Color.BLACK );
        g.drawString(wert+"", 100, 10);
    }
    
}

Hier Abgeleite DefaultTableModel Klasse

Java:
class TableModel extends DefaultTableModel{
    public Object[] objects;
    private Class[] classes;
    public String[] name;
    public int columnCount;
    public int rowCount;
    public ArrayList<Object> liste = new ArrayList<Object>();

    public TableModel(){
        objects = new Object[]{
                Float.valueOf( 0.12f ),
                new Fortschritt(50)
                
        };

        classes = new Class[]{
                Float.class ,
                Icon.class       
        };

        name = new String[]{
                "Titel","Fortschritt"
        };
    }

    public void setColumnCount(int wert){
        columnCount = wert;
    }
    
    public int getColumnCount() {
        return columnCount;
    }

    public void setRowCount(int wert){
        rowCount = wert;
    }
    
    public int getRowCount() {
        return rowCount;
    }

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

   
    public Object getValueAt(int rowIndex, int columnIndex) {
        
        return objects[ columnIndex ];
    }

    
    public Class getColumnClass(int columnIndex) {
        return classes[columnIndex];
    }

    
    public void setValueAt(Object variable, int rowIndex, int columnIndex) {
        objects[columnIndex] = variable;
    } 
    
}

// Dieser Abschnitt war eine Überlegung, Funktioniert nur nicht 

 public void addRow(Object a){
        
        for( Object sa : objects){
            liste.add(sa);
        }

        objects = new Object[liste.size()+1];

        for(int i = 0; i < liste.size()+1 ; i++  ){
            if(liste.size() == i){
                objects[i]= a;
            }else{
                objects[i] = liste.get(i);
            }
        }

        setRowCount(liste.size());

        liste.clear();
    }

Es geht mir darum das ich ein Fortschrittbalken ( Progressbar ) in einem JTable haben möchte, soweit klappt es auch.
Nur ich sitze ne weile daran und weiß nicht mehr weiter wie ich eine Zeile hinzufügen könnte.
Wäre euch dankbar für hilfreiche Tipps.

Mfg
 
Zuletzt bearbeitet von einem Moderator:
Deine Implementierung des TableModels bzw. Dein Ansatz ist fehlerhaft z.B. die getValueAt(...)
Warum verwendest Du nicht einfach die Methoden des DefaultTableModels wie sie implementiert sind? Diese decken ja Deine Anforderung größtenteils ab.
 
Hallo Michael,

das Problem ist, wenn ich dem DefaultTablemodel ein Icon ( Sprich meine Klasse Forstchritt oder auch ein JPanel ) adde, wird nicht das eigentliche Icon oder JPanel angezeigt sondern in Textform die Klasse um die es sich Handelt.

Ich war darauf aus ein JPanel oder Icon in der Tabelle zu haben für je Zeile wo ich dann drauf zeichne. Ich wüsste nicht inwiefern ich die Klasse DefaultTablemodel ( ageleitete ) ändern soll das es auch so funktioniert. Schau mir grad TableCellRenderer() an ... vielleicht ist das die Lösung.

Mfg
 
Schau mir grad TableCellRenderer() an ... vielleicht ist das die Lösung.
Das ist nie verkehrt, wenn man sich mit JTable bzw. dem Rendering Konzept von Swing auseinander setzt ;-)
In Deinem Fall sollte es ausreichen, wenn Du nur die getColumnClass(int index) von DefaultTableModel überschreibst, die restlichen Methoden sollten ja so passen.
Aber ein Renderer für die zweite Spalte ist nicht verkehrt.

Hier mal ein älterer BspCode von mir, in diesem habe ich eine JProgressBar als Renderer verwendet.
Java:
import java.awt.Component;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TableProgressBarDemo extends JFrame {
	private JTable table;
	private static ValueContainer[] values;
	private static DefaultTableModel model;

	public TableProgressBarDemo() {
		values = new ValueContainer[] { new ValueContainer(10, 100),
				new ValueContainer(80), new ValueContainer(30, 120) };
		table = new JTable(model = new DefaultTableModel(new Object[][] {
				{ "Element 1", values[0], "" }, { "Element 2", values[1], "" },
				{ "Element 3", values[2], "" }, }, new Object[] { "Element",
				"Fortschritt", "Bemerkung" })) {
			public boolean isCellEditable(int row, int column) {
				return column == 0;
			}
		};
		table.getColumnModel().getColumn(1).setCellRenderer(
				new ProgressRenderer());
		this.getContentPane().add(new JScrollPane(table));
	}

	public static void main(String[] args) {
		JFrame frame = new TableProgressBarDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		new Thread(new Runnable() {
			public void run() {
				Random rnd = new Random();
				int index;
				while (!values[0].isFinished() || !values[1].isFinished() || !values[2].isFinished()) {
					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					index = rnd.nextInt(values.length);
					values[index].setValue(values[index].getValue() + 10);
					model.fireTableDataChanged();
				}
				System.out.println("geschafft!");
			}
		}).start();
	}
}

class ValueContainer {
	private int currentValue, maxValue;

	public ValueContainer(int max) {
		this(0, max);
	}

	public ValueContainer(int cur, int max) {
		this.currentValue = cur;
		this.maxValue = max;
	}

	public void setValue(int value) {
		if (value > this.maxValue)
			this.currentValue = maxValue;
		else
			this.currentValue = value;
	}

	public int getValue() {
		return currentValue;
	}

	public int getMaximum() {
		return maxValue;
	}
	
	public boolean isFinished() {
		return currentValue>=maxValue;
	}
}

class ProgressRenderer extends DefaultTableCellRenderer {
	private JProgressBar progressBar;
	private ValueContainer cont;

	public ProgressRenderer() {
		progressBar = new JProgressBar();
		progressBar.setStringPainted(true);
		this.add(progressBar);
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
				row, column);
		if (value instanceof ValueContainer) {
			cont = (ValueContainer) value;
			progressBar.setMaximum(cont.getMaximum());
			progressBar.setValue(cont.getValue());
			progressBar
					.setString(cont.getValue() + " von " + cont.getMaximum());
			progressBar.setBorder(this.getBorder());
			progressBar.setBackground(this.getBackground());
			if (cont.isFinished())
				table.setValueAt("Fertig!", row, column+1);
			else
				table.setValueAt("Warte...", row, column+1);
			return progressBar;
		}
		return this;
	}
}
 
Danke Michael,

habe es jetzt mit ein SwingWorker und DefaultTableCellRenderer gelöst, dabei wie du die Methode ( getTableCellRendererComponent() ) überschrieben. Dabei habe ich auch von der DefaultTableModel Klasse abgeleitet und eine Add Methode implementiert die eine Objekt mit alle Infos ( Containerklasse siehe bei dir ) und den SwingWorker erwartet und ein aufruf von addRow() nach bearbeitung aufruft.

Dein Beispiel Programm hat mir dabei gut geholfen , danke 🙂
 

Zurück
Oben