Zeile in DefaultTableModel hinzufügen, ProgressBar

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:

Michael...

Top Contributor
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.
 
H

HilfmirBitte

Gast
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
 

Michael...

Top Contributor
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;
	}
}
 
H

HilfmirBitte

Gast
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 :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
F Zeile in mehreren Jtables bei Selektion markieren AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableRow / RowFactory Zeile einfärben AWT, Swing, JavaFX & SWT 9
T Zelle- und die Zeile-Farbenwechsel bei der Selektion in der Tabelle AWT, Swing, JavaFX & SWT 4
M TableView Zeile hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
C SWT Breadcrumb Zeile mit entsprechenden Hyperlinks erstellen AWT, Swing, JavaFX & SWT 0
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
Bluedaishi JTextArea gefundene Zeile nach Oben Scrollen AWT, Swing, JavaFX & SWT 13
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
T Swing Tabelle mit Button - Anzeigefehler nach Zeile entfernen AWT, Swing, JavaFX & SWT 1
T Swing JTable Zeile mit ausgelesenen Werten mit Hilfe von einem Button hinzufügen AWT, Swing, JavaFX & SWT 1
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
J Swing JTable Zeile nicht auswählbar machen AWT, Swing, JavaFX & SWT 0
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
J JTable Zeile anklicken und neues Frame öffnen AWT, Swing, JavaFX & SWT 4
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
D Swing Letzte Zeile einer JTable nicht über RowSorter sotieren AWT, Swing, JavaFX & SWT 2
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
I ausgewählte Zeile mit Hilfe der Tastatur löschen! AWT, Swing, JavaFX & SWT 3
B jTable ganze Zeile anhand eines Kriterium färben AWT, Swing, JavaFX & SWT 6
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
M JTextArea Zeile hinzufügen AWT, Swing, JavaFX & SWT 4
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
Ollek Swing JTable - Zeile löschen mit AbstractTableModel AWT, Swing, JavaFX & SWT 20
S Swing Kopieren einer vollständigen Zeile einer JTable AWT, Swing, JavaFX & SWT 3
F GroupableTableHeader zeigt nur eine Zeile AWT, Swing, JavaFX & SWT 4
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
N Swing FileReader Zeile lesen AWT, Swing, JavaFX & SWT 5
C SWT Wie greife ich auf den Inhalt einer bestimmten Zeile zu? (TableViewer) AWT, Swing, JavaFX & SWT 7
F SWT Tabelle Zeile auslesen AWT, Swing, JavaFX & SWT 3
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
K Zeile verbinden AWT, Swing, JavaFX & SWT 2
G Zeile in JTable durch rechte Maustaste manipulieren AWT, Swing, JavaFX & SWT 4
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
S Tabelle sortieren, mit Ausnahme der letzten Zeile AWT, Swing, JavaFX & SWT 9
P Aktuelle Zeile in JTextPane farblich hervorheben AWT, Swing, JavaFX & SWT 3
H Swing JComboBox in einer Zeile AWT, Swing, JavaFX & SWT 3
Meldanor Swing JTable - Eine neue Zeile vor einer bestehenden Einfügen AWT, Swing, JavaFX & SWT 2
F Zusätzliche Zeile in der GUI AWT, Swing, JavaFX & SWT 4
H Markierte Zeile löschen AbstractTableModel AWT, Swing, JavaFX & SWT 10
R Zeile in JTable anhand von Wert einfärben AWT, Swing, JavaFX & SWT 2
M Jframe wie bekommt man bei den zeile einen header erzeugen AWT, Swing, JavaFX & SWT 2
N JTable, Zeile bleibt immer selektiert.... AWT, Swing, JavaFX & SWT 3
Dit_ JTextArea zu Zeile X scrollen AWT, Swing, JavaFX & SWT 4
M [erledigt] Bestimmte Zeile aus JTextArea löschen AWT, Swing, JavaFX & SWT 3
F Swing JTable: Problem beim zeile löschen AWT, Swing, JavaFX & SWT 3
J Swing JList... mehrere Strings in Zeile AWT, Swing, JavaFX & SWT 8
N Methode zum ermitteln der editierte Zeile/Zelle in jTable AWT, Swing, JavaFX & SWT 8
C Mit SelectionListener herausfinden welche zeile in Jtable angeklickt wurde AWT, Swing, JavaFX & SWT 5
E In JTable neue Zeile mit Tabulator einfügen AWT, Swing, JavaFX & SWT 5
M Text in txt-Datei in letzte Zeile schreiben? AWT, Swing, JavaFX & SWT 14
R JTable Hintergrund der Zeile abhängig von Inhalt einer Zelle verändern AWT, Swing, JavaFX & SWT 3
Developer_X Swing text von bestimmter zeile in jtextarea herausbekommen. AWT, Swing, JavaFX & SWT 12
R JTable Zeile löschen AWT, Swing, JavaFX & SWT 4
T MyTableCellRenderer selektiert nicht die ganze Zeile AWT, Swing, JavaFX & SWT 3
R FlowLayout: 1 Objekt pro Zeile AWT, Swing, JavaFX & SWT 5
D eigenes Tablemodel, Zeile löschen ArrayindexOOB excp AWT, Swing, JavaFX & SWT 4
C JTable mit RowSorter und Drag & Drop: Zeile verschieben AWT, Swing, JavaFX & SWT 4
P JTable zeile einfärben AWT, Swing, JavaFX & SWT 1
N Farbe einer einzelnen Zeile einer JTable ändern AWT, Swing, JavaFX & SWT 10
G Componente Zeile fixieren AWT, Swing, JavaFX & SWT 3
dl85hej bestimmte Zeile anspringen AWT, Swing, JavaFX & SWT 3
S Zeile an eine Tabelle anfügen AWT, Swing, JavaFX & SWT 5
R JTable: Zellen einer Zeile zusammenfassen? AWT, Swing, JavaFX & SWT 3
D JTable um eine Zeile erweitern AWT, Swing, JavaFX & SWT 4
P Tabellen in Java - Zeile anhängen AWT, Swing, JavaFX & SWT 19
GilbertGrape JTable - immer leere Zeile AWT, Swing, JavaFX & SWT 6
A JTable zeile auswählen AWT, Swing, JavaFX & SWT 2
A JXTable jede zweite Zeile einfärben AWT, Swing, JavaFX & SWT 4
S in JTable eine Zeile färben AWT, Swing, JavaFX & SWT 5
T JTable ohne Titel in der ersten Zeile AWT, Swing, JavaFX & SWT 2
K leere Zeile zu JTable zufügen AWT, Swing, JavaFX & SWT 2
T jtabel - Zeile selktierbar aber nicht editierbar AWT, Swing, JavaFX & SWT 2
E JTable letzte Zeile in Fett schrift? AWT, Swing, JavaFX & SWT 3
O JTable + event wenn andere Zeile selektiert ist AWT, Swing, JavaFX & SWT 5
J jTextarea Anzahl Zeichen in einer Zeile begrenzen AWT, Swing, JavaFX & SWT 2
O JTable Zeile zuweisen und weiter mit dem Button AWT, Swing, JavaFX & SWT 2
M JTable & Problem, das nicht die komplette Zeile gefärbt AWT, Swing, JavaFX & SWT 6
G JTable erste zeile fixieren wie in excel? AWT, Swing, JavaFX & SWT 3
Z JTable automatisch zu einer Zeile scrollen AWT, Swing, JavaFX & SWT 4
lolkind eine Zeile und Tabelle ist Rechtsbündig? AWT, Swing, JavaFX & SWT 3
G JTable Zeile zurückgeben AWT, Swing, JavaFX & SWT 4
D Herausfinden auf welche Zeile in einer JTable geklickt wurde AWT, Swing, JavaFX & SWT 2
F JTextPane aktive Zeile AWT, Swing, JavaFX & SWT 2
S JTable: Zeile unter MouseCursor farblich hervorheben AWT, Swing, JavaFX & SWT 2
N Trotz richtiger ListSelectionMode kann ich keine Zeile sel? AWT, Swing, JavaFX & SWT 4
N Die Zeile einer JTable verändert beim klicken ihre Farbe? AWT, Swing, JavaFX & SWT 7
S Eine Zeile zu einer JTable hinzufügen wo Zelle selektiert is AWT, Swing, JavaFX & SWT 4
A Prob:Tabelle bei Zellensprung: Letzte zeile doppelt sichtbar AWT, Swing, JavaFX & SWT 7
G JTable Zeile mit Farbe füllen AWT, Swing, JavaFX & SWT 2
G JTable komplette Zeile auf deaktiv setzen AWT, Swing, JavaFX & SWT 2
B JTable erste Zeile aktiv AWT, Swing, JavaFX & SWT 6
F AbstractTableModel + Vector - Wie Zeile hinzufügen AWT, Swing, JavaFX & SWT 4
Saxony JTextPane - letzte Zeile löschen AWT, Swing, JavaFX & SWT 4
A Zeile in JTable einfügen/löschen- Tutorial gesucht AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben