diff --git a/src/main/java/org/lapaloma/jjoo/ClienteJuegosOlimpicosIA.java b/src/main/java/org/lapaloma/jjoo/ClienteJuegosOlimpicosIA.java index 4862087..c0ad5c4 100644 --- a/src/main/java/org/lapaloma/jjoo/ClienteJuegosOlimpicosIA.java +++ b/src/main/java/org/lapaloma/jjoo/ClienteJuegosOlimpicosIA.java @@ -2,6 +2,8 @@ package org.lapaloma.jjoo; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Component; +import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; @@ -10,10 +12,12 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; @@ -21,41 +25,59 @@ import javax.swing.Timer; /** * - * ClienteIAJuegosOlimpicos: Clase que realiza .... + * ClienteIAJuegosOlimpicos * - * @author Isidoro Nevares Martín - IES Virgen de la Paloma + * @author Isidoro * @date 7 feb 2026 - * - * */ - public class ClienteJuegosOlimpicosIA extends JFrame { + private static final long serialVersionUID = -6074564949314600423L; private JTextArea txtPeticion; private JButton btnEnviar; + private JRadioButton rbOpcion1; + private JRadioButton rbOpcion2; + + // Panel que se activa / desactiva según la opción + private JPanel panelContenido; + public ClienteJuegosOlimpicosIA() { - // Configuración básica de la ventana + + // ================= CONFIGURACIÓN 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 + // ================= PANEL NORTE ================= 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)); + rbOpcion1 = new JRadioButton("Opción 1"); + rbOpcion2 = new JRadioButton("Opción 2"); + + ButtonGroup grupo = new ButtonGroup(); + grupo.add(rbOpcion1); + grupo.add(rbOpcion2); + + rbOpcion1.setSelected(true); + panelNorte.add(lblTitulo); + panelNorte.add(rbOpcion1); + panelNorte.add(rbOpcion2); + add(panelNorte, BorderLayout.NORTH); - // Caja de texto central (tipo chat) + // ================= PANEL CONTENIDO ================= + panelContenido = new JPanel(new BorderLayout()); + + // Caja de texto central txtPeticion = new JTextArea(); txtPeticion.setLineWrap(true); txtPeticion.setWrapStyleWord(true); @@ -63,83 +85,98 @@ public class ClienteJuegosOlimpicosIA extends JFrame { 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 + // ---------- Panel ejemplo ---------- 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."); + "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.setEditable(false); txtEjemplo.setLineWrap(true); txtEjemplo.setWrapStyleWord(true); - txtEjemplo.setBackground(getBackground()); // Color igual al del panel + txtEjemplo.setBackground(getBackground()); 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 + JButton btnCopiar = new JButton("📋"); + btnCopiar.setPreferredSize(new Dimension(50, 30)); + btnCopiar.setToolTipText("Copiar texto al portapapeles"); + btnCopiar.addActionListener(e -> { - copiarAlPortapapeles(txtEjemplo.getText()); - // Opcional: feedback visual rápido - btnCopiar.setText("✅"); - new Timer(1500, ev -> btnCopiar.setText("📋")).start(); + copiarAlPortapapeles(txtEjemplo.getText()); + 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 + panelEjemplo.add(btnCopiar, BorderLayout.EAST); + JPanel panelCentral = new JPanel(new BorderLayout()); panelCentral.add(scrollPane, BorderLayout.CENTER); panelCentral.add(panelEjemplo, BorderLayout.SOUTH); - add(panelCentral, BorderLayout.CENTER); + panelContenido.add(panelCentral, BorderLayout.CENTER); - // Panel inferior para el botón de envío + add(panelContenido, BorderLayout.CENTER); + + // ================= PANEL SUR (BOTÓN COMÚN) ================= 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()); + btnEnviar.addActionListener(e -> { + if (rbOpcion1.isSelected()) { + procesarOpcion1(); + } else { + procesarOpcion2(); + } + }); panelSur.add(btnEnviar); add(panelSur, BorderLayout.SOUTH); + + // ================= ESTADO INICIAL ================= + habilitarComponentes(panelContenido, false); + + rbOpcion1.addActionListener(e -> habilitarComponentes(panelContenido, false)); + rbOpcion2.addActionListener(e -> habilitarComponentes(panelContenido, true)); } + + // ================= MÉTODOS AUXILIARES ================= + + private void habilitarComponentes(Container container, boolean habilitar) { + for (Component c : container.getComponents()) { + c.setEnabled(habilitar); + if (c instanceof Container) { + habilitarComponentes((Container) c, habilitar); + } + } + } + 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); - }); + StringSelection selection = new StringSelection(texto.replace("Ejemplo: ", "")); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(selection, selection); } - private void procesarPeticionCliente() { - // TODO Auto-generated method stub + private void procesarOpcion1() { + System.out.println("Procesando Opción 1 (sin contenido editable)"); + } + + private void procesarOpcion2() { 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 - + System.out.println("Procesando Opción 2: " + textoPrompt); } + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> new ClienteJuegosOlimpicosIA().setVisible(true)); + } }