JTable mit Animation???

Status
Nicht offen für weitere Antworten.

superping

Aktives Mitglied
Hallo zusammen!

Weiss jemand wie (bzw. ob) es möglich ist in eine JTable eine Animation einzubinden?

Bräuchte einen kleinen grünen Kreis der im Sekundentakt blinkt (an/aus).

Irgendeine Idee?
 
Man könnte per Thread bzw. Timer jede Sekunde den Wert in den Zellen ändern lassen und die Darstellung des Zustände einen entsprechenden TableCellRenderer schreiben.
Sofern die Tabelle nur zur Anzeige dient ist das noch einigermassen einfach umsetzbar. Soll in der Tabelle auch gearbeitet (selektiert, editiert) wirds schon komplizierter.
 
Wie soll das denn aussehen? Soll es eher ein dicker Kreis um eine Tabellenzelle sein, oder ein kleiner Punkt innerhalb einer Zelle neben dem Zelleninhalt?
Gibt es nur einen solchen Kreis oder soll es pro bestimmter Zelle einen geben?

Meine Fragen zielen darauf ab, ob der Kreis eher zu Tabelle gehört, oder schon spezifischer zu einem Cell-Renderer.
 
@Michael

In der Tabelle soll sortiert, die entsprechenden Zeilen anklickbar sein aber nicht editiert werden.

@Krokodiehl

Die Idee ist eine Tabelle mit Jobs zu machen, bei denen die erledigten Jobs in einer extra Spalte ("erldeigt ja/nein") einen grünen Kreis haben, die Jobs mit Verspätung jedoch sollen einen blinkenden roten Kreis bekommen. Kreis werde ich entweder painten oder ein PNG nehmen.

Oder sollte man besser eine GIF Ani als Loop laufen lassen?
 
Ich glaube ein animiertes gif wird in der JTable nicht funktionieren.
Hier mal ein grob zusammengeschustertes Bsp. wie man's vom Ansatz her machen könnte:
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class TableAnimationDemo extends JFrame {
	private JTable table;

	public TableAnimationDemo() {
		table = new JTable(new Object[][] { { "Job1 finished ", 0 },
				{ "Job2 delayed", 1 }, { "Job3 running", 2 } }, new String[] {
				"Job", "Status" });
		table.getColumnModel().getColumn(1).setCellRenderer(new StatusCellRenderer());
		this.getContentPane().add(new JScrollPane(table));
		new Thread(new Runnable() {
			public void run() {
				while(true) {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					int value = Integer.parseInt(table.getValueAt(1, 1).toString());
					value *=-1;
					table.setValueAt(value, 1, 1);
				}
			}
		}).start();
	}

	public static void main(String[] args) {
		JFrame frame = new TableAnimationDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}

	class StatusCellRenderer extends DefaultTableCellRenderer {
		ImageIcon img1, img2;
		
		public StatusCellRenderer() {
			img1 = new ImageIcon(getDotImage(Color.GREEN.darker()));
			img2 = new ImageIcon(getDotImage(Color.RED));
		}
		
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			super.getTableCellRendererComponent(table, value, isSelected,
					hasFocus, row, column);
			int i = Integer.parseInt(value.toString());
			if (i==0)
				this.setIcon(img1);
			else if (i==1)
				this.setIcon(img2);
			else
				this.setIcon(null);
			this.setText("");
			return this;
		}
	}

	public static Image getDotImage(Color color) {
		BufferedImage image = new BufferedImage(10, 10,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = image.createGraphics();
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, 10, 10);
		g.setColor(color);
		g.fillOval(1, 1, 8, 8);
		return image;
	}
}
 
Ich würde es gleich wie Michael machen, mit einem kleinen Unterschied: die Daten sollten nur durch den EDT verändert werden. Entweder EventQueue.invokeLater oder einen javax.swing.Timer verwenden.
 
Wow! Danke! Ich denke ich habs in etwa verstanden.

Bis auf einen Absatz. Evtl. könntest Du mir den kurz erklären?

int value = Integer.parseInt(table.getValueAt(1, 1).toString());
value *=-1;
table.setValueAt(value, 1, 1);

Für den Rest aber schonmal ein riesenfettes Dankeschön!!!
 
Das ganze kann man sicherlich noch eleganter lösen.
- table.getValueAt(1, 1).toString() : Auslesen des Objektes aus Zeile 2 Spalte 2 und umwandeln in einen String
- int value = Integer.parseInt(...) : umwandeln des Strings in ein int und speichern in der Variablen value
- value *=-1; entspricht value = value * -1 (anhand des Wertes wird im CellRenderer entschieden, ob bzw. welches Icon verwendet wird)
- table.setValueAt(value, 1, 1) : den veränderten Wert zurück in die Tabelle schreiben
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben