Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Powód braku javy w ie był już tu podany, ale powtórzę : Otóż microsoft zmodyfikował javę tak żeby nie była zgodna z oryginałem, i były 2 niezgodne ze sobą wersje : java i ms-java (swoją drogą w tamtym okresie to była typowa polityka giganta z Redmont, ie dopiero w wersji 8 będzie poprawnie obsługiwał "prawdziwy" html). Sunowi się to nie spodobało, i na drodze sądowej wymusił koniec ms-javy (naruszenie warunków licencji). To z kolei nie spodobało się microsoftowi, i zamiast dodać do ie oryginalną javę stworzył c# jako jej konkurenta. ps jeszcze w sprawie activex większość problemów z ie6 to były właśnie złośliwe kontroli activex, to ustrojstwo ma zwyczajnie za duże możliwości jak na rozwiązania internetowe (do czego przyznał się sam microsoft, bo aktualnie wycofuje się z activex.)
edit: zapomniałem dopisać iż ms-java byłą zrobiona tak "sprytnie", że nie dało się mieć obu naraz. działała tylko ta którą instalowaliśmy jako ostatnią (więc instalki obu wersji na pulpicie nie były niczym niezwykłym, bo trzeba było instalować tą z której korzystała aktualnie używana strona).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Uroczo pominąłeś 11 z 12 zarzutów. Brak kompatybilności był tylko jednym z nich. Oczywiście pozostaje kwestią indywidualnych zapatrywań, który z zarzutów był znaczący. Kompatybilność była najważniejsza? Wątpię, nie przypominam sobie by Sun ciągnął do sądu IBM za wydanie niekompatybilnego RE. Ciekawe, że w przypadku IBMa zakłada się, że to bug, w przypadku MS to celowe działanie mające na celu zdominowanie rynku.

Przy okazji ciekawe, że pozew Sun przeciw MS dotyczył m.in. "interference with prospective economic advantage" czyli próby odebrania rynku Sunowi. Nikt nie wytacza największego pozwu w historii z powodu niekompatybilnej maszyny wirtualnej. Jeśli chcesz wierzyć, że nie chodziło o pieniądze (MSJVM była odrobinę bardziej wydajna pod Windows od tej od Suna), Twoje prawo.

Sun wymusił miliardowym pozwem pozbycie się Javy jako "uprzywilejowanego" języka z platformy. Pretensje do Suna, bo tym samym zepchnęli Javę na margines rynku języków do zastosowań klienckich. Java (głownie dzięki znakomitej implementacji fibers) trzyma się i będzie się trzymała mocno na rynku servletów, ale swoim pozwem Sun sprawił, że Java z Języka stała się językiem.

Sun obawiał się, że ich narzędzia zostaną wyparte przez narzędzia MS a w efekcie mają własny język wypierany przez język MS. Sami sobie zgotowali ten los i płakanie dziś, zrzucanie winy na MS niewiele pomoże.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

O ile mnie (dobra ale krótka) pamięć nie myli to część wywołań javy została zastąpiona tymi z directx, co zabezpieczało ms-jave przed portowaniem na inne systemy. Czyli o bugu nie może być mowy (tylko o celowym działaniu).
ps nigdzie nie twierdziłem że odpowiadam na całego posta, akurat to wiedziałem więc napisałem.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 04.06.2008 o 18:53, ConayR napisał:

Może najzwyczajniej w świecie się nie rozumiemy?

Możliwe bo widzę, że napisałeś o czymś innym niż ja.

Dnia 04.06.2008 o 18:53, ConayR napisał:

"Skrypt wykonywany jest na prawach procesu hostującego" oznacza, że ma taki Security Descriptor jak proces hostujący.

Tak. Mówisz o prawach lokalnego dostępu, który może być identyczny jak VM bo przecież to VM działa. To maszyna wirtualna pracuje na podstawie kodu, który jest dla tej maszyny tylko danymi. Tak więc jest to oczywiste, że w tym sensie dowolny kod nienatywny musi mieć takie same lokalne prawa dostępu jak wydumane prawa kodu skryptu. A dlaczego wydumane? Bo sam kod nie jest w stanie odpalić procesu - ani swojego, ani cudzego. Dla lokalnego systemu są to "bajtowe bzdury" bez żadnego znaczenia. A to jakie wewnętrznie prawa dostępu ustala maszyna wirtualna dla poszczególnych kodów skryptowych, to inna bajka. Oczywiście prawa te są ograniczone prawami samej maszyny wirtualnej jako procesu.

Dnia 04.06.2008 o 18:53, ConayR napisał:

[...] może na nich operować jeśli SD procesu odpowiada ACL pliku.

Wszystko to prawda.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Przecież napisałem poprzednio dlaczego nie działa: nie jest podpisany lub nie zaufałem podpisowi autora.

To nawet nie chodzi o to, że nie ma podpisu bo podpisu wymagają jedynie pełnoprawne programy takie jak uruchamiane przez jnlp. Obroną przed uruchomieniem operacji dyskowych dla apletu jest sama JVM. Gdyby nie miała blokady (nałożonej od zawsze i na zawsze), to wszystkie aplety uruchamiałyby operacje dyskowe bez Twojej zgody i wiedzy.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Jasne, że można stworzyć aplet, który nie może czytać z dysku

Niedokładnie. Sugerujesz, że skoro tak, to można i stworzyć i aplet, który może czytać z dysku lub na niego pisać.
Otóż NIE MOŻNA stworzyć apletu, który potrafi czytać z dysku lub na niego pisać. To jest po prostu NIEMOŻLIWE. Tak jest zbudowana JVM i *na twardo zakodowana*. Żaden aplet - bez względu na to czy uruchomiony lokalnie czy zdalnie nigdy nie uruchomi lokalnej operacji dyskowej. Jeżeli nie możesz uwierzyć, to sprawdź.

Dnia 04.06.2008 o 18:53, ConayR napisał:

(przykłady powyżej) ale nie znaczy to, że nie można napisać apletu, który z dysku czyta.

Nie. Powtórzę. Dokładnie znaczy to, że nie można napisać apletu, który z dysku czyta.

Dnia 04.06.2008 o 18:53, ConayR napisał:

To nie są fakty, to są przykłady.

Nie znam lepszego udokumentowania faktów niż przykłady.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Zatwierdź czyjś certyfikat, uruchom aplet tej osoby i jeśli aplet jest podpisany, aplet ma prawo dostępu do dysku.

Pod warunkiem, że mówisz ogólnie o apletach w sensie kodu po procesie Suna z Microsoftem. Pierwotnie słowo applet było zarezerwowane tylko dla Javy. W czasach gdy rozwijano technikę apletów nie było żadnych podpisów. Nie było takiej potrzeby. Aplety działały bezpiecznie bez podpisów, bez żadnego potwierdzenia zaufania ze strony użytkownika. I tak jest do dzisiaj.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Bug w skrypcie flasha ma takie same skutki jak bug w kodzie apletu: flash/aplet nie wykona się prawidłowo.

Najczęściej masz rację. Jednak przypadkowo wrzucone śmieci do kodu bajtowego Javy nawet jeżeli zostaną zinterpretowane jako operacje dyskowe - nie wykonają się. W przypadku Flasha nie jest to już takie pewne. Wystarczy, żeby użytkownik wcześniej zatwierdził zaufanie lub w ogóle wyłączył jakiekolwiek blokady. Fakt, że śmiecie wrzucone do dowolnego podpisanego kodu powoduję, że podpis przestaje pasować z szansą kilkaset miliardów do jednego (czyli ogromną - prawie równą pewności), ale dzieje się to już z innego powodu - innego mechanizmu zabezpieczeń.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Dlaczego przeciwstawiasz sobie dwie klasy błędów: środowiska i skryptu?

Bo to są dwie klasy błędów. Bug w środowisku jest potencjalnie zawsze niebezpieczny. Bug w skrypcie może, ale nie musi. Zależy to od tego jak środowisko eliminuje błędy skryptu.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Ale nie różni się to od użytkownika-kretyna, który ufa podpisowi aplety Javy.

To nie tak. Zaufanie nie dotyczy apletu Javy, lecz dotyczy potencjalnie niebezpiecznej kontrolki, która dopiero uruchamia wcześniej zainstalowany przez użytkownika lub administratora lokalny program JRE.
Jeżeli jednak przeglądarka nie używa natywnych kontrolek ActiveX (np. FF, IE3/4, Netscape 3.x), to napotykając na tag applet albo bezpośrednio uruchamia lokalnie zainstalowaną JVM, (albo robi to za pośrednictwem również lokalnie zainstalowanego pluginu tej przeglądarki). W obu wypadkach nie ma mowy o uruchomieniu jakiegokolwiek zewnętrznego kodu wykonywalnego przez procesor.
Dopiero dziajająca już JVM uruchamia aplet, do którego może nie być żadnego podpisu. Aplety Javy jak nie miały podpisów np. w 1995 r., tak nie muszą mieć ich do dzisiaj. I nie myl proszę ich z JNLP, które działają nieco inaczej - nie są one jednak apletami Javy, ale pełnymi programami z wszelkimi prawami dostępu aż do poziomu dostępu JVM włącznie.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Cały czas próbuję Ci to wyjaśnić (i niestety zawodzę).

Nie tak zupełnie. Udało Ci się mnie przekonać, że zakładając iż maszyna wirtualna flasha działa bezbłędnie, to kod flasha wydaje się równie bezpieczny jak kod bajtowy Javy. Przyjąłem do wiadomości i nie będę rozsiewał dezinformacji w tej sprawie.

Dnia 04.06.2008 o 18:53, ConayR napisał:

I tym samym wprowadzałeś w błąd czytających ten temat. Tym bardziej zgubny, że "reklamowałeś" (z braku lepszego słowa) Javę jako bezpieczną.

Dalej "reklamuję". Ale od początku tylko i wyłącznie same aplety Javy. Tylko one są bezpieczne mimo, iż nie posiadają żadnego podpisu. Dla przykładu na moim komputerze, na którym zwykle piszę, nigdy nie podpisałem niczego jako bezpieczne, nie mam żadnych zaufań sieciowych (absolutnie żadnych). Nic się nie uruchomi. Jedynym wyjątkiem są aplety Javy, które uruchamiają się. Oczywiście wymaga to olania/eliminacji przeglądarki IE (może być każda inna poza IE5/6/7/8).

Dnia 04.06.2008 o 18:53, ConayR napisał:

Lokalnie uruchamiana kontrolka nie wymaga zaufanego podpisu.

Bo ją uruchamiasz wg lokalnych praw dostępu. Ma takie same prawa jak uruchamiające ją przeglądarka (chyba, że ona to ograniczy). To oczywiste.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Samo zaufanie nie różni się znacznie od potwierdzenia otwarcia pliku, prawda?

Nie. To nie to samo. Wiem, że czepiam się szczegółów, ale właśnie o te szczegóły się rozchodzi.

Dnia 04.06.2008 o 18:53, ConayR napisał:

raz zatwierdzony podpis daje pełen dostęp dla wszystkich apletów.

Nie. Daje dostęp dla pełnych programów Javy. Możesz oczywiście podpisać i aplet, ale jest to wtedy podwójne zabezpieczenie. Pierwsze przed wczytaniem jakiegoś kodu podpinanego pod proces przeglądarki i/lub jej plugina, a drugim jest twarda blokada dostępu dla apletów przez JVM.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Od początku chodzi mi tylko o to, byś nie mamił ludzi wizją "bezpiecznej Javy"

A ty nie zakłamywał ludzi wizją niebezpiecznej Javy. Bo jak na razie rzucasz argumentami przygotowywanymi przez ogłupiającą propagandę marketingu Microsoftu. I próbuję Ci wykazać że jest ona całkowicie kłamliwa.

Dnia 04.06.2008 o 18:53, ConayR napisał:

bo historia błędów każdego Javowego środowiska jest naprawdę długa.

Podobnie jak historia błędu każdego środowiska - czy to Flasha Macromedii czy to błędów przeglądarek czy środowiska .NET czy każdego innego. Nie ma bezbłędnych programów, ale czym innym jest niebezpieczeństwo popełnione w wyniku błędu kodowania, a czym innym niebezpieczeństwo spowodowane błędem założeń jakiejś technologii - błędem projektowym. To zupełnie inna klasa niebezpieczeństw.
W pierwszej niebezpieczeństwo zdarza się czasem, w drugiej bezpieczeństwo zdarza się czasem. :)

Dnia 04.06.2008 o 18:53, ConayR napisał:

zapewnianie ich o bezpieczeństwie (i podawanie niesamowicie zabugowanego konkurenta jako dowodu na wyższość czegoś) prowadzi do opłakanych skutków.

Nic nie wspominałem o bugach we flashu. To była Twoja wypowiedź. Natomiast zapewniam o bezpieczeństwie apletów Javy bo wiem o czym mówię. Trochę się tym zajmuję. Działalność niszowa, ale to działa i jest bezpieczne. I bez podpisu.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Zanim odpowiem na resztę: to JAK działa konkretna kontrolka ActiveX jest winą autora kontrolki.

Nie. Kontrolka ta może działać w taki sposób, że procesor może wykonać instrukcje maszynowe pochodzące bezpośrednio z sieci. Nie ma lepszego mechanizmu wirusogennego. Microsoft chciał nam zafundować po swoim zawirusowanym OS również zawirusowany internet. "Zawirusowany" - w sensie "przygotowany do działania wirusów". Wirus Ready. :)

Dnia 04.06.2008 o 18:53, ConayR napisał:

Wina MS leży głównie w braku dobrej dokumentacji, co prowadziło do powstawania fatalnych, niebezpiecznych kontrolek ActiveX

No popatrz, a takie tęgie głowy stwierdziły, że to jednak nie polega tylko na niechlujnej dokumentacji. :)
Od siebie dodam tylko, że kiedyś spreparowałem kontrolkę ActiveX, która uruchomiona pod pierwszą wersją IE4 (która nie zawierała jeszcze technologii podpisów) zmazuje nieodwracalnie wszystkie dane z dysku i to tak, że nie zdążysz zareagować. Kontrolka zajmuje raptem ok. 300 bajtów i używa prawidłowych wywołań API. Nie może więc być zakwalifikowana jako niebezpieczny kod przez programy antywirusowe. Kasowanie dysków zaczyna się tuż po otwarciu strony z zawartą kontrolką i działa aż do zniszczenia systemu Windows. Współcześnie mogę ją podpisać i wydając nieco kasy na certyfikat (kilkaset dolarów raptem) nawet oznaczyć jako zaufaną.
O jakim więc bezpieczeństwie tej technologii mówisz? To jest ZERO bezpieczeństwa.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Niestety jakość powstającego dzisiaj kodu jest niska: nie ważne, czy mówimy o małych firmach czy korporacjach wielkości Adobe.

Tym bardziej więc istotne są technologie zaprojektowane z góry na bezpieczeństwo danych użytkownika.

Dnia 04.06.2008 o 18:53, ConayR napisał:

W założeniu ActiveX daje Ci tyle, ile od ActiveX chcesz. Problemem jest mental: ile chcę? To dajcie wszystko! Po co się mam ograniczać?

O właśnie. Tyle, że ty napisałeś to w stosunku do projektanta programu, a to nie tu jest problem z bezpieczeństwem. "To dajcie wszystko!" stosuje się do usera. Szczególnie usera, który jest adminem (czyli zasadniczo w Windows). :)

Dnia 04.06.2008 o 18:53, ConayR napisał:

Lekcja historii: czemu usunęło?

O ile pamiętam z powodu przegranego procesu z Sunem, albo ugody. Chodziło o złamanie umowy w której MS zobowiązał się do aplikowania w ich przeglądarkach najnowszej wersji Javy. Sun wymógł więc, aby jeżeli MS nie chce aplikować najnowszej wersji, to żeby jej nie włączał do przeglądarki w ogóle. W ten sposób stara wersja javy nie mogła blokować możliwości uruchamiania nowszego kodu apletów (bo o nie się wtedy głównie rozchodziło) przez inne rozwiązania - takie jak przez tak object czy obecnie przez jnlp. Ani Microsoft nie mógł włączać do IE maszyny wirtualnej działającej inaczej niż maszyna produkcji Suna (co oznaczałoby koniec Javy jako technologii w ogóle).

Dnia 04.06.2008 o 18:53, ConayR napisał:

Tyle że od około 12 lat najpierw trzeba kontrolce ręcznie pozwolić na uruchomienie.

Tyle, że od dłuższego czasu próbuję Ci przekazać, że aplet Javy nie jest kontrolką w sensie narzuconym przez Microsoft. :) To tylko propaganda tej firmy. Natomiast można spokojnie za kontrolkę uznać każdy program Javy uruchamiany przez np. JNLP. Ale to nie jest to samo.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Nie bardzo rozumiem do czego zmierzasz: masz pretensje, że Java jest równoprawnym elementem ekosystemu?

Nie. Tylko o to, że aplety Java zostały zrównane do poziomu prymitywnego i niebezpiecznego ActiveX. A tym samym przestał działać ich największy atut - bezpieczne uruchamianie niepodpisanego kodu nieznanego pochodzenia - czyli dowolnego kodu. I tu właśnie wracamy do początku dyskusji czyli do stosowania tagu APPLET w html i jego "niezalecania" (ang. "deprecated") używania polecanego przez W3C. Inna sprawa, żebyś nie mylił go z "przestarzałym" (czyli ang. "obsolete").
Zauważ przy okazji, że rozkwit flasha wynika z działania niepodpisanych plików SWF. Możesz spotkać każdą witrynę i na każdym kod flasha działa - nieważne kto go napisał, kiedy i gdzie - chyba, że zabronisz odpalać flasha całkowicie - przez zablokowanie flash playera. Poniekąd sukces tego formatu jest pochodną dobijania Javy przez Microsoft. Wszedł on w niszę opuszczoną na pewien czas przez Javę. Że tak się wyrażę. :)

Dnia 04.06.2008 o 18:53, ConayR napisał:

.NET i C# powstały z tego samego powodu z jakiego MS zarzucił Javę.

Oczywiście. Musiał stworzyć alternatywę dla czegoś, czego w swoich przeglądarkach już nie miał, albo ściślej - nad czym przestał mieć pełną kontrolę (a później jakąkolwiek).

Dnia 04.06.2008 o 18:53, ConayR napisał:

Ponownie spytam: dlaczego? :-)

Teraz już powinieneś odpowiedzieć sobie sam. :-)

Dnia 04.06.2008 o 18:53, ConayR napisał:

Masz jakieś wewnętrzne źródła dlaczego Windows Update nie jest kontrolką ActiveX, czy zgadujesz?

Wyobraź sobie, że sprawdziłem zapisy rejestru i nawet zdeasemblowałem sobie odpowiednie dll''e (zaczynasz oczywiście od wupdmgr.exe). Co akurat jest banalne bo sam "program" to trywialne uruchomienie kodu, który już w systemie siedzi od momentu jego ściągnięcia.

Dnia 04.06.2008 o 18:53, ConayR napisał:

Jeśli nie wiesz gdzie leży błąd w Twoim rozumowaniu, z chęcią Ci go przedstawię. :-)

To przedstaw. Chętnie przeczytam tę wersję.
Pozdrawiam.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witajcie potrzeba mi pomocy przy jednym programie ,chciałbym napisać program: przelicznik z liczb w systemie dziesiętnym na dwójkowy i na odwrót.

Proszę o pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 10.06.2008 o 16:37, Logan10 napisał:

Witajcie potrzeba mi pomocy przy jednym programie ,chciałbym napisać program: przelicznik
z liczb w systemie dziesiętnym na dwójkowy i na odwrót.

To jeden z najłatwiejszych programów bo liczby w komputerze są trzymane zawsze w systemie dwójkowym. W C:

void main(void)
{

int liczba = -1; //wyświetli każdą liczbę oprócz -1 czyli samych jedynek w kodzie U2

//Dziesiętne -> Dwójkowe

do { cout >> "Podaj liczbę dziesiętną: "; cin >> liczba; }
while(liczba <= 0); //puszczamy dalej tylko gdy dodatnia czyli wczytana

cout << "\nLiczba dwójkowa: ";
for (int x = 8 * (( sizeof liczba ) - 1); x >= 0 ; --x) //ogranicznikiem jest liczba bajtów liczby * 8 bitów
//wyodrębniamy poszczególne bity od najbardziej znaczącego w dół za pomocą przesunięcia
//wszystkich bitów w dół (prawo) o x pozycji i wycięcia właściwego bitu z maski 0x1
cout << ( ''0'' + ( (liczba >> x) & 0x1 ) ); //w wyniku mamy ''0'' lub ''1'', które drukujemy

//Dwójkowe->Dziesiętne

do //cała robota tutaj to wczytanie cyfr
{
liczba = -1; //wyświetli każdą liczbę oprócz -1 czyli samych jedynek w kodzie U2
int x = 8 * sizeof liczba; //liczba bitów
cin >> "\n Podaj poprawną liczbę dwójkową (" >> i >> " wartości 0 lub 1): ";
while (--x >= 0) //wstępnie pomniejszane do zakresu [0..liczba bitów-1]
{
char c = ''\0'';
cin >> c;
if(c != ''0'' || c != ''1'') { liczba = -1; break } //zły znak (nie cyfra) - wszystko od początku
liczba |= (c - ''0'') << x; //umieszczanie kolejnych bitów przez doklejanie operacją OR
}
} while( liczba != -1 ); //kończy wczytywanie tylko dla poprawnej liczby.
cout << "Liczba dziesiętna: " << liczba << endl; //wyświetla już w postaci dziesiętnej

}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

char c = ''\0''; służy zainicjowaniu zmiennej c jakimś znakiem (tutaj o zawsze nieprawidłowym kodzie). Zmiennych niezainicjowanych nie można używać w żadnych operacjach poza nadaniem wartości przez operator =.
Jeżeli operacja wczytania znaku c nie uda się, to zmienna c wciąż ma poprzednią wartość. Jeżeli jednak się uda, to wartość zmienia się na wczytaną.
Wtedy dopiero można porównać czy wczytany znak jest prawidłową cyfrą dwójkową i zamienić ją na liczbę 0 lub 1 w operacji c - ''0''. Odjęcie wartości kodów dwóch znaków od siebie daje w wyniku przesunięcie między nimi czyli różnicę ich wartości. Jest tak bo kody znaków cyfr we wszystkich kodowaniach (ASCII, EBCDIC i inne) są zawsze ustawione kolejno.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 10.06.2008 o 17:33, Logan10 napisał:

trzeba mi funkcje która wydrukuje co 5-ą sumę spośród liczb całkowitych od 1-50.

Bardzo enigmatycznie sformułowane zadanie. Zawsze mnie denerwowały tak niejasno podane zadania bo nie bardzo wiadomo jak je interpretować. Bo co to właściwie jest n-ta suma?
Poza tym jak już się wie co dodać, to jest to bardzo łatwe zadanie, więc powinieneś spokojnie zrobić to sam.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam problem z programem w Javie.
Otóż w NetBeansie utworzyłem sobie cały graficzny układ programu. Składa się z JFrame, a w nim kilka JTextFieldów, JButton i JPanel.
I problem jest taki, że gdy kliknę w buttona to w JPanelu ma mi się coś narysować..
I tu problem - jak wybrać by rysowanie odbywało się tylko w JPanelu, nie w całym jFrame?
Mam nadzieję, że dość zrozumiale piszę xD

ps. Nie jest to ważne czy malowanie będzie przy użyciu gDC, czy Javy2d.. Ważne dla mnie jest tylko wybranie konkretnego pola do rysownia. :/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 20.06.2008 o 13:36, DemoBytom napisał:

I problem jest taki, że gdy kliknę w buttona to w JPanelu ma mi się coś narysować..
I tu problem - jak wybrać by rysowanie odbywało się tylko w JPanelu, nie w całym jFrame?

Po pierwsze zakładam, że zarejestrowałeś obiekt ActionListener dla przycisku (choćby jako klasę anonimową) za pomocą medody addActionListener() i jedyne co to przyciśnięcie robi, to zmienia wartość zmiennej boolean od której zależy rysowanie tego czegoś na panelu.

Po drugie powinieneś użyć przedefiniowania metody PaintComponent(Graphics g) dla JPanel, tak aby odrysowywać sam panel, a nie cokolwiek innego. Wcześniej musisz oczywiście dodać twoją klasę rozszerzającą JPanel do obiektu okna JFrame i zastosować najlepiej metodę pack() do rozłożenia panelu na całej powierzchni JFrame.

Pamiętaj, żeby wszystkie funkcje Swinga używać wyłącznie przez metodę wywołaną z uruchomienia SwingUtilities.InvokeLater() z argumentem klasy implementującym interfejs Runnable. Inaczej może dojść do zakleszczenia wątku graficznego interfejsu i zrobi się kaszana bez łatwej możliwości debugowania.

Funkcje rysujące nie pracują na żądanie. Wszelkie odrysowania okna są wywoływane przez system w momencie w którym element lub jego część jest widoczna na ekranie. Jeżeli więc nie chcemy, aby coś się rysowało w danym momencie, to za pomocą zmiennej logicznej zamiast rysować coś na komponencie JPanela nie robimy tego, a co najwyżej wywołujemy super.PaintComponent lub super.Paint (dla obiektów tylko AWT). Metody przodków zwykle tylko zamalowują cały obszar bieżącym kolorem tła. Gdybyśmy tego nie zrobili, to w tym miejscu będą piksele z tego co był wcześniej - czyli okno będzie przezroczyste w swoim obszarze roboczym.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, bo troszkę się nie dogadaliśmy :P
A więc tak.. W Javie już dość sporo programów napisałem, jednak zazwyczaj były to programy jednym jPanelem, kilkoma przyciskami a cały układ pisałem "z palca" czyli:
b1=new JButton();
JPanel p=new JPanel();
(albo do rysowania moja rozszerzoana klasa (poniżej) Pole p = new Pole();)
p.add(b1);
Akcja a=new Akcja();*
b1.addActionListener(a);
JFrame f=new JFrame();
Container c=f.getContentPane();
c.add(p);
f.setSize(200,60);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);

*dla klasy akcja, obsługującej ActionListenery
Przy czymś takim ani za bardzo nie był ważny sam układ programu.. A i jak coś musiałem rysować to zazwyczaj po prostu tworzyłem sobie nową klasę np:

class Pole extends JPanel
{
public void paintComponent(Graphics g){}
[...]
}
i tam zajmowałem się rysowaniem..
Miałem tą przewagę, że obiekty rysowane były tylko w tym panelu, a układ współżędnych odnosił się tylko do niego (czyli punkt (0,0) był w lewym górnym rogu tego panelu, nie całego jFrame w którym to było dodawane)..

No, ale ostatnio musiałem zrobić już program z dużo bardziej rozbudowanym GUI. sporo textfieldów, kilka buttonów, obszar w którym rysowane były wykresy..
No i tu sięgnąłem po NetBeansa, który pozwala utworzyć GUI przy pomocy metody "przenieść/upuść" - nie trzeba sie bawić z żadnymi dziwnymi layoutami, czy rącznym ostawianiem elementów.. Całą tą nudną pracę przy układaniu elementów odwalał NetBeans..
Ale on wtedy już nie pozwala na edycję pewnych części kodu, tych odpowiedzialnych za tworzenie GUI, więc nie mogłem zastosować swojej metody z rozszerzeniem klasy jPanel o dodatkowe funkcje i tworzenie takiego obiektu, zamiast zwykłego jPanela.

I tu zrodził się mój problem.. Czy da się jakoś wskazać funkcji rysującej gdzie dokładnie ma rysować? Wskazać jej sam target "z zewnątrz" a nie wewnątrz klasy jPanel.

Póki co rozwiązałem problem trochę na około, czyli użyłem NetBeansa do stworzenia GUI, a potem już w jCreatorze sam pogrzebałem trochę w kodzie, zmieniając część wygenerowanego przez NB kodu, dodając właśnie tą rozszerzoną klasę zamiast standardowej jPanel.
Nie wiem, może gdzieś w NB jest opcja "rysowania" własnych klas w GUI makerze.. Ale póki co tego nie odkryłem (używam go od wczoraj xD)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 21.06.2008 o 09:54, DemoBytom napisał:

I tu zrodził się mój problem.. Czy da się jakoś wskazać funkcji rysującej gdzie dokładnie
ma rysować? Wskazać jej sam target "z zewnątrz" a nie wewnątrz klasy jPanel.

A co za różnica, skoro możesz przekazać wszystko przez metodę? Albo możesz wytworzyć komunikat z polem dodatkowym, albo w ogóle wytworzyć nowy komunikat obsługiwany przez nowy typ komponentu.

Dnia 21.06.2008 o 09:54, DemoBytom napisał:

a potem już w jCreatorze sam pogrzebałem trochę w kodzie, zmieniając część wygenerowanego przez NB kodu

Wyważasz otwarte drzwi moim zdaniem.

Dnia 21.06.2008 o 09:54, DemoBytom napisał:

dodając właśnie tą rozszerzoną klasę zamiast standardowej jPanel.

Wbudowane narzędzie nie tworzy klasy pierwotnej takiej jak JPanel, ale klasę dziedziczącą po tej pierwszej. Po prostu przeciągnij na pustą paletę sam panel. Masz też mnóstwo możliwości zmodyfikowania takiej klasy ponieważ initComponents jest wywoływane z kodu, który możesz na wszelkie sposoby modyfikować. Na końcu dołączam przykład wygenerowanego panelu, który ma indywidualne cechy i jest przygotowany do ręcznego przemalowywania zależnie od pomysłu. Nie musisz grzebać w initComponents ponieważ jeżeli już jakieś komponenty dodałeś (w tym własne - niestandardowe), to po co masz tam coś zmieniać? Masz od tego PaintComponent, który dla panelu zalewa tylko prostokąt odpowiednim kolorem.

Zauważ, że w poniższym kodzie wszelkie zmienne mogę sobie dowolnie nazywać korzystając z formularza

import java.awt.Graphics;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
import javax.swing.Timer;
/**
* Panel ładujący dla okienka oraz apletu. Zawiera pasek postępu zarządzany
* przez setValue i getValue oraz może dynamicznie pokazywać rozmiar panelu
* @author Olamagato
*/
public class StartPanel extends JPanel
{
private boolean pokazujRozmiar = false;
private Timer odczekaj = null;
protected StartPanel()
{
initComponents();
pokażRozmiar();
}
public StartPanel(int min, int maks, boolean pokazujRozmiar)
{
this();
this.pokazujRozmiar = pokazujRozmiar;
postęp.setMinimum(min);
postęp.setMaximum(maks);
}
public StartPanel(int min, int maks)
{ this(min, maks, false); }
public void setValue(int n) { postęp.setValue(n); }
public int getValue() { return postęp.getValue(); }
public void setTimer(int oczekiwanie, ActionListener wywołaj)
{ (odczekaj = new Timer(oczekiwanie, wywołaj)).setRepeats(false); }
protected void pokażRozmiar()
{
if(pokazujRozmiar)
wymiary.setText("Wymiary panelu: [" + getSize().width + ","
+ getSize().height + "]");
}
@Override protected void paintComponent(Graphics g)
{
//Tu dodaj swoje rysowanie (przed elementami narysowanymi przez super.paintComponent)
super.paintComponent(g);
//albo tu (po)
}

/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

etykieta = new javax.swing.JLabel();
postęp = new javax.swing.JProgressBar();
wymiary = new javax.swing.JLabel();

setBorder(javax.swing.BorderFactory.createEtchedBorder());
setMinimumSize(new java.awt.Dimension(0, 75));

etykieta.setFont(etykieta.getFont().deriveFont(etykieta.getFont().getSize()+1f));
etykieta.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("aplet/Bundle"); // NOI18N
etykieta.setText(bundle.getString("startPanel.nazwaPostępu.text")); // NOI18N
etykieta.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
etykieta.setRequestFocusEnabled(false);
etykieta.setVerifyInputWhenFocusTarget(false);
etykieta.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);

wymiary.setFont(wymiary.getFont().deriveFont(wymiary.getFont().getSize()+1f));
wymiary.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
wymiary.setText(bundle.getString("StartPanel.wymiary.text")); // NOI18N
wymiary.setVerticalAlignment(javax.swing.SwingConstants.TOP);
wymiary.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
zmianaRozmiaru(evt);
}
});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap(20, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(wymiary, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 291, Short.MAX_VALUE)
.addComponent(etykieta, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 291, Short.MAX_VALUE)
.addComponent(postęp, javax.swing.GroupLayout.DEFAULT_SIZE, 291, Short.MAX_VALUE))
.addContainerGap(20, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(etykieta, javax.swing.GroupLayout.DEFAULT_SIZE, 16, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(postęp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(wymiary, javax.swing.GroupLayout.DEFAULT_SIZE, 17, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>

private void zmianaRozmiaru(java.awt.event.ComponentEvent evt) {
pokażRozmiar();
}

// Variables declaration - do not modify
private javax.swing.JLabel etykieta;
private javax.swing.JProgressBar postęp;
private javax.swing.JLabel wymiary;
// End of variables declaration
}

Dnia 21.06.2008 o 09:54, DemoBytom napisał:

Nie wiem, może gdzieś w NB jest opcja "rysowania" własnych klas w GUI makerze.

To nie tak. GUI maker służy do budowania komponentów JavaBeans, które przypadkiem nadają się do używania przez narzędzie "Visualne" w Netbeans. Jednak maker jest potrzebny gdy budujesz komponenty, które chcesz potem przeciągać myszą na formularz. Jeżeli wystarczy Ci budowanie aplikacji z istniejących predefiniowanych elementów (bez tworzenia wygody dla kogoś lub Ciebie), to maker nie jest Ci do niczego potrzebny.

20080621143603

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.06.2008 o 16:15, Logan10 napisał:

Mam pytanie: co oznacza wyposażenie typu w znak ? chodzi mi o to jaki to znak ,jest on jakoś widoczny?

Chodzi Ci o Javę?
Jeżeli pytasz o taką konstrukcję jak ta: List <?> zmienna;
to jest to uogólnienie dla typów szablonowych. Informuje kompilator, że lista może przechowywać konkretny, ale nie znany w tym momencie typ obiektów. W sumie niewiele się to różni od napisania: List zmienna; ponieważ każda klasa szablonowa jest zacierana do typu Object. A to jest klasa, na którą może być rzutowana każda możliwa klasa w Javie.
Różnice polegają na niuansach języka w dość rzadkich przypadkach.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.06.2008 o 20:37, Logan10 napisał:

Ajjj przepraszam ,zapomniałem dodać że to co c++ sorki wielkie :/


Jeśli chodzi ci o to że masz np unsigned int i int to różni się to tym, że typy ze znakiem są zapisywane w kodzie U2 a bez znaku NKB, czyli w U2 masz że pierwszy znak to -2^(n-1) i do tego dodajesz całą resztę a NKB to każdy znak ma odpowiednią wartość czyli zakres U2 to -2^(n-1) do 2^(n-1)-1 a w NKB masz zakres od 0 do 2^n-1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.06.2008 o 00:03, Nufiko napisał:

czyli w U2 masz że pierwszy znak to -2^(n-1) i do tego dodajesz całą resztę

- Wystarczy zauwazyc, ze w U2 reprezentacja 1111 oznacza dokladnie ta sama liczbe co reprezentacja 111 , a wyliczajac wartosci z Twojego wzoru wyjda one inne :)
Powinno byc raczej -xi * 2^(n-1) + reszta i jest ok :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 25.06.2008 o 01:59, LifaR napisał:

> czyli w U2 masz że pierwszy znak to -2^(n-1) i do tego dodajesz całą resztę
- Wystarczy zauwazyc, ze w U2 reprezentacja 1111 oznacza dokladnie ta sama liczbe co
reprezentacja 111 , a wyliczajac wartosci z Twojego wzoru wyjda one inne :)
Powinno byc raczej -xi * 2^(n-1) + reszta i jest ok :)


Ja jednak twierdzę, że jest dobrze. Za twoim przykładem na 4 bitach: 1111 to -2^3+2^2+2+1=-8+7=-1 na 3 bitach 111 to -2^2+2+1=-4+3=-1 czyli ok

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować