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";)