2015-06-18 2 views
0

Я пытаюсь добавить текст в JTextArea. Я понимаю, как добавить текст через прослушиватель событий, но я не могу понять, как добавить текст, если, например, вызов метода из основного метода. Текст добавляется к JTextArea просто отлично, но компонент JTextArea не обновляется/не перерисовывается/не проверяется/не проверяется (или что вы должны сказать :-)).Добавить текст в JTextArea

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

Как реализовать addTxt-метод правильно, так что "Test1", "test2" .. . также добавляются и отображаются в текстовом компоненте?

Исправлено:

Изменено линию JComponent c = new GUI() к JComponent c = instance.

+1

Где-то вещи, скорее всего, не подключены должным образом, но там, где я не могу видеть, основываясь на приведенном выше коде. Вам следует подумать о создании и публикации [sscce] (http://sscce.org) или [минимальной примерной программы/mcve] (http://stackoverflow.com/help/mcve), где вы скомбинируете свой код на самый маленький бит который все еще компилируется и запускается, не имеет внешних зависимостей (например, необходимость привязки к базе данных или изображениям), не имеет дополнительного кода, который не имеет отношения к вашей проблеме, но все же демонстрирует вашу проблему. Обратите внимание, что ваш sscce не должен использовать MigLayout или любые другие внешние зависимости. Будь проще. –

+2

Мое предположение: вы можете затенять переменную в коде, который не показан. –

+0

@AbishekManoharan: пожалуйста, удалите свой вводящий в заблуждение комментарий. Никогда не нужно вызывать 'revalidate()' после вызова 'append (...)' на JTextArea. –

ответ

2

Вы создаете новый TestGUI (или GUI в зависимости от того, как вы его называете) в методе createAndShowGUI, таким образом, у вас есть два этих зверя. Не делай этого. Создайте только один.

+0

Вы правы. Вместо этого я изменил его на 'JComponent c = instance'. – eli

+0

@ пользователь2832479: точно. сам, я бы получил метод createAndShowGUI из класса GUI или TestGUI целиком, так как он там не принадлежит. –

+0

- И это исправило проблему. Ты мой герой! :-) – eli

Смежные вопросы