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
Wygląd elementów można łatwo dostosować za pomocą renderera. Renderer to nic innego jak zwykły komponent implementujący interfejs ListCellRenderer. Dla każdego elementu listy wywoływana jest metoda getListCellRendererComponent. W tym właśnie miejscu możemy ustawić ikonę oraz tekst.
pageList.setCellRenderer(new ListRenderer());
...
private static class ListRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
// ERRATA: DefaultListCellRenderer dziedziczy z JLabel
// więc dodatkowa deklaracja "JLabel l" nie jest konieczna ;)
JLabel l = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
l.setHorizontalAlignment(JLabel.CENTER);
l.setHorizontalTextPosition(JLabel.CENTER);
l.setVerticalTextPosition(JLabel.BOTTOM);
Border padding = BorderFactory.createEmptyBorder(5, 10, 5, 10);
l.setBorder(padding);
Page page = (Page)value;
l.setIcon(page.icon);
l.setText(page.title);
return l;
}
}
Klasa Page
Page to prostu zwykły panel zawierający dodatkowo tytuł oraz ikonę. Prosta implementacja wygląda mniej więcej tak:
...
public class Page extends JPanel {
Icon icon;
String title;
public Page(String title, Icon icon) {
this.title = title;
this.icon = icon;
...
Download

Proszę o komentarz
fajny i prosty pomysł :)
Dzięki,
w cz.2 będzie coś takiego