Desde hace tiempo llevo leyendo el blog de atareao, que es un blog dedicado a Ubuntu y software libre. Uno de los logros que me parecen más interesantes de entre los que este bloguero ha creado son las lentes para Ubuntu, entre ellas Yavol. Tan interesantes me parecieron, que quise informarme sobre cómo las había hecho. Fue ahí donde conocí el concepto de API, que me interesó tanto que quedó en mi recámara guardado para cuando tuviese tiempo, intentar usar alguna.
Actualmente estoy en la parte final de un curso de programación Java utilizando el entorno de programación multiplataforma Netbeans. Así que se me ocurrió la idea de generar una aplicación gráfica con netbeans utilizando la API de Google Translate. Busqué algo de información que me sirviese como punto de partida y encontré información tan interesante como la que podéis ver aquí en un screencast. Así que me puse manos a la obra y pronto obtuve resultados, pero no los esperados (más adelante comentaré por qué). En la siguiente imagen podéis ver el aspecto gráfico de la apliación creada
Aspecto gráfico de la aplicación |
El código tuve que modificarlo con respecto al que se incluye en el screencast del enlace anterior, ya que utilicé una versión de la API más reciente. El código completo lo podéis encontrar debajo
public class ApiJava extends javax.swing.JFrame {
/**
* Creates new form ApiJava
*/
public ApiJava() {
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() {
panelContenedor = new javax.swing.JPanel();
txtEspanol = new javax.swing.JTextField();
btnTraducir = new javax.swing.JButton();
txtIngles = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
panelContenedor.setName("Traductor básico"); // NOI18N
txtEspanol.setPreferredSize(new java.awt.Dimension(40, 20));
btnTraducir.setText("Spa->Eng");
btnTraducir.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnTraducirActionPerformed(evt);
}
});
javax.swing.GroupLayout panelContenedorLayout = new javax.swing.GroupLayout(panelContenedor);
panelContenedor.setLayout(panelContenedorLayout);
panelContenedorLayout.setHorizontalGroup(
panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelContenedorLayout.createSequentialGroup()
.addComponent(txtEspanol, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnTraducir)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(txtIngles, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE))
);
panelContenedorLayout.setVerticalGroup(
panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelContenedorLayout.createSequentialGroup()
.addGap(15, 15, 15)
.addGroup(panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(txtEspanol, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
.addComponent(btnTraducir))
.addComponent(txtIngles)))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(panelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 12, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void btnTraducirActionPerformed(java.awt.event.ActionEvent evt) {
try {
String textoOriginal=(String)this.txtEspanol.getText(); //Recoge el texto
Translator traslador=new Translator(); //Instancia un objeto de la clase Translator
String textoTraducido=traslador.translate(textoOriginal, Language.SPANISH, Language.ENGLISH);
//Convierte el texto original de Spanish a English y lo almacena
//en textoTraducido
this.txtIngles.setText(textoTraducido); //Enviamos el textoTraducido a la caja de texto
}catch (Exception e){ //Chequea excepciones
System.out.println("Error"+e.getMessage());
}
}
/**
* @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(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ApiJava().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton btnTraducir;
private javax.swing.JPanel panelContenedor;
private javax.swing.JTextField txtEspanol;
private javax.swing.JTextField txtIngles;
// End of variables declaration
}
Cuando todo estaba perfectamente compilado y parecía listo para funcionar, la ejecución de la aplicación me devolvió el siguiente error
org.json.JSONException: JSONObject["responseData"] is not a JSONObject.
Tras una búsqueda por internet averigué que este error está relacionado con que ahora la API de Google Translate es de pago, así que todo mi esfuerzo se fue por la borda porque por simple curiosidad no voy a pagar para usarla.
En un futuro tengo pensado utilizar alguna otra, esta vez cerciorándome de que es gratuita. De momento he pensado en la de OpenStreetMap. ¿Me recomendáis alguna?
No hay comentarios:
Publicar un comentario