Nie tylko wygląda świetnie, ale również pozwala na łatwe skopiowanie całego komunikatu, w celu dalszego zgłoszenia problemu ;)
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...
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 ;)
Poniższe demo prezentuje działanie programu:
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ą :)
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!
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:
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 ;)
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
Super czytelna nazwa klasy, prawda? :)
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 ;)
Krótka ściągawka pokazuje, co dokładnie jest zwracane przez daną metodę. A tutaj jest skrypt, który automagicznie utworzył poniższe tabelki ;)
Oto mój pierwszy (działający) program w JavaFX - prosta animacja Flapjacka - przydatne do testowania temperatury CPU ;)
Screenshot
Oto wynik moich eksperymentów z Synthem:
Na zrzucie JMenuBar, JMenu, itp. oraz JList. Wygląd oczywiście został skopiowany z Midnight Commandera :)
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 ;)
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 :)
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ć:
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...
Przeportowałem layout Garland do Swinga :)
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
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"));
ProgressIcon to prosta implementacja javax.swing.Icon, która oprócz zwykłego obrazka ikony, wyświetla również "pasek postępu".
Ikona ProgressIcon umieszczona na przycisku JButton:
Kod powstał w ramach eksperymentów, więc API może być trochę niekompletne ;)
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:
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...
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
Na początku obrazek, żeby było wiadomo o co chodzi:
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
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);
}
}
Jak zrobić poniższy formularz?
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 ;)
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 :)
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
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)
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












