I'm trying to append text to a JTextArea. I understand how to add text through an event listener, but I can't seem to fathom how to add the text if, per say, calling a method from a main-method. The text is appended to the JTextArea just fine but the JTextArea component isn't updated/repainted/revalidated/validated (or whatever you're supposed to say :-)).
GUITest
public class GUITest {
private GUI gui = null;
public GUITest() {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
gui = GUI.getInstance();
gui.createAndShowGUI();
gui.addTxt("Test1");
gui.addTxt("Test2");
gui.addTxt("Test3");
gui.addTxt("Test4");
}
});
}
public static void main(String[] args) {
new GUITest();
}
}
GUI
public class GUI extends JPanel {
private static final long serialVersionUID = 1L;
private ConsolePanel console;
private static GUI instance;
private GUI() {
console = new ConsolePanel();
add(console);
}
public static GUI getInstance() {
if(instance == null) instance = new GUI();
return instance;
}
public void createAndShowGUI() {
// Create window
JFrame f = new JFrame("GUI");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setBackground(Color.decode("#333333"));
f.setResizable(false);
// Create the content pane
JComponent c = new GUI();
c.setOpaque(false);
f.setContentPane(c);
// Draw the window
f.pack();
f.setVisible(true);
}
public void addTxt(String txt) {
console.addTxt(txt);
}
}
ConsolePanel
public class ConsolePanel extends JPanel {
private static final long serialVersionUID = 1L;
private JTextArea console;
public ConsolePanel() {
console = new JTextArea("Init...", 10, 10);
add(console);
}
public void addTxt(String txt) {
console.append(txt);
}
}
How do I implement the addTxt-method correctly, so that the "Test1", "Test2"... also are added and displayed on the text component?
Fixed:
Changed the line JComponent c = new GUI()
to JComponent c = instance
.
You're creating a new TestGUI (or GUI depending on how you name it) in the createAndShowGUI method, thus you have two of these beasts. Don't do that. Create only one.