Welchen Datentyp verwenden?

Status
Nicht offen für weitere Antworten.
R

redbomber

Gast
Hallo zusammen,
ich brauche mal wieder euren Rat.

Ich habe folgendes Problem:
Ich besitze eine Liste von Objekten (Probe)

In Swing (eigentlich für das Swing Forum, aber dies ist eher ein allgemeines Problem) besitze ich eine JTable, wobei die einzelnen Zellen jeweils eine solche Probe darstellen.

Nun möchte ich zum einen von einer Probe wissen in welcher Zelle sie sich befindet, aber eigentlich auch anders herum, also wenn ich auf eine Zelle klicke, möchte ich wissen um welche Probe es sich handelt.

Daher dachte ich als erstes an eine HashMap bzw. an zwei, also eine wo mein Key eine solche Probe ist (entsprechend Value ist Position) und eine HashMap, wo mein Key die Position in der Tabelle ist (entsprechend Value ist Key) .

Das Problem ist nur, dass die Liste von Objekten (Probe) sehr gross sein kann.

Zudem habe ich das Problem dass sich die Positionen der Probe in der Zelle ändern können.

Habt ihr eine Idee wie ich so etwas realisieren kann?
 

diggaa1984

Top Contributor
hm, vielleicht könntest du ja nachdem du die Proben in die tabelle gepackt hast, alle Zellen des JTables abklappern, und sowas machen wie ProbeX.setPosition(col,row) .. das wäre ja nur anfangs ein wenig aufwendig. Später, wenn die Proben sich verändern, kannst du das bestimmt in einer der bereits bestehenden Funktionen des JTable, oder des TableModels unterbringen ... und nur die Proben ansprechen, welche ihre Position durch eine gerade vollführte Aktion geändert haben.

Was das auslesen der Proben an Zelle x angeht, sollte es bereits mit den Standardmethoden des Tables oder Models möglich sein. Im Prinzip weisst die Tabelle ja wo welche einträge liegen, da brauchst das nicht noch extra in einer HashMap ablegen ... Das Wissen der Proben in welcher Zelle sie liegen, musst eben anfangs initial nachholen, und dann bei jeder Änderung nur die betroffenen ansprechen, das sollte vom Aufwand her denke ich machbar sein
 

Marco13

Top Contributor
also wenn ich auf eine Zelle klicke, möchte ich wissen um welche Probe es sich handelt.
Das ist eigentlich kein Problem: getValue(x,y) liefert das Objekt, das dort liegt - und das ist ggf. schon die gesuchte "Probe".

Nun möchte ich zum einen von einer Probe wissen in welcher Zelle sie sich befindet

Das ist ein bißchen problematischer: Die JTable ist ja nur eine Ansicht auf die Daten - streng genommen "enthält" die Tabelle die Daten ja nicht. "Enthalten" sind die Daten nur im TableModel. Wenn du nun z.B. die Tabelle mit einem TableSorter sortiert anzeigst, welche Zeilenzahl soll dann für eine Probe zurückgegeben werden? Die aus der Tabelle, oder die aus dem Modell?

Mit einer Map könnte man das ggf. lösen, aber ... bevor man sich die Frage stellt, ob eine Map sinnvoll ist, sollte man sich die Frage stellen, ob es sinnvoll ist, dass eine "Probe" weiß, in welcher Zeile (irgendeiner) Tabelle sie angezeigt wird. Die Antwort ist höchstwahrscheinlich "NEIN!!!". (Spätestens, wenn du die Proben noch in einer weiteren Tabelle anzeigen willst, hast du eh ein Problem...).

Falls die Abfrage, in welcher Tabellenzeile sich eine Probe befindet, nicht zu zeitkritisch ist, könnte es sogar am sinnvollsten sein, die Tabelle für jede dieser Anfragen zu "durchsuchen" - aber das musst du dir genau überlegen.
 

FArt

Top Contributor
Marco13 hat es schon gesagt. Die Frage ist wofür du diese Info brauchst, um dann herauszufinden, dass der Ansatz der falsche ist...
 
R

redbomber

Gast
Also vielleicht noch etwas genauer:

Ich besitze nur eine Tabelle. In dieser werden in jeder Zelle eine Probe visualisiert.

Problem 1:
Wenn ich auf eine Zelle klicke muss diese markiert werden (weisses X). Ebenso kann man viele Zellen (mit STRG) markieren.
Um mir zu merken welche Zellen markiert wurden speichere ich mir (row,col) in einer LinkedList.
Diese Liste übergebe ich dann meinem CellRenderer, der in seiner paint() Methode alle Zellen in der Liste markiert.
Bisher konnte ich dies auf keine andere Weise realisieren, da die JTable die Selektion einzelner Zellen ohne weiteres nicht unterstützt.

2. Problem:
Zoomen. Ich kann in meine Tabelle Zoomen, dadurch werden die Zellen größer/kleiner. Pro Reihe gibt es nur soviele Zellen dass kein horizontaler Scrollbalken erscheint. D.h. die Tabelle wird UMGEBROCHEN.

Folglich besitzt jede Probe je nach Zoomstufe eine andere Zelle (row,col). Diesen Bezug muss ich irgendwie zu jeder Zeit abfragen können.

Damit nun aber die bisher selektierten Zellen (von denen die (row,col) aber auch die Probe kenne) selektiert bleiben muss ich ja irgendwie von der Probe herausbekommen in welcher Zelle die gerade dargestellt wird.

Dies dachte ich mit einer HashMap zu machen.
Aber diese müsste ich ja in jeder Zoomstufe neu befüllen?
 

FArt

Top Contributor
Das erste Problem würe ich mit einer eigenen Implementierung des ListSelectionModel realisieren. Deine Lösung funktioniert technisch natürlich, aber du brichst hier ein wenig aus dem MVC Konzept aus (je nachdem wo die Liste verwaltet wird).

Das zweite Problem würde ich gar nicht realisiern. Ich kenne jetzt deinen Anwendungsfall nicht, aber das Ergebnis hört sich für den Benutzer verwirrend und unübersichtlich an.
Evtl. ist scrollen oder abschneiden besser.
Wenn du das doch machen musst: entweder wirklich immer neu befüllen (fühlt sich an wie ein schlechter Workaround und ist es sicher auch) oder bastel dir einen eigenen Tableview, in dem du noch mal ein Mapping von "virtueller Darstellung" und "echter Darstellung" (ähnlich einem Viewport) vornimmst.

Wenn doch:
 
R

redbomber

Gast
Zu Problem 1:

Ich befürchte aber dass die eigene Implementierung des ListSelectionModel meine Funktionalität nicht erfüllt.
Also das Selektieren (und markieren) einer einzelnen Zelle bzw. mehrere Zellen durch gedrückt halten der STRG-Taste.
Dies hatte ich auch bereits versucht, hatte dann aber das Problem, dass entweder immer nur eine ganze Reihe markiert wird, oder dass nach anklicken einer Zelle nur noch Zellen ausgewählt werden konnten, die einen Spaltenindex kleiner der ersten selektierten Zelle besitzen.

Eine völlig freie Selektion von Zellen war mir nicht möglich.

Problem 2:
Leider benötigt der Anwender diese Ansicht.
Die Zellen der Tabelle sind vom Typ JPanel und werden daher mit dem wert der jeweiligen Probe farblich dargestellt.
Um eine komplette Überscht über alle Proben zu bekommen wird der Zoom benötigt.

Daber ist erwünscht dass nur soviele Zellen in einer Reihe dargestellt werden, wie in das Fenster passen. Alle restlichen Zellen sollen dann in den nächsten Zeilen dargestellt werden.

Es ist also nur ein vertikaler Scrollbalken erwünscht.
 
M

Michael...

Gast
redbomber hat gesagt.:
Um mir zu merken welche Zellen markiert wurden speichere ich mir (row,col) in einer LinkedList.
Wieso merkst Du Dir nicht gleich das markierte Objekt in der Liste, dann bist Du von der Position im TableModel unabhängig.
redbomber hat gesagt.:
Nun möchte ich zum einen von einer Probe wissen in welcher Zelle sie sich befindet
Willst Du wirklich, dass die Probe weiss in welcher Zelle sie sich befindet, oder soll sie nur wissen, ob sie markiert ist oder nicht? Letzeres kannst Du ihr ja beim Markieren bzw. Demarkieren sagen.
 
R

redbomber

Gast
Genau,
also ich speichere mir in einer Liste immer alle Proben die markiert sind, also die Objekte.

Aber damit ich nun die richtige Zelle als selektiert markieren kann, gehe ich momentan über den Weg, mir ZUSÄTZLICH noch die (row,col) zu speichern und diese Zellen dann mit dem Cellrenderer mit einem X zu painten.

Ich kann mir eben gerade nicht vorstellen, wie ich von den gespeicherten (markierten) Proben auf die Zellen komme, die ich als "markiert zeichnen" muss.
 
M

Michael...

Gast
hast Glück, dass ich heute arbeitsmäßig wenig motiviert bin. Ich habe Dir mal als Bsp. was von mir ein bisschen angepasst. Bei dem "Zeilenumbruch" muss ich allerdings passen, da müsste ich mich geistig zu sehr anstrengen. Mein Bsp sollte aber mit und ohne "Zeilenumbruch" funktionieren. Das Ganze besteht aus drei Klassen.
Hauptklasse mit Table und MouseListener, CellRenderer, und eine Klasse welche die Proben repräsentiert:
Code:
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class CustomTable extends JFrame {
    private Object[][] data = {
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()},
    		{new ProbenObject(), new ProbenObject(), new ProbenObject()} 
    }; 
    private String[] columnNames = {"", "", ""}; 
    private JTable table;
    private ArrayList markedObjects;
    
    public CustomTable() {  
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(50, 50, 500, 300);
        
        DefaultTableModel model  = new DefaultTableModel();
        model.setDataVector(data, columnNames);
        markedObjects = new ArrayList();
        
        table = new JTable(model) {
        	public boolean isCellEditable(int row, int column) {
        		return false;
        	}
        };   
        table.setRowSelectionAllowed(false);
        table.setColumnSelectionAllowed(false);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setDefaultRenderer(Object.class, new CustomRenderer(markedObjects));
         
        table.addMouseListener(new MouseAdapter() { 
            public void mouseClicked(MouseEvent evt){
            	if(evt.getButton() == MouseEvent.BUTTON1){ 
            		Object object = table.getValueAt(table.rowAtPoint(evt.getPoint()), table.columnAtPoint(evt.getPoint()));
            		if (evt.isControlDown()) {
            			if (markedObjects.contains(object))
            				markedObjects.remove(object); 
            			else 
                            markedObjects.add(object);
            		}
            		else {  
            			markedObjects.clear(); 
            			markedObjects.add(object);
            		} 
            		table.repaint(); 
            	} 
            } 
        });  
        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);   
    } 

    public static void main(String[] args) { 
        new CustomTable().setVisible(true);  
    } 
} 


class CustomRenderer implements TableCellRenderer {
	private ProbenObject ccObject;
    private ArrayList markedObjects;
    
    public CustomRenderer(ArrayList selections) { 
        this.markedObjects = selections; 
    } 
     
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
    	ccObject = (ProbenObject)value;
    	if (markedObjects.indexOf(ccObject)>=0)
        	ccObject.setMarked(true);
        else
        	ccObject.setMarked(false);
        return ccObject; 
    } 
}

class ProbenObject extends JPanel {
	private boolean isMarked;
	private static int index = 0;
	private int h, w;
	
	public ProbenObject() {
		this.setLayout(new BorderLayout());
		this.isMarked = false;
		this.setBackground(Color.WHITE);
		this.add(new JLabel("Probe " + index++), BorderLayout.CENTER);
	}
	
	public void setMarked(boolean b) {
		this.isMarked = b;
		if (b)
			this.setBackground(Color.LIGHT_GRAY);
		else
			this.setBackground(Color.WHITE);
	}
	
	public boolean isMarked() {
		return isMarked;
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (this.isMarked) {
			w = this.getWidth();
			h = this.getHeight();
			g.setFont(new Font(g.getFont().getName(), Font.BOLD, h));
			g.setColor(Color.WHITE);
			g.drawString("X", w-h, h-1);
		}
	}
}
 
R

redbomber

Gast
Das Problem ist bei mir, dass die Zellen in der Tabelle nicht direkt mit den Proben gefüllt sind.

Jede Zelle ist vom Typ JPanel. Abhängig von den Werten der Proben sind diese Zellen mit unterschiedlicher Farbe dargestellt.

Also kann ich in meinem CellRenderer, wenn ich auf das Object zugreifen möchte: Object value nicht direkt auf die Probe zugreifen, da value keine instanz von Probe ist.

Code:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { }
 

André Uhres

Top Contributor
Wenn die RendererComponent mit dem Wert der Zelle identisch ist,
können wir ja nur über eine Methode der RendererComponent näheres darüber erfahren.
Wenn die RendererComponent eine eigene Klasse ist, die von JPanel erbt,
kannst du leicht eine entsprechende Methode einbauen.
 
R

redbomber

Gast
Sorry Michael... und André Uhres.

Vielen Dank für eure Hilfe (und auch allen anderen).

In meinem CellRenderer bekomme ich über row,col ja meine Proben ID heraus, worüber ich wiederum die richtige Probe erhalte.

Dann komme ich also genau zu dem Punkt der oben in dem Codebeispiel zu sehen ist.
Und schon klappt es.

Nun kann ich also verschiedene Proben selektieren. Die Selektion wieder invertieren oder ganz löschen...

vielen Dank euch allen!!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
F Datentypen Welchen Wert hat ein einfacher Datentyp nach der Deklaration? Java Basics - Anfänger-Themen 6
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
5 Welchen Sinn hat ein Runnable Java Basics - Anfänger-Themen 6
F Welchen Layout Manager wählen? Java Basics - Anfänger-Themen 13
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
S Welchen Bereich sollte ich favorisieren? Java Basics - Anfänger-Themen 3
E java lernen mit welchen mitteln Java Basics - Anfänger-Themen 37
J Welchen kostenlosen GUI-Builder nehmen? Java Basics - Anfänger-Themen 5
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
I ComponentListener zu welchen Zeitpunkt aktiv Java Basics - Anfänger-Themen 5
J Welchen Layoutmanager nehmen? Java Basics - Anfänger-Themen 4
L welchen fehler übersehe ich? ...kompilieren funkt. nicht Java Basics - Anfänger-Themen 23
G Welchen Layoutmanager verwenden? Java Basics - Anfänger-Themen 7
D Programmierstil - Bei Vererbung welchen Typ benutzen? Java Basics - Anfänger-Themen 8
N Eclipse und ascii codes, welchen wählen? Java Basics - Anfänger-Themen 3
G Welchen package-Namen wählen, wenn man keine Domain hat? Java Basics - Anfänger-Themen 11
D Welchen Namen darf ein Konstruktor haben? Java Basics - Anfänger-Themen 6
S externe lib´s in welchen ordner packen? Java Basics - Anfänger-Themen 6
S welchen layoutmanager Java Basics - Anfänger-Themen 9
F Datentypen Wertebereiche passender Datentyp Java Basics - Anfänger-Themen 5
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
D Arraylist mit Komplexen Datentyp Java Basics - Anfänger-Themen 3
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
C initialisieren eines arrays richtiger Größe und mit geeignetem Datentyp Java Basics - Anfänger-Themen 26
H Datentyp mit 3 Zuständen Java Basics - Anfänger-Themen 42
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
Kanaska Datentyp für Zahlenbereiche Java Basics - Anfänger-Themen 7
A Datentyp char Java Basics - Anfänger-Themen 27
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
C unverständlicher Code Attribute ohne Datentyp, wie geht das? Java Basics - Anfänger-Themen 8
T Datentyp mit Anführungszeichen drinnen Java Basics - Anfänger-Themen 3
R Datentypen Datentyp String lenght & charAT Java Basics - Anfänger-Themen 4
M Array mit eigenem Datentyp probleme beim übergeben Java Basics - Anfänger-Themen 6
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
B Datentypen Datentyp welcher den gleichen Namen wie die Klasse trägt? Java Basics - Anfänger-Themen 1
D Datentypen Welcher ist der beste Datentyp? Java Basics - Anfänger-Themen 28
F Datentypen Missverständnis Datentyp Java Basics - Anfänger-Themen 2
D Rechnen mit numerischen Datentyp Frage Java Basics - Anfänger-Themen 16
E Klassename als Datentyp??? Java Basics - Anfänger-Themen 4
F Wertebereich/Datentyp Java Basics - Anfänger-Themen 26
M Datentypen Java Datentyp Definition Java Basics - Anfänger-Themen 6
MiMa Datentyp Short Wert zuweisen über Methode Java Basics - Anfänger-Themen 2
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
D Klassen Gesucht: Einfache Beispiel-Klasse für einen Datentyp Java Basics - Anfänger-Themen 7
E Datentypen Benutzerdefinierten Datentyp verwenden Java Basics - Anfänger-Themen 1
ms_cikar Java Datentyp unwandlung Java Basics - Anfänger-Themen 7
G Datentypen Tipps, Ratschläge erwünscht bzgl. Datentyp bestimmen über Wertebereich Java Basics - Anfänger-Themen 5
Y Warum void statt Datentyp + return Java Basics - Anfänger-Themen 4
M Interface als Datentyp Java Basics - Anfänger-Themen 12
R Variablen Datentyp erst während Laufzeit festlegen Java Basics - Anfänger-Themen 6
1 Neuen Datentyp für rationale Zahlen als Klasse entwickeln Java Basics - Anfänger-Themen 20
R Datentypen Datentyp eines Werts in einer Textdateizeile abfragen und ändern Java Basics - Anfänger-Themen 4
R Interface Datentyp bei Erzeugung eines Objekts, dessen Klasse eine Schnittstelle implementiert Java Basics - Anfänger-Themen 18
B Collections Collection soll nur einen bestimmten Datentyp aufnehmen Java Basics - Anfänger-Themen 12
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
B datentyp in binär umwandeln Java Basics - Anfänger-Themen 5
S Primitiver Datentyp Short , Vorteil/Nachteil Betrachtung Java Basics - Anfänger-Themen 6
J Field auf Datentyp prüfen Java Basics - Anfänger-Themen 8
D Datentyp Object Java Basics - Anfänger-Themen 2
A Datentypen Mehrdimensionaler Datentyp gesucht Java Basics - Anfänger-Themen 4
D Datentypen Abstrakter Datentyp lässt sich nicht casten Java Basics - Anfänger-Themen 7
F Klassenorganisation: Datentyp in Datentyp anlegen Java Basics - Anfänger-Themen 3
N Unerklärlich: Rekursiver Algorithmus gibt falschen Datentyp zurück... Java Basics - Anfänger-Themen 4
J Datentypen Was ist der Sinn vom Datentyp "char" ? Java Basics - Anfänger-Themen 11
G Eigener Autoboxing Datentyp Java Basics - Anfänger-Themen 3
Binary.Coder Welcher Datentyp für den Simplex Algorithmus Java Basics - Anfänger-Themen 3
Guybrush Threepwood Effizientester Datentyp zur Speicherung einer ungeordneten Menge von ints Java Basics - Anfänger-Themen 8
B Datentyp für +,-,*,/ Java Basics - Anfänger-Themen 5
D Datentypen Rekursiver Datentyp Java Basics - Anfänger-Themen 8
GianaSisters Auf Datentyp überprüfen Java Basics - Anfänger-Themen 13
W Datentypen Operatoren für eigenen Datentyp nutzen Java Basics - Anfänger-Themen 2
M Array mit komplexem Datentyp Java Basics - Anfänger-Themen 9
M 2 Arrays mit komplexen Datentyp vergleichen Java Basics - Anfänger-Themen 8
G Datentypen Welcher Datentyp Java Basics - Anfänger-Themen 2
J Datentypen Datentyp für Datum Java Basics - Anfänger-Themen 23
B Java Bean, JSP, Komplexer Datentyp Java Basics - Anfänger-Themen 3
I Datentypen Eigener DatenTyp Java Basics - Anfänger-Themen 2
E Datentyp Array Java Basics - Anfänger-Themen 10
M Datentypen Eigenen Datentyp toArray() Java Basics - Anfänger-Themen 4
A Datentyp Char wird in BlueJ nur als leerer weißer Kasten dargestellt Java Basics - Anfänger-Themen 1
N Frage zu Datentyp byte Java Basics - Anfänger-Themen 14
F Datentyp Number???? Java Basics - Anfänger-Themen 2
A einlesen, schreiben, umwandlung datentyp Java Basics - Anfänger-Themen 10
A Datentyp mit String festlegen? Java Basics - Anfänger-Themen 13
D Generischer Datentyp Java Basics - Anfänger-Themen 2
D Datentyp: Liste von String->Double dingern Java Basics - Anfänger-Themen 4
K Datentyp vs. Datenstruktur - Unterschiede Java Basics - Anfänger-Themen 13
C Datentyp von einer Variablen ermitteln. Java Basics - Anfänger-Themen 12
M Datentyp Parameter Java Basics - Anfänger-Themen 18
B Datentyp anlegen Java Basics - Anfänger-Themen 6
M Eigene Klasse mit "Enumeration"-Datentyp verknüpfe Java Basics - Anfänger-Themen 16
K Datentyp Problem Java Basics - Anfänger-Themen 2
X Rekursion & Generischer Datentyp Java Basics - Anfänger-Themen 11
A neuen Datentyp (Digit) definieren Java Basics - Anfänger-Themen 12
A Datentyp String in char umwandeln Java Basics - Anfänger-Themen 3
J datentyp -objectTyp Rückgabe Java Basics - Anfänger-Themen 2
D Superinterface als Datentyp Java Basics - Anfänger-Themen 5
E Generischer Datentyp und Arrays Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben