2013-12-24 4 views
0

Как говорится в вопросе, у меня возникают проблемы с обновлением текста JTextArea, который находится внутри JScrollPane.Как обновить текст JTextArea внутри JScrollPane?

Я могу захватить текст из typViewed getView() JScrollPane. Однако, я попробовал следующее обновить JTextArea.

((JTextArea)(chatWindow.getViewport().getView())).setText("Hello!"); 

где chatWindow - это JScrollPane.

и я попытался это:

chatWindowInsert.setText(processMessage()); 

где chatWindowInsert является JTextArea в JScrollPane

Ни работа, к сожалению.

Я не получаю никаких исключений или висит.

Помощь будет оценена!

Вот мой полный код. Пожалуйста, извините меня, если я сломал миллион программ.

public class ChatterBotClient extends JFrame{ 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private static ChatterBotFactory chatterBotFactory; 
private static ChatterBotSession chatterBotSession; 
private static ChatterBot chatterBot; 
public static JScrollPane chatWindow; 
public static JTextField userInput; 
public static JTextArea chatWindowInsert; 
public ChatterBotClient() 
{ 
    try{ 
    chatterBotFactory = new ChatterBotFactory(); 
    chatterBot = chatterBotFactory.create(ChatterBotType.CLEVERBOT); 
    chatterBotSession = chatterBot.createSession(); 
    }catch(Exception e) 
    { 
     e.printStackTrace(); 
     System.out.println("Error :O"); 
     JOptionPane.showMessageDialog(null, 
       "There has been a problem initializing the Bot. Please restart."); 
    } 

    initUI(); 
} 

public void initUI() 
{ 
    //Define the mainPanel that everything goes into in the JFrame 
    JPanel mainPanel = new JPanel(new BorderLayout()); 
    //Define the child panels of "mainPanel" 
    JPanel infoPanel = new JPanel(new FlowLayout()); 
    JPanel chatHistoryPanel = new JPanel(new FlowLayout()); 
    JPanel userInputAndButtonPanel = new JPanel(new FlowLayout()); 
    setTitle("ChatterBot Chat Client"); 
    setSize(600,300); 
    setResizable(false); 

    //Define each component 
    //Set properties of each component 
    JLabel infoLabel = new JLabel("Welcome to my Cleverbot Client! Please enjoy! :D"); 
     infoLabel.setPreferredSize(new Dimension(550, 20)); 
     infoLabel.setHorizontalTextPosition(SwingConstants.CENTER); 

    chatWindowInsert = new JTextArea(); 
     chatWindowInsert.setWrapStyleWord(true); 

    chatWindow = new JScrollPane(chatWindowInsert); 
     chatWindow.setPreferredSize(new Dimension(500,225)); 
     chatWindow.setPreferredSize(chatWindow.getPreferredSize()); 


    userInput = new JTextField(); 
     userInput.setPreferredSize(new Dimension(250, 25)); 

    JButton enterBtn = new JButton("Send"); 
     enterBtn.setPreferredSize(new Dimension(75, 25)); 

    //Add each component to the required panels 
    infoPanel.add(infoLabel); 

    chatHistoryPanel.add(chatWindow); 

    userInputAndButtonPanel.add(userInput, BorderLayout.CENTER); 
    userInputAndButtonPanel.add(enterBtn, BorderLayout.EAST); 

    //Add the child panels to the mainPanel 
    mainPanel.add(infoPanel, BorderLayout.NORTH); 
    mainPanel.add(chatHistoryPanel, BorderLayout.CENTER); 
    mainPanel.add(userInputAndButtonPanel, BorderLayout.SOUTH); 

    //Now, add the appropriate listeners to your components 
    enterBtn.addActionListener(new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("You clicked me! :D"); 
      try { 
       processMessage(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       System.out.println("Something went wrong when you pressed the button! :O"); 
      } 
     } 
    }); 

    userInput.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent arg0) 
     { 
      chatWindow = new JScrollPane(new JTextArea(processMessage())); 

     } 
    }); 

    //Tell the JFrame to display what we've made! 
    add(mainPanel);  

} 

public static String processMessage() 
{ 
    try { 
     String completeMessage = chatWindowInsert.getText(); 
     completeMessage.concat("You: " + userInput.getText() + "\n"); 
     String response = chatterBotSession.think(userInput.getText()); 
     completeMessage.concat("Bot: " + response + "\n"); 
     userInput.setText(""); 
     return completeMessage; 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return "ERROR"; 
    } 
} 

public static void main(String[] args) 
{ 

    SwingUtilities.invokeLater(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      ChatterBotClient cli = new ChatterBotClient(); 
      cli.setVisible(true); 
     } 
    }); 
} 

}

+0

Что значит «иметь проблемы с обновлением текста» и «что все еще не работает»? Любые исключения? Подвесной? отсутствует текст? – StanislavL

+0

Приношу свои извинения. Я отредактировал вопрос, чтобы он был намного понятнее! Я бегу очень мало спать! – Pilapodapostache

ответ

4

Вы состояние:

Поскольку вопрос государств, у меня возникают проблемы с обновлением текста JTextArea, который внутри JScrollPane.

Я могу захватить текст из typViewed getView() JScrollPane. Тем не менее, я попробовал следующее, чтобы обновить JTextArea.

((JTextArea)(chatWindow.getViewport().getView())).setText("Hello!"); 


Почему пройти через все это хрупкое код гимнастики? Гораздо проще, безопаснее и проще было бы создать поле экземпляра JTextArea на уровне класса, которое затем отображается в вашем графическом интерфейсе в JScrollPane, и просто получить текст или установить текст в этом экземпляре. Никакой муссы, никакой суеты, никаких ошибок.

Если это не может быть сделано с вашей текущей программой, то вы еще не сказали нам достаточно, чтобы предлагать иное, и вам нужно будет рассказать нам гораздо больше.


Редактировать
Ответы на Ваши комментарии:

имеют переменные, ссылающихся как JTextArea и JTextField (просто, чтобы попробовать и понять это), но даже если я изменить либо переменной, используя один из описанных выше способов, содержимое внутри JTextArea все равно не изменится. Разве я не понимаю, что ты говоришь?

Тогда это говорит о том, что, хотя вы можете работать с правильной переменной, возможно, вы работаете над неправильной ссылкой.Возможно, переменные, с которыми вы работаете, не хранятся в графическом интерфейсе, который отображается в настоящее время.

Но это не что иное, как SWAG-работа (глупая догадка). Пожалуйста, не заставляйте нас угадывать - отредактируйте свое оригинальное сообщение и покажите нам свой код, лучше всего sscce, покажите нам, как вы получаете свой дескриптор этих переменных и как вы знаете, что они принадлежат , отображаемому gui.


Edit 2
Что касается вашего последнего кода. Давайте посмотрим на эту строку:

public static JTextArea chatWindowInsert; 
  1. Это поле не должно быть статическим, а это я 100% уверен.
  2. Где вы добавляете объект, к которому в конечном итоге относится это поле, к вашему графическому интерфейсу? Я не могу найти это в вашем размещенном коде.

Редактировать 3

теперь я вижу, что вы положили совершенно другой JTextField в JScrollPane, никогда не кладите его в графический интерфейс в любом месте, и сделать все это на нажатия кнопки всех мест !?

userInput.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent arg0) 
    { 
     chatWindow = new JScrollPane(new JTextArea(processMessage())); 

    } 
}); 

Предложения:

  1. Не делайте этого.
  2. Не создавайте новую JTextArea и новую JScrollPane каждый раз, когда активируется этот исполнитель действия.
  3. Не создавайте компоненты и не оставляйте их висящими на гниении, не размещая ключевые компоненты в графическом интерфейсе.
  4. Вместо этого запустите JTextArea в графический интерфейс при создании графического интерфейса. Только один раз.
+0

У меня есть переменные, ссылающиеся как на JTextArea, так и на JTextField (просто чтобы понять это), но даже если я изменю любую переменную, используя один из способов, описанных выше, содержимое внутри JTextArea все равно не изменится. Разве я не понимаю, что ты говоришь? – Pilapodapostache

+0

@Pilapodapostache: см. Править для ответа. –

+0

Я предоставил свой полный код. в исходном посте. – Pilapodapostache

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