Swing #6: Dynamiczne generowanie podglądu

Spis treści

Zadanie

Do przykładu z lekcji dodaj funkcjonalność polegającą na tym, że podgląd będzie generowany na bieżąco wraz z wprowadzanym przez użytkownika tekstem.

Rozwiązanie

Zmiana była naprawdę niewielka - wystarczyło jedynie dodać słuchacza zdarzeń klawiatury, czyli KeyListener do obiektu JTextArea, w którym wprowadzamy kod HTML. W efekcie wprowadzania, lub usuwania kolejnych znaków wystarczy aktualizować stan obiektu JEditorPane, który wyświetla przetworzony kod HTML. Ponieważ zmieniła się jedynie klasa panelu, to poniżej zamieszczam jedynie jego kod. Reszta pozostaje tak jak w przykładzie z lekcji. Ponieważ do obsługi wszystkiego wystarczy nam metoda keyPressed z interfejsu KeyListener to wystarczy rozszerzyć klasę KeyAdapter - nie musimy wtedy pozostawiać w kodzie pustych metod keyTyped i keyReleased.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class HTMLPanel extends JPanel {
	//pole do wpisywania kodu html
	private final JTextArea textArea = new JTextArea();
	//pole z wygenerowanym kodem
	private final JEditorPane editorPane = new JEditorPane();
	
	public HTMLPanel() {
		super();
		setLayout(new BorderLayout());
		createPanels();
	}
	
	private void createPanels() {
		//nie chcemy, aby można było edytować wygenerowany html
		editorPane.setEditable(false);
		//ustawiamy nasz editorPane, aby rozpoznawa znaczniki html
		editorPane.setContentType("text/html");
		//przycisk generowania podglądu
		JButton actionButton = new JButton("Podgląd");
		actionButton.addActionListener(new ConvertListener());
		//panel pomocniczy do rozkładu elementów
		JPanel helpPanel = new JPanel();
		helpPanel.setLayout(new GridLayout(1, 2));
		textArea.setBackground(Color.lightGray);
		textArea.addKeyListener(new MyKeyListener());
		//dodajemy komponenty tekstowe do pomocniczego panelu
		helpPanel.add(textArea);
		helpPanel.add(editorPane);
		//dodajemy wszystko do głównego panelu
		this.add(helpPanel, BorderLayout.CENTER);
		this.add(actionButton, BorderLayout.SOUTH);
	}
	
	class ConvertListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent event) {
			//zmiany wyglądu wywołujemy w wątku dystrybucji zdarzeń
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					String text = textArea.getText();
					editorPane.setText(text);
				}
			});
		}
	}
	
	class MyKeyListener extends KeyAdapter {

		@Override
		public void keyPressed(KeyEvent arg0) {
			//zmiany wyglądu wywołujemy w wątku dystrybucji zdarzeń
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					String text = textArea.getText();
					editorPane.setText(text);
				}
			});
		}
	}
}

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

xcam

a jak to uruchomić?

luckiblue

Może powinieneś dodać klasę uruchamiającą? W tym kursie jest ona nazywana jako "Test";)