Swing: Document dan View Untuk JEditorPane


Perancangan komponen Swing menerapkan pemisahan antara Model dan View. Sebagai contoh, lihat saja JEditorPane (dan turunannya, JTextPane). JEditorPane adalah komponen yang mirip seperti JTextArea, hanya saja ia bisa menampilkan tulisan yang diformat (tebal, miring, font size berbeda, dsb). Pada komponen ini, Model-nya adalah sebuah Document, yang dapat berupa PlainDocument, DefaultStyledDocument dan HTMLDocument.

Sebagai contoh, aku menyiapkan JTextPane dengan kode berikut:

HTMLEditorKit editor = new HTMLEditorKit();
HTMLDocument document = (HTMLDocument) editor.createDefaultDocument();
textPane = new JTextPane();
textPane.setEditorKit(editor);
textPane.setDocument(document);

HTMLDocument adalah dokumen yang mewakili data HTML pada JTextPane. HTMLEditorKit memiliki fungsi-fungsi yang mempermudah pengolahan HTML, misalnya fungsi untuk menerjemahkan HTMLDocument ke dalam kode-kode HTML dan menyimpannya ke file HTML. Jika perancangan komponen Swing menerapkan pola MVC, mungkin HTMLEditorKit masuk ke dalam controller.

Untuk melakukan modifikasi pada isi JTextPane di kode di atas, aku hanya perlu berinteraksi dengan document. Misalnya, jika aku ingin membuat tulisan yang di-select saat ini menjadi tebal (bold), aku dapat menggunakan kode seperti berikut:

int start = textPane.getSelectionStart();
int end = textPane.getSelectionEnd();

if (start>0) {
	MutableAttributeSet attr = new SimpleAttributeSet();
	StyleConstants.setBold(attr, true);
	document.setCharacterAttributes(start, end-start, attr, false);
}

Jika pada JTextPane terdapat tulisan: “Namaku Solid Snake“, maka hasil output html-nya dari perintah editor.write(new FileOutputStream("c:\\test.html"), document, 0, document.getLength()) adalah:

<html>
  <head>

  </head>
  <body>
    <p style="margin-top: 0">
      Namaku <b>Solid Snake</b>
    </p>
  </body>
</html>

Untuk menghasilkan tag HTML sesuai selera, aku dapat meng-extends HTMLEditorKit dan men-override method write. Demikian juga jika aku ingin mengendalikan bagaimana sebuah tag di-render di JTextPane, aku dapat men-override method getViewFactory() milik HTMLEditorKit dan membuat ViewFactory sendiri. Sebagai contoh, jika aku ingin setiap tag PRE ditampilkan di JTextPane dengan background abu-abu (tanpa menambahkan CSS ke tag), aku dapat membuat ViewFactory seperti berikut:

public class LatihanViewFactory extends HTMLEditorKit.HTMLFactory {

	@Override
	public View create(Element elem) {
		Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);
		if (o==HTML.Tag.PRE) {
			return new PreBlockView(elem);
		}
		return super.create(elem);
	}

	class PreBlockView extends BlockView {

		public PreBlockView(Element elem) {
			super(elem, View.Y_AXIS);
		}

		@Override
		public void paint(Graphics g, Shape allocation) {
			Rectangle batas = (Rectangle) allocation;
			g.setColor(new Color(210,210,210));
			g.fillRect((int)batas.getX(), (int)batas.getY(),
			           (int)batas.getWidth(), (int)batas.getHeight());
			super.paint(g, allocation);
		}

	}
}

Agar LatihanViewFactory bisa dipakai, aku juga membuat versi sendiri dari HTMLEditorKit, seperti pada contoh berikut:

public class LatihanEditorKit extends HTMLEditorKit {

	private final static LatihanViewFactory
	    latihanViewFactory = new LatihanViewFactory();

	@Override
	public ViewFactory getViewFactory() {
		return latihanViewFactory;
	}

}

Sebagai langkah terakhir, aku tinggal merubah kode program agar JTextPane tidak lagi memakai HTMLEditorKit melainkan LatihanEditorKit:

private LatihanEditorKit latihanEditorKit =
  new LatihanEditorKit();
private JTextPane textPane =
  new JTextPane();
textPane.setEditorKit(latihanEditorKit);

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: