swing pod ubuntu - wygląd jak na win

0

Piszę prostą aplikację w NetBeans, w której są swingowe komponenty. Korzystam z Ubuntu. Aplikacja ma śmigać na WinXP lub Win7. Po uruchomieniu programu okienka nie wyglądają tak, jak w czasie ich tworzenia (swing 'dopasowuje się' do wyglądu systemu i wygląda to koszmarnie..).
Jest możliwość ustawienia w NetBeansie lub bezpośrednio w kodzie 'szaty graficznej' wyświetlanej aplikacji? Chciałabym żeby po uruchomieniu na ubuntu swingowe elementy wyglądały tak jak będą później wyglądać po uruchomieniu na win.

0

Zmień look'n'feel na jakiś sztywny, bo domyślnie look'n'feel jest chyba systemowy (w w miarę świeżych wersjach Javy przynajmniej). Ewentualnie znajdź look'n'feel imitujący ten Windowsowy i go zastosuj.

Tu jest jakiś stary artykuł o L&F: Look and Feel w Javie

edit: a jednak nie stary :P

0

Dzięki wielkie! Niestety jakimś cudem Metal jest identyczny z tym systemowym, zero różnicy. Póki co Nimbus działa znośnie, nawet przejrzyście, ale mimo wszystko komponenty minimalnie się rozjeżdżają...

0

Inne l&f dają radę, tylko ten Metal coś nie chce załapać

0

Windowsowy L&F jest zastrzeżony wyłącznie do uruchamiania na Windows (kwestie licencyjne). Podobnie jest z niektórymi innymi skórkami, które można odpalić tylko tam gdzie właściciel skórki nie życzy sobie ich eksportu (wyglądu) poza swój system - ten sam problem dotyczy więc również ogryzka. Dlatego nie ma sensu próbować na sztywno wymuszać konkretnych skórek (poza tymi otwartymi - wyraźnie opisanymi w javadocu), a raczej wyliczyć te dostępne w danej chwili i tylko z nich dawać wybór sobie lub użytkownikowi.

Dlatego jeżeli będziesz ustawiał na wygląd zawsze zgodny z bieżącym systemem, to na systemach od MS wygląd powinien być ok. Trzeba tylko na koniec przetestować aplikację lub aplet w Windzie (dla upewnienia się) i gotowe. Jedyna różnica w funkcjonalności różnych skórek powinna być głównie w obsłudze focusa i rolki. Jeżeli nie będzie się z tych różnic korzystać, to wszystko powinno być ok.
Z powodów ambicjonalnych Suna wygląd systemowy ma niższy priorytet niż default L&F, którym na 99% przypadków nie jest wygląd systemowy (Sun promował wcześniej swoją własną skórkę wyglądającą tak samo na każdym systemie), dlatego skórkę systemową trzeba wymuszać.

Prosty kod taki jak ten powinien być powszechnie znany, ale na wszelki wypadek zapodam:

	/**
	 * Próbuje ustawić wygląd systemowy.
	 * @return true jeżeli nie wystąpił żaden z wyjątków
	 */
	public static boolean setSystemLF()
	{
		try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }
		catch(UnsupportedLookAndFeelException | ClassNotFoundException
			| InstantiationException | IllegalAccessException e)
		{ return false; }
		return true;
	}

	/**
	 * Ustawia i aktualizuje systemowy wygląd komponentu ekranowego.
	 * W trakcie aktualizacji GUI zmienia kursor na klepsydrę, a po
	 * wykonaniu aktualizacji przywraca poprzedni stan kursora.
	 * @param c komponent do aktualizacji
	 */
	public static void updateSystemLF(final Component c)
	{
		if(setSystemLF())
			updateLF(c);
	}

	/**
	 * Aktualizuje wygląd całości komponentu ekranowego.
	 * W trakcie aktualizacji zmienia kursor na klepsydrę, a po
	 * wykonaniu aktualizacji przywraca poprzedni stan kursora.
	 * @param c komponent do aktualizacji
	 */
	public static void updateLF(final Component c)
	{
		Cursor obecny = c.getCursor();
		c.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
		SwingUtilities.updateComponentTreeUI(c);
		c.validate();
		c.setCursor(obecny);
	}

Pierwszą metodę należałoby odpalać przed pierwszym wywołaniem Swinga.
Druga jest przydatna w apletach (należy odpalać w metodzie init przed jakimkolwiek initComponents).
Trzecia jest przydatna wszędzie tam gdzie daje się użytkownikowi możliwość dynamicznej zmiany skórki (np. na żądanie) w czasie działania programu lub apletu.
Kod jest banalny, ale tak zrobiony oszczędza mi pisania i pamiętania co do czego i w jakiej kolejności.

1 użytkowników online, w tym zalogowanych: 0, gości: 1