fork download
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.util.HashMap;
  5. import java.util.LinkedHashMap;
  6. import java.util.Map;
  7. import java.util.Random;
  8.  
  9. public class Main {
  10.  
  11. public static void main(String[] args) {
  12. SwingUtilities.invokeLater(() -> new Controlador().mostrarRegistroCandidato());
  13. }
  14. }
  15.  
  16. class DatosCompartidos {
  17. java.util.List<String> candidatos = new java.util.ArrayList<>();
  18. Map<String, String> distritos = new LinkedHashMap<>();
  19. Map<String, Integer> preferencias = new HashMap<>();
  20. Map<String, Integer> votosTotales = new LinkedHashMap<>();
  21. int totalVotos = 0;
  22. }
  23.  
  24. class Controlador {
  25. JFrame ventana;
  26. DatosCompartidos datos = new DatosCompartidos();
  27.  
  28. void mostrarRegistroCandidato() {
  29. if (ventana != null) ventana.dispose();
  30. ventana = new RegistroCandidato(this, datos);
  31. ventana.setVisible(true);
  32. }
  33.  
  34. void mostrarRegistroDistrito() {
  35. if (ventana != null) ventana.dispose();
  36. ventana = new RegistroDistrito(this, datos);
  37. ventana.setVisible(true);
  38. }
  39.  
  40. void mostrarIntencionVoto() {
  41. if (ventana != null) ventana.dispose();
  42. ventana = new IntencionVoto(this, datos);
  43. ventana.setVisible(true);
  44. }
  45.  
  46. void mostrarVotacion() {
  47. if (ventana != null) ventana.dispose();
  48. ventana = new Votacion(this, datos);
  49. ventana.setVisible(true);
  50. }
  51.  
  52. void mostrarResultados() {
  53. if (ventana != null) ventana.dispose();
  54. ventana = new Resultados(this, datos);
  55. ventana.setVisible(true);
  56. }
  57. }
  58.  
  59. class RegistroCandidato extends JFrame {
  60. public RegistroCandidato(Controlador c, DatosCompartidos d) {
  61. setTitle("Registro de Candidatos");
  62. setSize(400, 300);
  63. setDefaultCloseOperation(EXIT_ON_CLOSE);
  64. setLayout(new BorderLayout());
  65.  
  66. JTextField campo = new JTextField();
  67. campo.setFont(new Font("Arial", Font.PLAIN, 14));
  68. DefaultListModel<String> modelo = new DefaultListModel<>();
  69. JList<String> lista = new JList<>(modelo);
  70. lista.setFont(new Font("Arial", Font.PLAIN, 14));
  71.  
  72. JButton guardar = new JButton("Guardar");
  73. guardar.setFont(new Font("Arial", Font.PLAIN, 14));
  74. guardar.addActionListener(e -> {
  75. String nombre = campo.getText().trim();
  76. if (!nombre.isEmpty() && d.candidatos.size() < 80) {
  77. d.candidatos.add(nombre);
  78. modelo.addElement(nombre);
  79. campo.setText("");
  80. }
  81. });
  82.  
  83. JButton siguiente = new JButton("Siguiente");
  84. siguiente.setFont(new Font("Arial", Font.PLAIN, 14));
  85. siguiente.addActionListener(e -> c.mostrarRegistroDistrito());
  86.  
  87. JPanel panelEntrada = new JPanel(new BorderLayout());
  88. panelEntrada.add(new JLabel("Nombre del Candidato:"), BorderLayout.NORTH);
  89. panelEntrada.add(campo, BorderLayout.CENTER);
  90. panelEntrada.add(guardar, BorderLayout.EAST);
  91.  
  92. JPanel panelBotones = new JPanel();
  93. panelBotones.add(siguiente);
  94.  
  95. add(panelEntrada, BorderLayout.NORTH);
  96. add(new JScrollPane(lista), BorderLayout.CENTER);
  97. add(panelBotones, BorderLayout.SOUTH);
  98. }
  99. }
  100.  
  101. class RegistroDistrito extends JFrame {
  102. public RegistroDistrito(Controlador c, DatosCompartidos d) {
  103. setTitle("Registro de Distritos");
  104. setSize(450, 300);
  105. setDefaultCloseOperation(EXIT_ON_CLOSE);
  106. setLayout(new BorderLayout());
  107.  
  108. JTextField campoNumero = new JTextField();
  109. JTextField campoNombre = new JTextField();
  110. DefaultListModel<String> modelo = new DefaultListModel<>();
  111. JList<String> lista = new JList<>(modelo);
  112. lista.setFont(new Font("Arial", Font.PLAIN, 14));
  113.  
  114. JButton guardar = new JButton("Guardar");
  115. guardar.addActionListener(e -> {
  116. String numero = campoNumero.getText().trim();
  117. String nombre = campoNombre.getText().trim();
  118. if (!numero.isEmpty() && !nombre.isEmpty()) {
  119. String clave = "Distrito " + numero;
  120. d.distritos.put(clave, nombre);
  121. modelo.addElement(clave + " - " + nombre);
  122. campoNumero.setText("");
  123. campoNombre.setText("");
  124. }
  125. if (!d.distritos.containsKey("Otro")) {
  126. d.distritos.put("Otro", "No válidos");
  127. modelo.addElement("Otro - No válidos");
  128. }
  129. });
  130.  
  131. JButton regresar = new JButton("Regresar");
  132. regresar.addActionListener(e -> c.mostrarRegistroCandidato());
  133.  
  134. JButton siguiente = new JButton("Siguiente");
  135. siguiente.addActionListener(e -> c.mostrarIntencionVoto());
  136.  
  137. JPanel arriba = new JPanel(new GridLayout(2, 2));
  138. arriba.add(new JLabel("Número de Distrito:"));
  139. arriba.add(campoNumero);
  140. arriba.add(new JLabel("Nombre del Distrito:"));
  141. arriba.add(campoNombre);
  142.  
  143. JPanel abajo = new JPanel();
  144. abajo.add(regresar);
  145. abajo.add(guardar);
  146. abajo.add(siguiente);
  147.  
  148. add(arriba, BorderLayout.NORTH);
  149. add(new JScrollPane(lista), BorderLayout.CENTER);
  150. add(abajo, BorderLayout.SOUTH);
  151. }
  152. }
  153.  
  154. class IntencionVoto extends JFrame {
  155. public IntencionVoto(Controlador c, DatosCompartidos d) {
  156. setTitle("Intención de Voto");
  157. setSize(400, 400);
  158. setDefaultCloseOperation(EXIT_ON_CLOSE);
  159. setLayout(new BorderLayout());
  160.  
  161. JPanel panel = new JPanel(new GridLayout(d.candidatos.size(), 2));
  162. Map<String, JTextField> campos = new HashMap<>();
  163.  
  164. for (String candidato : d.candidatos) {
  165. panel.add(new JLabel(candidato));
  166. JTextField campo = new JTextField();
  167. campos.put(candidato, campo);
  168. panel.add(campo);
  169. }
  170.  
  171. JButton guardar = new JButton("Guardar");
  172. guardar.addActionListener(e -> {
  173. int total = 0;
  174. d.preferencias.clear();
  175.  
  176. for (Map.Entry<String, JTextField> entry : campos.entrySet()) {
  177. try {
  178. int val = Integer.parseInt(entry.getValue().getText());
  179. if (val < 1 || val > 80) throw new Exception();
  180. d.preferencias.put(entry.getKey(), val);
  181. total += val;
  182. } catch (Exception ex) {
  183. JOptionPane.showMessageDialog(this, "Error: Preferencias deben ser entre 1% y 80%");
  184. return;
  185. }
  186. }
  187.  
  188. if (total >= 80 && total < 99) {
  189. d.preferencias.put("Otro", 99 - total);
  190. c.mostrarVotacion();
  191. } else {
  192. JOptionPane.showMessageDialog(this, "La suma total debe estar entre 80% y 98%");
  193. }
  194. });
  195.  
  196. add(new JScrollPane(panel), BorderLayout.CENTER);
  197. add(guardar, BorderLayout.SOUTH);
  198. }
  199. }
  200.  
  201. class Votacion extends JFrame {
  202. public Votacion(Controlador c, DatosCompartidos d) {
  203. setTitle("Generar Votos");
  204. setSize(400, 200);
  205. setDefaultCloseOperation(EXIT_ON_CLOSE);
  206. setLayout(new GridLayout(3, 1));
  207.  
  208. JLabel etiqueta = new JLabel("Cantidad de votos a generar:");
  209. JTextField campo = new JTextField();
  210.  
  211. JButton generar = new JButton("Generar");
  212. generar.addActionListener(e -> {
  213. try {
  214. int total = Integer.parseInt(campo.getText());
  215. d.totalVotos = total;
  216. d.votosTotales.clear();
  217. for (String key : d.preferencias.keySet()) d.votosTotales.put(key, 0);
  218.  
  219. java.util.List<String> lista = new java.util.ArrayList<>();
  220. for (Map.Entry<String, Integer> entry : d.preferencias.entrySet()) {
  221. for (int i = 0; i < entry.getValue(); i++) {
  222. lista.add(entry.getKey());
  223. }
  224. }
  225.  
  226. Random rnd = new Random();
  227. for (int i = 0; i < total; i++) {
  228. String elegido = lista.get(rnd.nextInt(lista.size()));
  229. d.votosTotales.put(elegido, d.votosTotales.get(elegido) + 1);
  230. }
  231.  
  232. c.mostrarResultados();
  233. } catch (Exception ex) {
  234. JOptionPane.showMessageDialog(this, "Error: Ingresa un número válido.");
  235. }
  236. });
  237.  
  238. add(etiqueta);
  239. add(campo);
  240. add(generar);
  241. }
  242. }
  243.  
  244. class Resultados extends JFrame {
  245. public Resultados(Controlador c, DatosCompartidos d) {
  246. setTitle("Resultados");
  247. setSize(500, 400);
  248. setDefaultCloseOperation(EXIT_ON_CLOSE);
  249. setLayout(new BorderLayout());
  250.  
  251. JTextArea area = new JTextArea();
  252. area.setFont(new Font("Arial", Font.PLAIN, 14));
  253. area.setEditable(false);
  254. area.append("Candidato - Votos - Porcentaje\n");
  255.  
  256. for (Map.Entry<String, Integer> entry : d.votosTotales.entrySet()) {
  257. int votos = entry.getValue();
  258. double porcentaje = votos * 100.0 / d.totalVotos;
  259. area.append(entry.getKey() + " - " + votos + " - " + String.format("%.2f", porcentaje) + "%\n");
  260. }
  261.  
  262. add(new JScrollPane(area), BorderLayout.CENTER);
  263. }
  264. }
  265.  
Success #stdin #stdout #stderr 0.36s 67516KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
	at java.desktop/java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:197)
	at java.desktop/java.awt.Window.<init>(Window.java:538)
	at java.desktop/java.awt.Frame.<init>(Frame.java:423)
	at java.desktop/java.awt.Frame.<init>(Frame.java:388)
	at java.desktop/javax.swing.JFrame.<init>(JFrame.java:180)
	at RegistroCandidato.<init>(Main.java:60)
	at Controlador.mostrarRegistroCandidato(Main.java:30)
	at Main.lambda$main$0(Main.java:12)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)