JTable und JProgressBar

thodtie

Mitglied
Hi,

ich bin' schon wieder euer Grünschnabel. Hab eine Frage zu folgenden Code.
Hier wird mir nicht die Progressbar angezeigt sondern nur die Parameter des Objekts. Wie kann ich das graphisch anzeigen lassen?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Listing3709
extends JFrame
implements ActionListener
{

private JTable table;
private JProgressBar prog;

public Listing3709()
{
super("Test");
Container cp = getContentPane();
table = new JTable(2,2);
prog = new JProgressBar();
table.setValueAt("Test",0,0);
table.setValueAt(prog,1,0);
prog.setValue(50);
cp.add(table);
cp.add(new JScrollPane(table));
JButton button = new JButton("Ausgabe");
button.addActionListener(this);
cp.add(button, "South");
}
public void actionPerformed(ActionEvent event)
{
}

public static void main(String[] args)
{
Listing3709 frame = new Listing3709();
frame.setLocation(100, 100);
frame.setSize(200, 200);
frame.setVisible(true);
}
}
 
du musst se ganz einfach deinem container adden.

cp.add(prog);


wobei ich denk das da irgendwas krankes rauskommen wird :p. Zum einen wird se keinen Fortschritt anzeigen schließlich hast se ja blos erzeugt und zum andern is da au ka LayoutManager in deinem Source Code..

außerdem langts wenn du das jtable nur einmal addest cp.add(new JScrollPane(table));

du addest ihn aber zuvor schon einmal cp.add(table) was eigentlich das gleiche ist nur eben ohne scrollpane.
 
Zuletzt bearbeitet:
Hi,

den einen Add-Befehl hab ich rausgenommen. Danke für den Hinweis. Dennoch wenn ich cp.add(Prog) mache,sehe ich trotzdem die die ProgressBar nicht sondern nur die Eigenschaften ausgeschrieben.

Kann mir jemand sagen, wie ich die sichtbar mache?

Ich möchte später, dass sie einen Fortschritt anzeigt, baue das langsam auf und möchte erstmal das sie überhaupt angezeigt wird.

Grüße vom Newbie ;-)
 
Hallo thodtie,

die einzige Möglichkeit, die ProgressBar in Deine Tabelle reinzukriegen, ist, einen eigenen TableCellRenderer zu schreiben. In der einzigen Methode von dem Renderer (die getTableCellRendererComponent()) musst Du dann anstatt standard Komponente eine JProgressBar übergeben.

Ich habe jetzt leider kein Beispiel parat, also musst Du einfach im Netz oder hier im Forum nach TableCellRenderer suchen.
 
Hi,

ich hab mich mal im Netz umgeschaut nach TableCellRenderer aber leider nicht so mit dem richtigen Erfolg. Ich weiß leider nicht wie ich das auf mein Problem anwenden kann und eine genaue Beschreibung wie das genau funktioniert hab ich nicht gefunden. Kann mir jemand weiterhelfen *fehl*

Grüße Newbie Chris
 
OK, ich habe jetzt ein Beispiel ausgegraben :).

Als erstes brauchst Du eine TableCellRenderer Klasse, die für jede Zelle, die einen Integer-Wert enthält, eine ProgressBar liefert:
Code:
public class ProgressCellRenderer implements TableCellRenderer {
        private JProgressBar progress;
        
        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            int intValue = ((Integer) value).intValue();

            if (progress == null) {
                progress = new JProgressBar();
            }
            progress.setValue(intValue);
            progress.setBackground(table.getBackground());
            progress.setStringPainted(true);

            return progress;
        }
    }
Jetzt musst Du Deiner Tabelle klar machen, dass sie für alle Spalten, die Integer-Zahlen enthalten, diesen Renderer verwenden soll. Das erreichst Du damit:
Code:
myTable.setDefaultRenderer(Integer.class, new ProgressCellRenderer());
Das ist natürlich noch nicht alles. ;)
Damit die Spalten, die Integer-Zahlen enthalten, als solche erkannt werden, muss Dein TableModel für die betroffene Spalten die Integer.class liefern. Das erreicht man, indem man die getColumnClass() Methode überschreibt:
Code:
class MyTableModel extends DefaultTableModel {
    ...
    public Class getColumnClass(int columnIndex) {
        if (columnIndex == 0) {
            return Integer.class;
        }
        return String.class;
    }
    ...
}
P.S. statt Integer kannst Du natürlich auch andere Datentypen verwenden (z.B. Float oder Long), dann musst Du es überall entsprechend anpassen.

Gruß
Vincent
 
Hi,
ggf. eine eigene Klasse anlegen für die Spalte. Denn wenn mehrere Integer-Spalten in der Tabelle vorkommen sollten, wird jedesmal der Progressbar-Renderer für diese Integer-Spalten verwendet. Das ist ein unangenehmer Nebeneffekt, den man in den seltensten Fällen gebrauchen kann. ;)
 
Ich bin's schon wieder...

Ich habe die Hinweise mal verarbeitet:

Datei: Listing3709.java
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
class MyTableModel extends DefaultTableModel {

	  public Class getColumnClass(int columnIndex) {
		  if (columnIndex == 0) {
			  return Integer.class;
		  }
		  return String.class;
	  }

  }


public class Listing3709
extends JFrame
implements ActionListener
{

  private JTable table;
  private JProgressBar prog;


  public Listing3709()
  {
	super("Test");
	 try {
		 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		 SwingUtilities.updateComponentTreeUI(this);
	   } catch (UnsupportedLookAndFeelException e) {
		 System.err.println(e.toString());
	   } catch (ClassNotFoundException e) {
		 System.err.println(e.toString());
	   } catch (InstantiationException e) {
		 System.err.println(e.toString());
	   } catch (IllegalAccessException e) {
		 System.err.println(e.toString());
	   }

	JPanel cp = new JPanel();
	getContentPane().add("Center",cp);
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	table = new JTable(2,2);
	prog = new JProgressBar();
	table.setValueAt("Test",0,0);
	table.setValueAt("10",1,0);
	table.setDefaultRenderer(Integer.class, new ProgressCellRenderer());
	prog.setValue(50);
	cp.add(new JScrollPane(table));
	//cp.add(prog);
	JButton button = new JButton("Ausgabe");
	button.addActionListener(this);
	cp.add(button,"South");
  }
  

  public void actionPerformed(ActionEvent event)
  {

	}


  public static void main(String[] args)
  {
	Listing3709 frame = new Listing3709();
	frame.setLocation(100, 100);
	frame.setSize(600, 600);
	frame.setVisible(true);
  }
}

und dieses Klasse

Listing: ProgressCellRenderer.java
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class ProgressCellRenderer implements TableCellRenderer {
		private JProgressBar progress;
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			int intValue = ((Integer) value).intValue();
			if (progress == null) {
				progress = new JProgressBar();
			}
			progress.setValue(intValue);
			progress.setBackground(table.getBackground());
			progress.setStringPainted(true);
			return progress;
		}
	}

Was mach ich denn falsch? Bin dankbar für jeden Hinweis.

Grüße Newbie Chris ;-)
 
Moin,
zweierlei:
1. Musst Du natürlich das MyTableModel auch der Tabelle zuweisen:
table.setModel(new MyTableModel());
2. Muss in dem TableModel noch etwas mehr implementiert werden als nur das getColumnClass(...),
nämlich die Interface-Methoden des TableModel: getColumnCount(), getRowCount(...), getColumnName(), und die kannst Du zu Testzwecken hardcodiert reinschreiben. Evtl muss auch noch das getValueAt und setValueAt rein, wirst Du aber sehen. ;)
 

Neue Beiträge

Zurück