JTable Zelle markieren von bis und Löschen

agasar

Mitglied
Hallo

ich habe mir eine JTable erstellt und möchte von einer bestimmten Zelle(row,column) bis zu einer anderen Zelle(row,column) markieren mit einer bestimmten farbe. Ich will sozusagen diese Zellen verknüpfen und als eine Einheit darstellen.

Der Programmablauf
Der User gibt ein anfangs und enddatum ein. Die JTable aktuallisiert ihre Tabelle mit den eingegebenen
Datum. Jetzt habe ich 2 Datum einträge in meiner Jtable aber ich möchte das von der Anfangsdatumzelle bis zur Enddatumzelle markiert wird.
Und ich möchte auch wenn ich auf diese markierte klicke löschen kann aus der jTable.

Ich komme nicht einfach weiter bitte um hilfe.
 
Der Zelleninhalt wird mit Hilfe von TableCellRenderern dargestellt. Man könnte hier also einen Renderer schreiben, der prüft, ob das Datum in der Zelle innerhalb des vorgegebenen Zeitintervalls liegt und diese ggf. einfärbt.
Was das Löschen angeht, sollen einzelne Zellen gelöscht werden? Also keine kompletten Zeilen oder Spalten? Da hängt die Komplexität von der Implementierung des TableModels ab. Mit einem passenden TableModel ist das recht einfach, mit einem DefaultModel müsstest Du ja die Zellwert nachrücklassen...
 
Danke für die Antwort

also ich hab bereits ein model für mein tabele implementiert von AbstractModel. Damit ich die Dateobjekte in meine Tabelle einfügen und wieder auslesen kann.
Mit der Klasse TableCellRenderer kenn ich mich nicht aus. Das interface verlangt das ich getTableCellRendererComponent(..) implementiert werden muss . Muss ich diese Überprüfungen der Intervalle hier machen .
Ich will den komplett markierten datensatz löschen aus der tabelle, also die markierte stelle im tabelle.
 
Mit der Klasse TableCellRenderer kenn ich mich nicht aus. Das interface verlangt das ich getTableCellRendererComponent(..) implementiert werden muss . Muss ich diese Überprüfungen der Intervalle hier machen .
Richtig, in dieser Methode wird die Zelle formatiert. Der Einfachheit halber kann man auch von DefaultTableCellRenderer erben (verwendet eine JLabel zum Rendern) und Methode anpassen.
Ich will den komplett markierten datensatz löschen aus der tabelle, also die markierte stelle im tabelle.
Nehme mal an es geht um so eine Art Kalender. Im Model muss man dann ja "nur" die Daten löschen die innerhalb des definierten Intervalls liegen.
Ich würde als Datencontainer im Model eine einfache Liste mit den Daten verwenden und die Tabelle damit zeilenweise befüllen, dann kann man einfach die betroffenen Daten aus der Liste löschen und ein fireTableDataChanged() abfeuern.
 
Ich habe im datenmodel eine hashmap verwendet.
public void setValueAt(Object value, int row, int column)
{
//int col = column;
//col = transform(column);

if ((rows < 0) || (columns < 0))
{
throw new IllegalArgumentException("Invalid row/column setting");
}
//if ((row < rows) && (column < columns))
//{
lookup.put(new Point(row,column), value);
//}
}
public Object getValueAt(int row, int column) {
return lookup.get(new Point(row,column));
}
Ich weis nicht wie ich die Intervalle im TableCellRenderer bekommen soll.
public void setValue(Object value)
Kannst du mir bitte weiterhelfen?
 
Du musst Dir ja nur das Anfangs- und Enddatum merken. Im Renderer überprüfst Du einfach nur ob das Datum der aktuellen Zelle dazwischen liegt.

Bzgl. TableModel vermute ich mal, dass die HashMap da garnicht notwendig ist und es eine einfache Liste auch tun würde. (Ich nehme mal an das die JTable als eine Art Kalendardarstellung dienen soll und die Werte einer Zeile nicht unbedingt einen Bezug zu einander haben)
Hier mal ein Beispiel (mit Zahlen anstelle von Daten) um zu verdeutlichen wie ich das meine:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class TableListDemo extends JFrame {
	private ListTableModel model;
	private int start, end;
	
	public TableListDemo() {
		List<Integer> data = new ArrayList<Integer>();
		for (int i=1; i<32; i++)
			data.add(i);
		model = new ListTableModel(data);
		JTable table = new JTable(model);
		this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
		JPanel panel = new JPanel(new GridLayout(1, 3));
		final JSpinner spinner1 = new JSpinner();
		final JSpinner spinner2 = new JSpinner();
		spinner1.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				start = Integer.parseInt(spinner1.getValue().toString());
				if (start <= end)
					model.fireTableDataChanged();
				else
					spinner2.setValue(start);
			}
		});
		panel.add(spinner1);
		spinner2.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				end = Integer.parseInt(spinner2.getValue().toString());
				if (end >= start)
					model.fireTableDataChanged();
				else
					spinner1.setValue(end);
			}
		});
		panel.add(spinner2);
		JButton button  = new JButton("DEL");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				model.removeIntervall(start, end);
			}
		});
		panel.add(button);
		this.getContentPane().add(panel, BorderLayout.SOUTH);
		table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
			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!=null) {
					int intValue = Integer.parseInt(value.toString());
					if (intValue>=start && intValue<=end)
						this.setBackground(Color.RED);
					else
						this.setBackground(Color.WHITE);
				}
				return this;
			}
		});
	}
	
	class ListTableModel extends AbstractTableModel {
		private List<Integer> data = new ArrayList<Integer>();
		
		public ListTableModel(List<Integer> data) {
			this.data = data;
		}
		
		public void removeIntervall(int start, int end) {
			for(int i = data.size()-1; i>=0; i--) {
				System.out.println(data.get(i));
				if (data.get(i)>=start && data.get(i)<=end)
					data.remove(i);
			}
			this.fireTableDataChanged();
		}

		public int getColumnCount() {
			return 7;
		}

		public int getRowCount() {
			return data.size()/getColumnCount() + (data.size()%getColumnCount()>0?1:0);
		}

		public Object getValueAt(int rowIndex, int columnIndex) {
			int index = rowIndex*getColumnCount() + columnIndex;
			if (index >= data.size())
				return null;
			return data.get(index);
		}
		
	}
	
	public static void main(String[] s) {
		JFrame frame = new TableListDemo();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 300, 300);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 
Danke für die antwort.
Kann man auch wie in ical über die jtable zellen mit der maus markieren und dann soll ein frame aufgehen das nach datum, wiederholung usw. einträgen fragt, wenn man mit ok bestätigt soll dann die entrsprechende zellen farblich gekennzeichnet werden.
 

Zurück
Oben