JTextPane w akcji

Jak wspomniałem w jednym z poprzednich wpisów, pamiętam jeszcze czasy Visual Basica bodajże w wersji 4.0 i do dziś mam przed oczami widok pięknie układających się na ekranie elementów. Oczywiście było to śliczne w porównaniu do toporych interfejsów graficznych implementowanych w Turbo Pascalu. W NetBeans na początku wyglądało to dość podobnie. Byłem również święcie przekonany, że tak prozaiczna rzecz jak dodanie do komponenetu tekstowego odpowiednio sformatowanego tekstu nie jest problemem. Jak zazwyczaj ostatnio – myliłem się.

Omyłka jednakże wręcz mnie zdziwiła. Gdybym bowiem w polu tekstowym Swinga chciał odpalić animację flasha z bajerami porażka byłaby dość zrozumiała. W przypadku jednakże JTextPane, troszeczkę zwątpiłem. Dla porządku wykładu:

– podstawowym komponentem tekstowym w Swingu jest JTextField, który to umożliwia edycję i wyświetlanie jednego wiesza tekstu.

– drugim komponentem jest JTextArea. Box ten umożliwia wyświetlanie w oknie wielu linii tekstu, do tego można je edytować. Jedynym ograniczeniem jest fakt, iż JTextArea wyświetla czysty tekst – bez jakichkolwiek wodotrysków.

– nie napisałem o JLabel, ale to zgodnie z nazwą pewna wizytówka innego komponenetu (przynajmniej ja ją tak traktuję), zatem za pełnowymiarowy komponent tekstowy jej nie uważam.

– i na koniec mamy JTextPane, a także klasę wobec niej nadrzędną – JEditorPane. Ja jednakże skupię się na tej pierwszej, gdyż do niej mamy dostęp w palecie NetBeans i to z tym komponentem starałem się coś zrobić.

JTextPane ma w zamyśle umożliwiać wyświetlenie komponenetu tekstowego w aplikacji, wraz ze specjalnie formatowanym tekstem. Moje wymagania na początek nie były jakoś rozbudowane. Mianowicie chodziło mi o pole informacyjne ( metoda JOptionPane.showMessageDialog ), które zawierałoby komponent z ładnie sformatowanymi danymi. Konkretnie chodziło mi o:

– wycentrowanie tekstu

– odpowiedni kolor backgroundu

– margines pomiędzy granicą komponentu, a tekstem (coś a la CSSowy padding).

Nie są to specjalnie wygórowane żądania trzeba przyznać. Jednakże Swing skutecznie się postarał by to wszystko zamotać. Być może moje oczekiwania w stosunku do IDE są zbyt duże i zasadniczo jest dobrze tak jak jest. Nie bardzo mnie to jednakże przekonuje, dlaczego tak prozaiczną rzecz jak ustalenie kilku stylów muszę realizować kodowo odwołując się do 4 różnych obiektów? Oto kod:

JTextPane textPane = new JTextPane();
StyledDocument doc = textPane.getStyledDocument();
MutableAttributeSet standard = new SimpleAttributeSet();

StyleConstants.setAlignment(standard, StyleConstants.ALIGN_CENTER);
StyleConstants.setLeftIndent(standard, 40);
StyleConstants.setRightIndent(standard, 40);

Color szary = new Color(224, 226, 235);
doc.setParagraphAttributes(0, 0, standard, true);
textPane.setBackground(szary);
textPane.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));

Tyle potrzeba pisaniny (ok, da się to pewnie skrócić o linijkę czy dwie wrzucając wywołania nowych obiektów w parametry metod). A nie możnaby zrobić tego w formie D&D prosto w IDE? Niestety nie dało się i dlatego trzeba się bawić z kodem. Nota bene dość ciekawym i mam nadzieję, że jego forma da wszystkim impuls do daleszego poszukiwania wiedzy na temat przyozdabiania komponentów.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s