Commit Inicial

This commit is contained in:
Isidoro Nevares Martín 2026-02-07 22:40:51 +01:00
commit c80ffcc34e
10 changed files with 315 additions and 0 deletions

41
.classpath Normal file
View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="test" value="true"/>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="test" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="optional" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
<attributes>
<attribute name="module" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/bin/
*.class
/target/

23
.project Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>aadd_act5_5_ia_swing</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,13 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=24
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=24
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=24

View File

@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1

View File

@ -0,0 +1,27 @@
Actúa como un extractor de datos JSON que, a la vez, es experto en deporte olímpico.
Analiza el texto que te van a proporcionar.
Devuelve exclusivamente un objeto JSON con esta estructura:
{
"nombre": "",
"apellidos": "",
"fecha_nacimiento": "YYYY-MM-DD",
"sexo": "H/M",
"participaciones": [
{
"disciplina": {"nombre_diciplina": "",
"diciplina_individual": "0/1",
}
"juego": {"nombre": "Ciudad_Juego(en español)",
"pais": "País_Organizador(en español)",
"anyo": YYYY,
"verano": 0/1
"mascota":{
"nombre": "Nombre_Mascota",
"url_imagen": "https://img.olympics.com/images/image/private/xxx"
}
}
}
]
}
No escribas nada de texto antes o después del JSON.

15
pom.xml Normal file
View File

@ -0,0 +1,15 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lapaloma.jjoo</groupId>
<artifactId>ProyectoJJOO</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/tools.jackson.dataformat/jackson-dataformat-xml -->
<dependency>
<groupId>tools.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,145 @@
package org.lapaloma.jjoo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
/**
*
* ClienteIAJuegosOlimpicos: Clase que realiza ....
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 7 feb 2026
*
*
*/
public class ClienteJuegosOlimpicosIA extends JFrame {
private static final long serialVersionUID = -6074564949314600423L;
private JTextArea txtPeticion;
private JButton btnEnviar;
public ClienteJuegosOlimpicosIA() {
// Configuración básica de la ventana
setTitle("Cliente IA - Acceso a Datos con IA (Groq)");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new BorderLayout(10, 10));
// Panel superior con FlowLayout alineado a la izquierda
JPanel panelNorte = new JPanel(new FlowLayout(FlowLayout.LEFT));
JLabel lblTitulo = new JLabel("Petición a procesar (sobre deportistas):");
lblTitulo.setFont(new Font("SansSerif", Font.BOLD, 13));
// Esto asegura que la etiqueta tenga espacio suficiente independientemente del
// layout
lblTitulo.setPreferredSize(new Dimension(300, 30));
panelNorte.add(lblTitulo);
add(panelNorte, BorderLayout.NORTH);
// Caja de texto central (tipo chat)
txtPeticion = new JTextArea();
txtPeticion.setLineWrap(true);
txtPeticion.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(txtPeticion);
scrollPane.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10),
BorderFactory.createLineBorder(Color.GRAY)));
add(scrollPane, BorderLayout.CENTER);
// Contenedor para la parte inferior del panel central
JPanel panelEjemplo = new JPanel(new BorderLayout());
// Usamos JTextArea para que el texto pueda seleccionarse y copiarse
JTextArea txtEjemplo = new JTextArea(
"Ejemplo: Obtén información completa, precisa y ordenada de atletas que participaron en juegos olímpicos de la siguiente disciplinas: Atletismo, natación y gimnasia. Serán 6 deportistas (3 hombres y 3 mujeres) por disciplina. Proporciona información de deportistas de distintos juegos olímpicos.");
txtEjemplo.setEditable(false); // No se puede borrar/escribir
txtEjemplo.setLineWrap(true);
txtEjemplo.setWrapStyleWord(true);
txtEjemplo.setBackground(getBackground()); // Color igual al del panel
txtEjemplo.setForeground(new Color(100, 100, 100));
txtEjemplo.setFont(new Font("SansSerif", Font.ITALIC, 11));
txtEjemplo.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
// Botón de copiar pequeño
JButton btnCopiar = new JButton("📋"); // Puedes usar un icono .png si prefieres
btnCopiar.setToolTipText("Copiar texto al portapapeles");
btnCopiar.setPreferredSize(new Dimension(50, 30));
// Acción del botón
btnCopiar.addActionListener(e -> {
copiarAlPortapapeles(txtEjemplo.getText());
// Opcional: feedback visual rápido
btnCopiar.setText("");
new Timer(1500, ev -> btnCopiar.setText("📋")).start();
});
// Montaje
panelEjemplo.add(txtEjemplo, BorderLayout.CENTER);
panelEjemplo.add(btnCopiar, BorderLayout.EAST); // Botón a la derecha
// Añadir al panel central igual que antes
JPanel panelCentral = new JPanel(new BorderLayout());
panelCentral.add(scrollPane, BorderLayout.CENTER);
panelCentral.add(panelEjemplo, BorderLayout.SOUTH);
add(panelCentral, BorderLayout.CENTER);
// Panel inferior para el botón de envío
JPanel panelSur = new JPanel(new FlowLayout(FlowLayout.RIGHT));
btnEnviar = new JButton("Enviar ➤");
btnEnviar.setBackground(new Color(66, 133, 244));
btnEnviar.setForeground(Color.WHITE);
btnEnviar.setFocusPainted(false);
btnEnviar.addActionListener(e -> procesarPeticionCliente());
panelSur.add(btnEnviar);
add(panelSur, BorderLayout.SOUTH);
}
private void copiarAlPortapapeles(String texto) {
StringSelection selection = new StringSelection(texto.replace("Ejemplo: ", ""));
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, selection);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new ClienteJuegosOlimpicosIA().setVisible(true);
});
}
private void procesarPeticionCliente() {
// TODO Auto-generated method stub
String textoPrompt = txtPeticion.getText();
System.out.println("Enviando petición: " + textoPrompt);
// Aquí se llamaría al método que hace la petición a la IA y procesa la respuesta
// Los parámetros de la petición (URL, API Key, modelo, contexto)
// están en el fichero de configuración conf.properties en la carpeta de recursos
}
}

View File

@ -0,0 +1,39 @@
/**
* GestorFicheroConfiguracion: clase utilitaria para leer propiedades del archivo application.properties.
* Provee un método estático que devuelve el valor asociado a una clave.
*
* @author Isidoro Nevares Martín - IES Virgen de la Paloma
* @date 25 nov 2025
*/
package org.lapaloma.jjoo.gestores;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class GestorFicheroConfiguracion {
private static final Properties PROPIEDADES = new Properties();
static {
try (InputStream is = GestorFicheroConfiguracion.class.getClassLoader()
.getResourceAsStream("conf.properties")) {
if (is != null) {
PROPIEDADES.load(is);
} else {
throw new IllegalStateException("No se encontró application.properties en el classpath");
}
} catch (IOException e) {
throw new IllegalStateException("Error al cargar application.properties", e);
}
}
/**
* Obtiene el valor asociado a la clave especificada.
*
* @param clave la clave a buscar
* @return el valor o {@code null} si no existe
*/
public static String obtenerValor(String clave) {
return PROPIEDADES.getProperty(clave);
}
}

View File

@ -0,0 +1,5 @@
# Fichero para la carga de datos de Atletas con IA (GROQ)
key.api.proveedor.ia=aquí_va_tu_api_key_de_groq
url.api.proveedor.ia=https://api.groq.com/openai/v1/chat/completions
model.proveedor.ia=openai/gpt-oss-120b
fichero.contexto.ia.atletas=ficheros/contexto_ia_atletas.txt