Zaloguj się
Projekty Kategorie Archiwum

Nie tylko wygląda świetnie, ale również pozwala na łatwe skopiowanie całego komunikatu, w celu dalszego zgłoszenia problemu ;)

Download

BSOD4J

8 grudnia

Fragment patcha OpenJDK:

private String toNetscapeHeaderString() {
- StringBuilder sb = new StringBuilder();
-
- sb.append(getName() + "=" + getValue());
-
- return sb.toString();
+ return getName() + "=" + getValue();
}

Użycie StringBuildera wskazuje na średnio nowy kod. Może wcześniej jeszcze coś tam było, co uzasadniałoby użycie powyższej optymalizacji, tylko nowy programista wolał raczej już niczego nie dotykać ;) Na dodatek, jeśli już, to powinno być sb.append(getName()).append('=').append(getValue()), o czym większość osób zapomina...

25 września

W poprzednim odcinku.

Tym razem wykorzystałem JLayer również do rysowania nad innym komponentem. W efekcie powstała mała klasa, która służy do zaznaczania elementów w dowolnym JTree. Kod jest dość uniwersalny, więc można łatwo dostosować do własnych potrzeb ;)

SelectionLayerUI

Poniższe demo prezentuje działanie programu:

Demo (Web Start)

Program i źródła (2 w 1)

11 września

Różne wyświetlarki plików PDF mają tzw. "tryb przeglądania", gdzie po kliknięciu myszą w środku tekstu, całą stronę można przesuwać w górę i w dół podobnie jak papier toaletowy.

Ostatnio postanowiłem (czasem jak tak siąde i myślę...) zrobić coś identycznego przy użyciu nowego komponentu javax.swing.JLayer. Cały kod ma mniej niż 60 linii, a użycie sprowadza się do new JScrollPane(new JLayer<>(editorPane, new BrowseLayerUI<>())).

Poniższe demo prezentuje działanie (lub fail) programu - trzeba kliknąć w tekst i poruszać myszą :)

Demo (Web Start)

Program i źródła (2 w 1)

9 września

Niech naszym przykładowych kodem będzie ta oto copypasta (wł. potwór spaghetti). Poniższy program wyświetla nazwy hostów z podanego pliku (funkcjonalność nie jest w tym przypadku istotna). Kod działa jak należy, ale jest trochę przydługi, a co za tym idzie - również mało czytelny* i niezrozumiały dla studentów ;). Zmieńmy to!

Czytaj dalej...

4 sierpnia

Zainstalowałem NetBeans IDE 7.0.1. Wpisuję "netb" w menu KDE, a tam siedem różnych skrótów, ale żaden do wersji 7.0.1:

KDE Menu

Chyba jedynym działającym sposobem na odświeżenie zawartości menu jest restart całej plazmy, albo po prostu ponowne zalogowanie się do KDE... Może Linus Torvalds miał rację z przesiadką na Xfce ;)

Kategoria Fail | Java | KDE | Linux | Ogólne

Krótkie podsumowanie nowych opcji JDK (1.)7.0-b147 (RC) w porównaniu do wersji (1.)6.0:

java -help

-    -jre-restrict-search | -jre-no-restrict-search // ?
+    -jre-restrict-search | -no-jre-restrict-search
                   include/exclude user private JREs in the version search

javac -help

-Werror                    Terminate compilation if warnings occur
@<filename>                Read options and filenames from file

java -X

-Xdiag            show additional diagnostic messages
-XshowSettings    show all settings and continue
-XshowSettings:all
                  show all settings and continue
-XshowSettings:vm show all vm related settings and continue
-XshowSettings:properties
                  show all property settings and continue
-XshowSettings:locale
                  show all locale related settings and continue

javac -X

Osobiście polecam -Xlint:all :)

   -Xlint:{
   all,
   cast,
+  classfile,
   deprecation,
+  dep-ann,
   divzero,
   empty,
   fallthrough,
   finally,
+  options,
   overrides,
   path,
+  processing,
+  rawtypes,
   serial,
+  static,
+  try,
   unchecked,
+  varargs,
+  -Xpkginfo:{always,legacy,nonempty} Specify handling of package-info files
16 maja

Super czytelna nazwa klasy, prawda? :)

Ill formed

Co ciekawe, w przypadku wodza-który-leczy można naprzemiennie używać dwóch wersji zapisu - Kim Dzong Il lub Kim Dzong II, bo i tak nie widać różnicy ;)

28 lipca

Krótka ściągawka pokazuje, co dokładnie jest zwracane przez daną metodę. A tutaj jest skrypt, który automagicznie utworzył poniższe tabelki ;)

Czytaj dalej...

29 kwietnia

Oto mój pierwszy (działający) program w JavaFX - prosta animacja Flapjacka - przydatne do testowania temperatury CPU ;)

Screenshot

Czytaj dalej...

16 grudnia

Oto wynik moich eksperymentów z Synthem:

Free Image Hosting at www.ImageShack.us

Na zrzucie JMenuBar, JMenu, itp. oraz JList. Wygląd oczywiście został skopiowany z Midnight Commandera :)

20 września

Jeszcze tylko 4 głosy i moja własnoręcznie zgłoszona usterka (być może) znajdzie się na liście Top 25 Bugs. Potem wystarczy zaczekać kolejne kilka lat, aż bug zostanie naprawiony lub nie ;)

Kategoria Java | Ogólne
7 września

Ostatnio zrobiłem (IMHO) nieco lepszą wersję CSS-a dla HTML-a generowanego przez javadoc (ten z JDK 6). Poprawiłem fonty, wygląd tagów "table", "code", "hr", itp. Dodałem też "wersję do druku". Wystarczy zastąpić oryginalny plik "stylesheet.css". Nie jest to cud techniki, ale może komuś się przyda :)

Download

11 sierpnia

Obecnie różne operacje na refleksji wyrzucają mnóstwo różnych wyjątków, które trzeba przechwycić, lub podać dalej. Wyłapywanie wszystkich IllegalAccessException, NoSuchMethodException, itp. nie jest zbyt wygodne i tylko zmniejsza czytelność kodu.

W rozwojowej wersji JDK 7, dodano ostatnio małe usprawnienie w postaci nowej klasy ReflectiveOperationException (diff oraz więcej info).

Teraz będzie można napisać:

Czytaj dalej...

20 lipca

Ostatnio dużo osób trafia na ten blog szukając powyższej informacji. Ustawienie okna na środku ekranu jest banalnie proste (niestety samo API jest mało intuicyjne).

JFrame okno(...)

// 1. Najpierw ustawiamy rozmiar okna.
okno.setSize(...)

// 2. Potem położenie.
// null oznacza że chcemy umieścić okno na środku ekranu.
okno.setLocationRelativeTo(null);

(...)

okno.setVisible(true);

I nie trzeba się już męczyć z Toolkit.getDefaultToolkit().getScreenSize() ;)

Uwaga: usypiający wpis

Coś mnie naszło, żeby porównać pliki rt.jar w najstarszym i najnowszym wydaniu Javy. Wyniki są trochę zaskakujące - dodali publiczne API! Oznacza to, że jeśli na przykład użyjemy klasy javax.xml.bind.JAXB, to nasz program nie uruchomi się pod starszą wersją JRE...

16 maja

Przeportowałem layout Garland do Swinga :)

Free Image Hosting at www.ImageShack.us

Więcej informacji później... W tym czasie można przetestować wersję alpha:
http://kdt.users.sourceforge.net/java/garlandpanel/launch.html (wymagana Java 6)

PS. Kliknij przycisk "Color...", żeby zmienić wygląd.

"Throwable Events" to stosunkowo nowa technika obsługi zdarzeń w języku Java, która może służyć jako zamiennik starego i niewygodnego systemu "listenerów". Główną zaletą jest większa przejrzystość kodu (nie trzeba dodawać setek addFooListener), oraz łatwość implementacji w programach korzystających z wielu wątków.

Przykładowa implementacja

Klasa Button:

public class Button extends JButton {
	public Button(String text) {
		super(text);
		addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				throw new ClickEvent(e.getSource());
			}
		} );
	}
}

Klasa ClickEvent:

public class ClickEvent extends RuntimeException {
	private Object source;
	public ClickEvent(Object source) {
		this.source = source;
	}
	public Object getSource() { return source; }
}

Przykład użycia

Czytaj dalej...

11 marca

JDK7 (build 50) doczekało się nowego API dla plików. Inżynierowie Sun Microsystems ciężko pracowali przez <b>dziesięć</b> lat, ale w końcu udało się!

Teraz można skopiować plik za pomocą <b>jednej</b> linijki kodu...

import java.nio.file.*;
...
Paths.get("foo").copyTo(Paths.get("bar"));
10 marca

ProgressIcon to prosta implementacja javax.swing.Icon, która oprócz zwykłego obrazka ikony, wyświetla również "pasek postępu".

Pobierz

Ikona ProgressIcon umieszczona na przycisku JButton:

Image Hosted by ImageShack.us

Kod powstał w ramach eksperymentów, więc API może być trochę niekompletne ;)

13 listopada

Przed:

...
showClose.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
		JCheckBox source = (JCheckBox)e.getSource();
		closeButton.setVisible(source.isSelected());
	}
} );
...

Po:

...
showClose.onSelect(closeButton, "visible");
...

Jak widać, druga wersja jest znacznie krótsza :) Cała tajemnica tkwi w klasie EventHandler, która tworzy za nas odpowiednie zdarzenia oraz ustawia odpowiednie właściwości obiektu. Prosta implementacja klasy MyCheckBox oraz MyButton wygląda tak:

Czytaj dalej...

9 października

Z cyklu wstawmy-komponent-i-zobaczmy-co-wyjdzie*: Kolejna wtyczka do Makagigi, która właśnie powstaje... Jest to prosty klient VNC, za pomocą którego można sterować innym komputerem poprzez sieć.

Screenshot

Windows Vista w kartach...

Free Image Hosting at www.ImageShack.us

Czytaj dalej...

8 października

Wtyczka umożliwia wysłanie dowolnego tekstu prosto do serwisu wklej.org. Następnie za pomocą unikalnego klikalnego linku, który dostaniemy z powrotem, możemy podzielić się naszym tekstem z innymi użytkownikami. Zobaczymy co z tego wyjdzie ;) Jak na razie pierwsza wersja beta 0.9 działa nadzwyczaj dobrze, a przynajmniej sprawia takie wrażenie..

Wymagana Makagiga 2.9.3 lub nowsza. Aby zainstalować, wejdź w menu Narzędzia -> Wtyczki -> Pobierz więcej wtyczek...

Screenshot

Free Image Hosting at www.ImageShack.us

Na początku obrazek, żeby było wiadomo o co chodzi:

Free Image Hosting at www.ImageShack.us

Jak widać u góry mamy coś w rodzaju "kart" (JList) z ikonami oraz podpisem. Poniżej znajduje się wybrany panel (Page) z przykładowymi opcjami.

Pozioma lista

Jak powszechnie wiadomo, typowa lista składa się elementów ułożonych pionowo jeden pod drugim. Aby zmienić layout na poziomy, wystarczy ustawić właściwości layoutOrientation oraz visibleRowCount jak poniżej:

pageList = new JList(...
...
pageList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
pageList.setVisibleRowCount(1);

Renderer

Czytaj dalej...

Po JWebPane i JEditorPane przyszła kolej na Mozillę oraz IE ;)

Przykładowy kod

import javax.swing.*;

import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;

public class Test extends JFrame {

public static void main(String... args) {
	SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			NativeInterface.open();
			new Test();
		}
	} );
}

private Test() {
	super("Test");
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setSize(800, 600);
	setLocationRelativeTo(null);

	JWebBrowser browser = new JWebBrowser();
	browser.navigate("http://jogger.pl");
	add(browser);

	setVisible(true);
}

}

Czytaj dalej...

Jak zrobić poniższy formularz?

Free Image Hosting at www.ImageShack.us

Bardzo prosto..

<EXCEPRT>
import org.makagiga.form.*;
public class Test implements Runnable {
	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Test());
	}
	public void run() {
		LoginForm form = new LoginForm();
		Factory.Content content = Factory.newDialog(null, form);
		if (content.getDialog().exec())
			System.err.printf("user=%s, password=%s, remember=%s\n",
				form.user, form.password, form.remember);
	}
	
	@Form(label="Login")
	static class LoginForm {
		
		@Field(label="Username:", required=true)
		String user;
		
		@Field(label="Password:")
		char[] password;
		
		@Field(label="Remember password", style="color:green; font-size:smaller")
		boolean remember;

	}

}

Analizę działania programu, pozostawiam czytelnikowi jako zadanie domowe ;)

web1.0:

Image Hosted by ImageShack.us

web2.0:

Image Hosted by ImageShack.us

Funkcja DateFormatSymbols.getMonths() zwraca tablicę z nazwami miesięcy. Tablica ta, jak łatwo się domyślić, zawiera 13 miesięcy, gdzie dla większości lokalizacji/krajów ostatnia nazwa miesiąca jest pustym Stringiem...

Z kolei pole Calendar.MONTH, w przeciwieństwie do pola z dniem miesiąca, zaczyna się od zera (0=Styczeń, 1=Luty, etc.). Prawda, że proste.. Na szczeście w JDK 7 chyba już będzie nowe API do obsługi daty, które zastąpi (tu słowo kończące się na "ne") java.util.Date/Calendar :)

26 maja

JWebPane - "Swing compatible WebKit implementation"

To zupełnie nowy komponent bazujący na WebKit. David Qiao na swoim blogu napisał: "This is something Java/Swing community has been crying for years. (...) That’s a lightweighted Swing component for html viewing (or editing)." I wszystko jasne :)

Trochę więcej informacji można znaleźć w PDF-ie z tegoroczego JavaOne.

javax.swing.JLabel i inne

Czytaj dalej...

23 marca

Głupie pytanie! Napisałem to, żeby nauczyć się trochę Scene Graph. A ponieważ przypadkowo wpadło w ręce Phys2D, to połączyłem te dwa API.. Zasady są proste: układamy domek z klocków za pomocą myszy, a potem wszystko rozwalamy :P Dodatkowo można sterować grawitacją, bo kto powiedział, że musi spadać na dół? Przycisk "Reset" usuwa wszystkie klocki.

Uruchom (168KB)

Launch

Jest kilka drobnych błędów:

  • Przeciągnij-i-upuść czasami jest nieprzewidywalne
  • W zależności od komputera może działać za szybko lub za wolno, ale na razie nie chce mi się tego poprawiać ;)
  • Później umieszczę paczkę ze źródłami..

Update - v0.2 :)

  • Ładniejsze kolory
  • Dodana opcja pauzy
  • Sterowanie grawitacją za pomocą klawiszy strzałek
  • Opcjonalne efekty (raczej powolne i z błędami)
  • Teraz powinno też działać z Java 1.5
< Wcześniejsze wpisy

Kategorie

Ewolucja Internetu 8 | Fail 28 | Gry 45 | Humor 124 | Idiotyzm 48 | Java 107 | KDE 83 | KShutDown 22 | Linux 81 | Makagiga 58 Ogólne 792 | Polityka 74 | Programowanie 45 | Reklamy 2 | Techblog 17 | Teorie Spiskowe 11 | TV 55 | UI 2 | Użyteczność 27 | WWW 79 | Wyrwane z Kontekstu 24 | X Files 14

Archiwum

Luty 2012 | Styczeń 2012 | Grudzień 2011 | Listopad 2011 | Październik 2011 | Wrzesień 2011 | Sierpień 2011 | Lipiec 2011 | Czerwiec 2011 | Maj 2011 | Kwiecień 2011 | Styczeń 2011 | Listopad 2010 | Październik 2010 | Wrzesień 2010 | Sierpień 2010 | Lipiec 2010 | Czerwiec 2010 | Kwiecień 2010 | Marzec 2010 | Luty 2010 | Styczeń 2010 | Grudzień 2009 | Listopad 2009 | Październik 2009 | Wrzesień 2009 | Sierpień 2009 | Lipiec 2009 | Czerwiec 2009 | Maj 2009 | Kwiecień 2009 | Marzec 2009 | Styczeń 2009 | Grudzień 2008 | Listopad 2008 | Październik 2008 | Wrzesień 2008 | Sierpień 2008 | Lipiec 2008 | Czerwiec 2008 | Maj 2008 | Kwiecień 2008 | Marzec 2008 | Luty 2008 | Styczeń 2008 | Grudzień 2007 | Listopad 2007 | Październik 2007 | Wrzesień 2007 | Sierpień 2007 | Lipiec 2007 | Czerwiec 2007 | Maj 2007 | Kwiecień 2007 | Marzec 2007 | Luty 2007 | Styczeń 2007 | Grudzień 2006 | Listopad 2006 | Październik 2006 | Wrzesień 2006 | Sierpień 2006 | Lipiec 2006 | Czerwiec 2006 | Maj 2006 | Kwiecień 2006 | Marzec 2006 | Luty 2006 | Styczeń 2006 | Grudzień 2005 | Listopad 2005 | Październik 2005 | Wrzesień 2005 | Sierpień 2005 | Lipiec 2005 | Czerwiec 2005 | Maj 2005 | Kwiecień 2005 | Marzec 2005 | Luty 2005 | Styczeń 2005