Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SWT dluga lista wyboru w combo, jak przyspieszyc

14 views
Skip to first unread message

Jopotam

unread,
Apr 11, 2011, 2:57:47 AM4/11/11
to
W jednym z okienek (SWT) do wprowadzania danych mam miedzy innymi pole do
wprowadzania numeru istniejacego towaru. Istniejacych towarow mam ok 30 000.
Probowalem taka liste zaladowac do Combo ale okienko z takim combo otwiera
sie kilka sekund (nie do przyjecia). Byc moze pomysl z Combem nie jest
najszczesliwszy ale nic prostrzego nie przychodzilo mi do glowy.
Czy mozecie mi poradzic w jaki sposob zrobic taka dluga liste wyboru zeby
nie byla jednoczesnie zakala.
--
jopotam

Jacek Czerwinski

unread,
Apr 11, 2011, 3:08:18 AM4/11/11
to
W dniu 2011-04-11 08:57, Jopotam pisze:

Na pewno nie Combo.
Widget (byc moze) 'Text' obok przycisk uruchamiajacy funkcjonalnosc
filtrowania (np. Button z trzema kropkami, czy ze szklem powiekszajacym).

Adam Jurzyk

unread,
Apr 11, 2011, 3:44:14 AM4/11/11
to
On 2011-04-11 08:57, Jopotam wrote:
> W jednym z okienek (SWT) do wprowadzania danych mam miedzy innymi pole do
> wprowadzania numeru istniejacego towaru. Istniejacych towarow mam ok 30
> 000.
> Probowalem taka liste zaladowac do Combo ale okienko z takim combo
> otwiera sie kilka sekund (nie do przyjecia).

30.000 pozycji w ComboBox-ie bedzie napewno fajnie się przegladać.
Proponuje jeszcze losową kolejność. Użytkownicy będą zachwyceni.

Ja bym zrobił jakiś widget (np z JTable) i koniecznie jakis mechanizm do
filtrowania.

Adam

Jopotam

unread,
Apr 13, 2011, 3:22:20 AM4/13/11
to

Użytkownik "Adam Jurzyk" <a.ju...@gazeta.pl> napisał

>
> Ja bym zrobił jakiś widget (np z JTable) i koniecznie jakis mechanizm do
> filtrowania.
>
Dzieki, chyba tak zrobie tym bardziej ze w innych miejscach uzywam takie
mechanizmu do filtrowania. Po prostu w oknie edycyjnym wydawalo mi sie ze
Combo bedzie bardziej funkcjonalne.

Mam jeszcze jedno pytanie, w jaki sposob, bez uzycia petli, przeniesc
zawartosc
ArrayList<Object> do String[].

Probowalem robic cos takiego:
ArrayList<ObjOriginal_nr> tabWithRecords;
....................
String[] row = (String[]) tabWithRecords.toArray();

niestety dostaje komunikat:
java.lang.Object; cannot be cast to java.lang.String;

W petli for idzie to oczywiscie bezblednie ale sadze ze istnieje jakas inna
prostsza metoda i wlasnie o to pytam.

--
jopotam

Jacek Czerwinski

unread,
Apr 13, 2011, 3:57:42 AM4/13/11
to
W dniu 2011-04-13 09:22, Jopotam pisze:
>

> ArrayList<ObjOriginal_nr> tabWithRecords;
PS. Deklaracje zmiennych zaleca sie robic na typie bardziej
abstrakcyjnym (List<ObjOriginal_nr>) a inicjowac na konkretnym.
Dlaczego? Bo tak w OP sie robi ...

PPS. Mam zle przeczucia, ze to jest zaprojektowane na Object.

> .....................


> String[] row = (String[]) tabWithRecords.toArray();

Tablice (i ogolnie kontenery) nie daja sie rzutowac co do typu bazowego.
To jakby jeden na chlopski rozum poziom wewnatrz, a rzutuje sie typ
zewnetrzny.

Jopotam

unread,
Apr 13, 2011, 6:31:21 AM4/13/11
to

Użytkownik "Jacek Czerwinski" <x...@y.z.pl> napisał

> Tablice (i ogolnie kontenery) nie daja sie rzutowac co do typu bazowego.
> To jakby jeden na chlopski rozum poziom wewnatrz, a rzutuje sie typ
> zewnetrzny.

Dzieki,
chyba ja nigdy nie pojme tej Javy.
Mam w okienku SWT pare pol typu Text do wprowadzania danych.
Jedno z pol nie moze byc puste wiec postanowilem zastosowac do tego pola
FocusListener.
W metodzie focusLost daje komunikat po czym probuje ustawic fokus z powrotem
na omawiane pole. Komunikat sie owszem ukazuje ale fokus nie powraca do
wybranego pola.
Probowalem setFocus () i forceFocus () bez zadnego rezultatu, obie metody
zwracaja "false".
Powiedz mi jak w javie SWT daje sie wrocic do wprowadzanego pola jesli
wartosc jest niezgodna z przeznaczeniem?

--
jopotam


Jacek Czerwinski

unread,
Apr 13, 2011, 8:40:55 AM4/13/11
to
W dniu 2011-04-13 12:31, Jopotam pisze:

>
> Użytkownik "Jacek Czerwinski" <x...@y.z.pl> napisał
>
>> Tablice (i ogolnie kontenery) nie daja sie rzutowac co do typu
>> bazowego. To jakby jeden na chlopski rozum poziom wewnatrz, a rzutuje
>> sie typ zewnetrzny.
>
> Dzieki,
> chyba ja nigdy nie pojme tej Javy.

Nie Javy tylko tu mowa o bibliotece SWT. Nie jest to czesc jezyka Java.
Za twoim pytaniem nie moge teraz szukac, nie mam mozliwosci.

Pewnie w argumencie Event cos trzeba na false, ale nie bede sie upieral.


Boguś

unread,
Apr 13, 2011, 5:29:17 PM4/13/11
to
Dnia 13-04-2011 o 09:22:20 Jopotam <jop...@wp.pl> napisa�(a):

> Mam jeszcze jedno pytanie, w jaki sposob, bez uzycia petli, przeniesc
> zawartosc
> ArrayList<Object> do String[].
>
> Probowalem robic cos takiego:
> ArrayList<ObjOriginal_nr> tabWithRecords;
> ....................
> String[] row = (String[]) tabWithRecords.toArray();
>
> niestety dostaje komunikat:
> java.lang.Object; cannot be cast to java.lang.String;

String[] row = tabWithRecords.toArray(new String[0]);
String[] row = tabWithRecords.toArray(new String[tabWithRecords.size()]);

ew. trzeba będzie zrzutować.

--
Boguś

Boguś

unread,
Apr 13, 2011, 5:46:34 PM4/13/11
to
Dnia 13-04-2011 o 12:31:21 Jopotam <jop...@wp.pl> napisa�(a):

> Dzieki,
> chyba ja nigdy nie pojme tej Javy.
> Mam w okienku SWT pare pol typu Text do wprowadzania danych.
> Jedno z pol nie moze byc puste wiec postanowilem zastosowac do tego pola
> FocusListener.
> W metodzie focusLost daje komunikat po czym probuje ustawic fokus z
> powrotem na omawiane pole. Komunikat sie owszem ukazuje ale fokus nie
> powraca do wybranego pola.

Możesz użyć Display.getCurrent().asyncExec. Można też słuchać
org.eclipse.swt.events.KeyListener i na klawisz TAB ustawić
org.eclipse.swt.events.KeyEvent.doit = false, ale nie wiem, na ile to jest
przenośne.

--
Boguś

Jopotam

unread,
Apr 14, 2011, 1:59:31 AM4/14/11
to

Użytkownik "Boguś" <no...@invalid.net> napisał

String[] row = tabWithRecords.toArray(new String[0]);
String[] row = tabWithRecords.toArray(new String[tabWithRecords.size()]);

ew. trzeba będzie zrzutować.

probowalem zastosowac Twoja propozycje i z rzutowaniem i bez z jednakowym
komunikatem, ponizej:
java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.Arrays.copyOf(Arrays.java:2763)
at java.util.ArrayList.toArray(ArrayList.java:305)

tabWithRecords jest lista obiektow a ja chcialbym zaladowac do String[]
tylko wartosc jednego pola obj.getOriginal_nr () bez uzycia petli for.
Mysle ze jednak jest to do zrobienia tylko nie mam na tyle doswiadczenia z
java zeby sobie z tym poradzic.

W poprzednim poscie Jacek pisal ze:


"Tablice (i ogolnie kontenery) nie daja sie rzutowac co do typu bazowego.
To jakby jeden na chlopski rozum poziom wewnatrz, a rzutuje sie typ
zewnetrzny."

--
jopotam

Jacek Czerwinski

unread,
Apr 14, 2011, 6:01:52 AM4/14/11
to
W dniu 2011-04-13 14:40, Jacek Czerwinski pisze:

> W dniu 2011-04-13 12:31, Jopotam pisze:

> Za twoim pytaniem nie moge teraz szukac, nie mam mozliwosci.


>
> Pewnie w argumencie Event cos trzeba na false, ale nie bede sie upieral.
>

Po sprawdzeniu okazuje sie, ze FocusEvent nie ma pola boolean z
zezwoleniem na wykonanie (jak niektore inne Eventy).

Mozesz sprobowac w zdarzeniu odnotowac sobie w zmiennej problem
walidacyjny, i na wyzszym poziomie wymusic setFocus() (nie wymyslilem
jeszcze w jakim zdarzeniu). Takie gdybanie. Jak sie wczuwam w filozofie
SWT, uzycie setFocus z wnetrza takie zdarzenia moze byc zakazane (ale
nie znalazlem takiej informacji)

Chyba najbardziej eleganckim sposobem jest przejscie na poziom Jface,
tam wszystko do wysokopoziomowej walidacji jest wbudowane.
Fajne, ale dosc ambitne.

http://eclipse.dzone.com/articles/adding-swt-input-validation-ea?page=0,0

Boguś

unread,
Apr 14, 2011, 3:25:22 PM4/14/11
to
Dnia 14-04-2011 o 07:59:31 Jopotam <jop...@wp.pl> napisa�(a):

> Użytkownik "Boguś" <no...@invalid.net> napisał
>
> String[] row = tabWithRecords.toArray(new String[0]);
> String[] row = tabWithRecords.toArray(new String[tabWithRecords.size()]);
>
> ew. trzeba będzie zrzutować.
>
> probowalem zastosowac Twoja propozycje i z rzutowaniem i bez z
> jednakowym komunikatem, ponizej:
> java.lang.ArrayStoreException

Jakoś się zasugerowałem, że masz List<String> a nie List<CośInnego>. To co
chcesz zrobić to tylko pętlą.

--
Boguś

0 new messages