2015-05-16 6 views
-1

В настоящее время я работаю над бот-чатом. У меня есть база данных из примера «супер» бота с сайта alicebot.Java JFrame и ChatBot не могут печатать текст

У меня есть GUI от JFrame, и у меня проблемы с чтением текста из TextField и печать его в TextArea с ответом Bot. Пример:

Тип текстаField - HI.

[TextArea]: Вы: HI. Бот: Привет!

Вот код: (Да, это все еще в основном, потому что я хотел бы его протестировать). Я думаю, что есть проблема со ссылками. jTextField1 не может анализировать входную строку в класс coinpichat.

Затем я должен его отсканировать, и Бот должен дать мне правильный ответ. У меня есть файл библиотеки добавлено: скачать здесь (последняя версия): https://code.google.com/p/program-ab/downloads/list?can=1&q=

Когда я запускаю его без GUI реализован - все это работает, но когда я пытаюсь ссылаться на TextFields и области не работает ,

Класс coinpichat:

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package chatter; 

import org.alicebot.ab.*; 
import org.alicebot.ab.utils.IOUtils; 

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashSet; 
import java.io.*; 
import javax.swing.JTextArea; 


public class coinpichat { 

// private static javax.swing.JTextArea jTextArea1; 
// private static javax.swing.JTextField jTextField1; 

    public static void main(String[] args) { 
     String botname="super"; 
     String path="C:\\ab"; 

       GuiInit guiInit = new GuiInit();     
       guiInit.initWindow(); 

     Bot bot = new Bot(botname, path); 
       GUIFrame guifr = new GUIFrame(); 

     Chat chatSession = new Chat(bot); 
     bot.brain.nodeStats(); 
     MagicBooleans.trace_mode = true; 
     String textLine=""; 
     System.out.print("You: "); 
     while (true) {  
         textLine = guifr.jTextField1.getText(); 
         System.out.println(textLine); 
         guifr.jTextArea1.append("Zebrano: "+textLine); 
//   textLine = IOUtils.readInputTextLine(); 
      if (textLine == null || textLine.length() < 1) textLine = MagicStrings.null_input; 
      if (textLine.equals("q")) System.exit(0); 
      else if (textLine.equals("wq")) { 
       bot.writeQuit(); 
       System.exit(0); 
      } 
      else { 
       String request = guifr.text; 
       if (MagicBooleans.trace_mode) 
        guifr.jTextArea1.append("STATE="+request + ":THAT="+chatSession.thatHistory.get(0).get(0) + ":TOPIC=" + chatSession.predicates.get("topic")); 
       String response = chatSession.multisentenceRespond(request); 
       while (response.contains("&lt;")) response = response.replace("&lt;","<"); 
       while (response.contains("&gt;")) response = response.replace("&gt;",">"); 


       //jTextArea1.setText("Robot: "+response); 
//    System.out.println("Robot: "+response); 

       //String s = null; 

       //System.out.print("You: "); 

//     

      } 
     } 

    } 
} 

Класс GUIFrame

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package chatter; 

import java.awt.Button; 
import java.awt.Event; 
import java.awt.TextArea; 
import java.awt.TextField; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class GUIFrame extends javax.swing.JFrame { 


    public GUIFrame() { 
     initComponents(); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jButton2 = new javax.swing.JButton(); 
     jTextField1 = new javax.swing.JTextField(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTextArea1 = new javax.swing.JTextArea(); 
     jMenuBar1 = new javax.swing.JMenuBar(); 
     jMenu1 = new javax.swing.JMenu(); 
     jMenu2 = new javax.swing.JMenu(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton2.setText("APPLY"); 
     jButton2.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton2ActionPerformed(evt); 
      } 
     }); 

     jTextField1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jTextField1ActionPerformed(evt); 
      } 
     }); 

     jTextArea1.setColumns(20); 
     jTextArea1.setRows(5); 
     jScrollPane1.setViewportView(jTextArea1); 

     jMenu1.setText("File"); 
     jMenuBar1.add(jMenu1); 

     jMenu2.setText("Edit"); 
     jMenuBar1.add(jMenu2); 

     setJMenuBar(jMenuBar1); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jTextField1) 
        .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 505, Short.MAX_VALUE) 
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
         .addGap(0, 0, Short.MAX_VALUE) 
         .addComponent(jButton2))) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(30, 30, 30) 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
       .addComponent(jButton2) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 347, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(167, 167, 167)) 
     ); 

     pack(); 
    }// </editor-fold>       






    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
     // TODO add your handling code here: 
    }           
    String text; 
    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {            
     text = jTextField1.getText(); 
//  jTextArea1.append("User: "+text+"\n"); 
    }           





    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(GUIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(GUIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(GUIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(GUIFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new GUIFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton2; 
    private javax.swing.JMenu jMenu1; 
    private javax.swing.JMenu jMenu2; 
    private javax.swing.JMenuBar jMenuBar1; 
    private javax.swing.JScrollPane jScrollPane1; 
    public javax.swing.JTextArea jTextArea1; 
    public javax.swing.JTextField jTextField1; 
    // End of variables declaration     
} 

Класс GuiInit

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package chatter; 

/** 
* 
* @author Ludwiś 
*/ 
public class GuiInit { 

    public void initWindow(){ 
    GUIFrame guiFrame = new GUIFrame(); 

      guiFrame.setSize(600, 550); 
      guiFrame.setDefaultCloseOperation(GUIFrame.EXIT_ON_CLOSE); 
      guiFrame.setTitle("Chatter Botter"); 
      guiFrame.setVisible(true); 

    } 

} 
+0

Как вы получаете текст? Это в цикле while-true? Где он блокируется? также, вы попробовали отладку? –

+0

Я получаю текст в этой строке в классе coinpichat: textLine = guifr.jTextField1.getText(); Я установил эту переменную textLine по значению из jTextField1. Да, он находится в цикле while (true). Он не блокируется. Он печатает первый вход от конца jTextField1. Как заблокировать его? – Benetto

+0

Ну, я думаю, вам нужно какое-то ** асинхронное событие **, поэтому, возможно, у кнопки есть привязанный обработчик, и когда кнопка нажата, происходит передача сообщения-сообщения? Это много кода, который вы опубликовали, но это, похоже, проблема. Если вы создадите эту кнопку, убедитесь, что вы удалите цикл. –

ответ

0

Разница между чтением из консоли и отвечать на запросы к пользователю в графической среде является то, что вам необходимо зарегистрировать специальные мероприятия.

Эти события (которые обрабатываются слушателями в java) соответствуют нажатиям клавиш (например,), чтобы указать, что пользователь сделал что-то значимое.

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

Это не добавление JButton и реализация ActionListener, который контролирует, что происходит при нажатии этой кнопки.

Подробнее см. В oracle's tutorial.

+0

В его коде уже используются JButtons и ActionListeners. –