SWT Table Selection Color +Focus Out

lumo

Top Contributor
Hallo,

Ich habe folgendes problem
ich habe in meiner rcp mehrere views in denen ich daten darstelle.
zb habe ich in einem view eine listendarstellung und in einem andere die selbe liste auf einer landkarte verzeichnet, in einem dritten view habe ich den derzeitig ausgewählten datensatz mit detailinformationen.
nun habe ich allerdings das problem, dass wenn ich einen datensatz auf der mappe auswähle ich zwar den datensatz auf meiner tabelle markiert bekomme, ABER
das teil ist fast nicht sichtbar, da die hintergrundfarbe für die selection in einem leicht dezenten hellst-grau ist...

kann man die farbe ändern?

konnte mit google (meinem freund) nur die hintergrundfarbe der selection finden....

oder MUSS ich das per backgroundColor händisch machen...
@see Color cells and rows in SWT table : TableSWT JFace EclipseJava
 
Zeig mal ein Bild check gar net was du meinst...

Wenn du in einer Spalte die Hintergrund Farbe ändern willst musst du in deinem LabelProvider glaub IColorProvider implmenetieren...
 
Zuletzt bearbeitet von einem Moderator:
links die liste & rechts die mappe,
man sieht es kaum, aber der zweite eintrag in der liste ist selektiert.
wenn ich den focus auf die liste gebe, sieht man es hervorragend mit dunkelblau (will den focus aber nicht in den listen-view geben...)
 

Anhänge

  • table_sample.jpg
    table_sample.jpg
    100,1 KB · Aufrufe: 49
Ah okay verstehe was du meinst... Woran es liegt hast du richtig gesagt weil deine andere view den focus hat.
Mhm ist es notwendig dass du dafür 2 views brauchst? Könntest die Informationen auch in eine view packen?

Evt. findest du hier was
Eclipse Corner Article: Custom Drawing Table and Tree Items

EDIT: Damit gehts aber beachte den Kommentar...

Java:
				final Color red = display.getSystemColor(SWT.COLOR_RED);
				final Color yellow =  display.getSystemColor(SWT.COLOR_YELLOW);
		/*
		 * NOTE: EraseItem is called repeatedly.  Therefore it is critical
		 * for performance that this method be as efficient as possible.
		 */
		tableViewer.getTable().addListener(SWT.EraseItem, new Listener() {
			public void handleEvent(Event event) {
				event.detail &= ~SWT.HOT;
				if ((event.detail & SWT.SELECTED) == 0) return; /* item not selected */
				int clientWidth = tableViewer.getTable().getClientArea().width;
				GC gc = event.gc;

				Color oldForeground = gc.getForeground();
				Color oldBackground = gc.getBackground();
				gc.setForeground(red);
				gc.setBackground(yellow);
				gc.fillGradientRectangle(0, event.y, clientWidth, event.height, false);
				gc.setForeground(oldForeground);
				gc.setBackground(oldBackground);
				event.detail &= ~SWT.SELECTED;
			}
		});
 
Zuletzt bearbeitet von einem Moderator:
Ich denke mal du willst sowas erreichen
Java:
		/*
		 * NOTE: EraseItem is called repeatedly.  Therefore it is critical
		 * for performance that this method be as efficient as possible.
		 */
		tableViewer.getTable().addListener(SWT.EraseItem, new Listener() {
			Color background;
			Color foreground;
			
			public void handleEvent(Event event) {
				event.detail &= ~SWT.HOT;
				if ((event.detail & SWT.SELECTED) == 0) return; /* item not selected */
				int clientWidth = tableViewer.getTable().getClientArea().width;
				GC gc = event.gc;
				if(tableViewer.getTable().isFocusControl()){
					background = gc.getBackground();
					foreground = gc.getForeground();
				}
				Color oldForeground = gc.getForeground();
				Color oldBackground = gc.getBackground();
				gc.setBackground(background);
				gc.setForeground(foreground);
				gc.fillRectangle(0, event.y, clientWidth, event.height);
				gc.setBackground(oldBackground);
				gc.setBackground(oldForeground);
				event.detail &= ~SWT.SELECTED;
			}
		});
 
lol
hast du den code mal getestet?
wenn ich den listener adde dann fährt avaw mit 99% hoch und mein system ist so ausgelastet dass ich erst nach 10 minuten den prozess kilen kann... (darum auch erst etzt die antwort! 😉 )
 
lol
hast du den code mal getestet?
wenn ich den listener adde dann fährt avaw mit 99% hoch und mein system ist so ausgelastet dass ich erst nach 10 minuten den prozess kilen kann... (darum auch erst etzt die antwort! 😉 )

Bei wieviel Einträgen in der Tabelle?

Also bei 10000 Einträge gibt es bei mir keine Probleme, du musst halt in deinem TableViewer SWT.Virtual eintragen...
 
Zuletzt bearbeitet von einem Moderator:
hatte nur 25 einträge, allerdings hängt er sich schon auf, wenn noch nicht mal einer drin ist...
ich probiers nochmal...
 
faszinierend.

vor deinem code:
alles läuft normal
mit deinem code
alles stürzt ab.
dein code wieder raus.
stürzt noch immer ab...

wtf?!
 
Hab ein revert aus meinem svn gemacht und jetzt klapps wieder... Werde deinen Code am Freitag nocheinmal einbauen...
 
no, nachdem ich jetzt den bug endlich los bin...
zurück zum thema hier...

Java:
java.lang.IllegalArgumentException: Argument cannot be null
und zwar passiert das in zeile:
Java:
gc.setBackground(background);

grund, ist... dass die tabelle noch nie focus hatte... (ich kann einen default wert einstellen
Java:
			Color background = new Color(Display.getDefault(), 0, 0, 0); // back
			Color foreground = new Color(Display.getDefault(), 255, 255, 255); // white
dann klappts, allerdings... wie bekomme ich die korrekten farben?
Java:
			Color background = viewer.getTable().getBackground();
			Color foreground = viewer.getTable().getForeground();
liefert nicht die korrekten retour... (wahrscheinlich weil es die derzeitigen zurückgibt, und nicht die, der selection...)
 
hab die lösung selbst gefunden!

Java:
/*
		 * NOTE: EraseItem is called repeatedly. Therefore it is critical for
		 * performance that this method be as efficient as possible.
		 */
		viewer.getTable().addListener(SWT.EraseItem, new Listener() {
			Color background = Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION);
			Color foreground = Display.getDefault().getSystemColor(SWT.COLOR_LIST_FOREGROUND);

			public void handleEvent(Event event) {
				event.detail &= ~SWT.HOT;
				if ((event.detail & SWT.SELECTED) == 0)
					return; /*
							 * item not selected
							 */
				int clientWidth = viewer.getTable().getClientArea().width;
				GC gc = event.gc;
				Color oldForeground = gc.getForeground();
				Color oldBackground = gc.getBackground();
				gc.setBackground(background);
				gc.setForeground(foreground);
				gc.fillRectangle(0, event.y, clientWidth, event.height);
				gc.setBackground(oldBackground);
				gc.setBackground(oldForeground);
				event.detail &= ~SWT.SELECTED;
			}
		});
 
Ja klar wenn deine Table nie den Focus bekommt, dann ists klar aber ich wusste auch nimmer wie man die Selektion Farbe bekommt 😉 aber hast ja selber rausbekommen...
 

Zurück
Oben