From 5b158e999a5f2fd61f182c0a30e995601847e595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ismael=20Garc=C3=ADa?= Date: Mon, 25 Apr 2016 01:09:32 +0200 Subject: [PATCH] Moved and renamed more things --- README.md | 9 +++-- src/Archivo.java | 12 +++--- src/{Copiar.java => Copiador.java} | 14 +++---- src/{About.java => VentanaAbout.java} | 15 ++++---- src/{Ventana.java => VentanaMain.java} | 49 +++++++++++++------------ src/img/icon.png | Bin 2412 -> 2366 bytes 6 files changed, 51 insertions(+), 48 deletions(-) rename src/{Copiar.java => Copiador.java} (80%) rename src/{About.java => VentanaAbout.java} (91%) rename src/{Ventana.java => VentanaMain.java} (86%) diff --git a/README.md b/README.md index 1568274..26f9c30 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,9 @@ Program to rename massively player's .dat files for Minecraft servers * Easy to use, with graphical interface * Working on Windows and Linux (Oracle Java 8) -### Manual -* Coming soon - ### Download -* Download from [here](https://github.com/Pronink/uuidRenamer/releases) \ No newline at end of file +* Download uuidRenamer from [here](https://github.com/Pronink/uuidRenamer/releases) +* If you haven't Java 8, you can download from [here](https://www.java.com/es/download/) (32 bits) or [here](https://www.java.com/es/download/manual.jsp) (64 bits) + +### Manual +* Coming soon \ No newline at end of file diff --git a/src/Archivo.java b/src/Archivo.java index 634c4c0..5e9e847 100644 --- a/src/Archivo.java +++ b/src/Archivo.java @@ -38,10 +38,10 @@ public static void copiar(String rutaOrigen, String rutaDestino) { inStream.close(); outStream.close(); - Ventana.log.append(Mensaje.msg_done + origen.getName() + Mensaje.msg_copiado + destino.getName() + "\n"); + VentanaMain.log.append(Mensaje.msg_done + origen.getName() + Mensaje.msg_copiado + destino.getName() + "\n"); } catch (IOException e) { - Ventana.log.append(Mensaje.msg_errorDirectorioNoExiste + "\n"); + VentanaMain.log.append(Mensaje.msg_errorDirectorioNoExiste + "\n"); System.out.println(e); } } @@ -59,7 +59,7 @@ public static String[] listarDirectorio(String ruta) { // Retorna NULL si no hay archivos dentro del directorio if (listaDeArchivos.length == 0) { - Ventana.log.append(Mensaje.msg_errorDirectorioVacio + "\n"); + VentanaMain.log.append(Mensaje.msg_errorDirectorioVacio + "\n"); return null; } @@ -73,7 +73,7 @@ public static String[] listarDirectorio(String ruta) { // Retorna NULL si no existen archivos .bat if (numeroDeDats == 0) { - Ventana.log.append(Mensaje.msg_errorNoExistenDats + "\n"); + VentanaMain.log.append(Mensaje.msg_errorNoExistenDats + "\n"); return null; } @@ -93,7 +93,7 @@ public static String[] listarDirectorio(String ruta) { } // Retorna NULL si el directorio no existe else { - Ventana.log.append(Mensaje.msg_errorDirectorioNoExiste + "\n"); + VentanaMain.log.append(Mensaje.msg_errorDirectorioNoExiste + "\n"); return null; } @@ -118,7 +118,7 @@ public static String suNombreConExtension(String ruta) { } // Abre el diálogo de selección de directorio - public static String abrir() { + public static String dialogoAbrir() { JFileChooser llamadaAbrir = new JFileChooser(); llamadaAbrir.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); llamadaAbrir.setDialogTitle(Mensaje.msg_seleccionarDirectorio); diff --git a/src/Copiar.java b/src/Copiador.java similarity index 80% rename from src/Copiar.java rename to src/Copiador.java index a804156..71606a6 100644 --- a/src/Copiar.java +++ b/src/Copiador.java @@ -1,7 +1,7 @@ package uuidRenamer; // Esta clase interactúa con las clases 'Archivo' y 'ConversorWeb' para llevar a cabo el propósito final de la aplicación. -public class Copiar { +public class Copiador { // Copia masiva de ficheros de formato UUID en Player public static boolean toNoPremium(String rutaOrigen, String rutaDestino) throws Exception { @@ -12,14 +12,14 @@ public static boolean toNoPremium(String rutaOrigen, String rutaDestino) throws // Se obtiene el 'convertido' de cada 'archivoOrigen' convertido = ConversorWeb.toName(Archivo.suNombre(archivoOrigen[i])); if (convertido == null) { - Ventana.log.append(Mensaje.msg_errorNoRespuesta1 + Archivo.suNombreConExtension(archivoOrigen[i]) + VentanaMain.log.append(Mensaje.msg_errorNoRespuesta1 + Archivo.suNombreConExtension(archivoOrigen[i]) + Mensaje.msg_errorNoRespuesta2 + "\n"); - Ventana.refrescarLog(); + VentanaMain.refrescarLog(); } // Acción final para cada archivo else { Archivo.copiar(archivoOrigen[i], rutaDestino + convertido + ".dat"); - Ventana.refrescarLog(); + VentanaMain.refrescarLog(); } } return true; @@ -36,14 +36,14 @@ public static boolean toPremium(String rutaOrigen, String rutaDestino) throws Ex // Se obtiene el 'convertido' de cada 'archivoOrigen' convertido = ConversorWeb.toUuid(Archivo.suNombre(archivoOrigen[i])); if (convertido == null) { - Ventana.log.append(Mensaje.msg_errorNoRespuesta1 + Archivo.suNombreConExtension(archivoOrigen[i]) + VentanaMain.log.append(Mensaje.msg_errorNoRespuesta1 + Archivo.suNombreConExtension(archivoOrigen[i]) + Mensaje.msg_errorNoRespuesta2 + "\n"); - Ventana.refrescarLog(); + VentanaMain.refrescarLog(); } // Acción final para cada archivo else { Archivo.copiar(archivoOrigen[i], rutaDestino + convertido + ".dat"); - Ventana.refrescarLog(); + VentanaMain.refrescarLog(); } } return true; diff --git a/src/About.java b/src/VentanaAbout.java similarity index 91% rename from src/About.java rename to src/VentanaAbout.java index f45d3e3..43f1bd1 100644 --- a/src/About.java +++ b/src/VentanaAbout.java @@ -22,14 +22,14 @@ import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; -public class About extends JDialog { +public class VentanaAbout extends JDialog { private static final long serialVersionUID = 1L; private final JPanel contentPanel = new JPanel(); - public About(JFrame ventana, boolean modal) { + public VentanaAbout(JFrame ventana, boolean modal) { super(ventana, modal); - setIconImage(Toolkit.getDefaultToolkit().getImage(About.class.getResource("img/icon.png"))); + setIconImage(Toolkit.getDefaultToolkit().getImage(VentanaAbout.class.getResource("img/icon.png"))); setTitle(Mensaje.about); setResizable(false); @@ -68,10 +68,8 @@ public void actionPerformed(ActionEvent arg0) { JButton btnManual = new JButton(Mensaje.about_manual); btnManual.setIcon(new ImageIcon(this.getClass().getResource("img/manual.png"))); - btnManual.setMargin(new Insets(0, 0, 0, 16 + 1));// Pone margen a la - // derecha de 16 - // para centrar el - // texto bien + btnManual.setMargin(new Insets(0, 0, 0, 16 + 1)); + // Pone margen a la derecha de 16 para centrar el texto bien btnManual.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -142,6 +140,7 @@ public void actionPerformed(ActionEvent e) { // Acciones de los eventos + // Abre en el navegador el parámetro 'enlace' private void abrirWeb(String enlace) { if (Desktop.isDesktopSupported()) { try { @@ -153,6 +152,8 @@ private void abrirWeb(String enlace) { } } + // Abre el programa predeterminado de emails con destinatario el parámetro + // 'eMail' private void enviarMail(String eMail) { if (Desktop.isDesktopSupported()) { try { diff --git a/src/Ventana.java b/src/VentanaMain.java similarity index 86% rename from src/Ventana.java rename to src/VentanaMain.java index 436c4b3..ed364e7 100644 --- a/src/Ventana.java +++ b/src/VentanaMain.java @@ -28,7 +28,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -public class Ventana { +public class VentanaMain { private JFrame frmUuidRenamer; private JTextField textoOrigen; @@ -55,7 +55,7 @@ public static void main(String[] args) { @Override public void run() { try { - Ventana window = new Ventana(); + VentanaMain window = new VentanaMain(); window.frmUuidRenamer.setVisible(true); } catch (Exception e) { e.printStackTrace(); @@ -64,7 +64,7 @@ public void run() { }); } - public Ventana() { + public VentanaMain() { initialize(); } @@ -78,7 +78,8 @@ private void initialize() { } frmUuidRenamer = new JFrame(); - frmUuidRenamer.setIconImage(Toolkit.getDefaultToolkit().getImage(Ventana.class.getResource("img/icon.png"))); + frmUuidRenamer + .setIconImage(Toolkit.getDefaultToolkit().getImage(VentanaMain.class.getResource("img/icon.png"))); frmUuidRenamer.setTitle(Mensaje.msg_nombreVentana); frmUuidRenamer.setResizable(false); frmUuidRenamer.setBounds(100, 100, 415, 454); @@ -252,12 +253,12 @@ public void stateChanged(ChangeEvent arg0) { JLabel lblNewLabel = new JLabel(""); lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT); - lblNewLabel.setIcon(new ImageIcon(Ventana.class.getResource("img/aNoPremium.png"))); + lblNewLabel.setIcon(new ImageIcon(VentanaMain.class.getResource("img/aNoPremium.png"))); lblNewLabel.setBounds(56, 98, 25, 20); frmUuidRenamer.getContentPane().add(lblNewLabel); JLabel label = new JLabel(""); - label.setIcon(new ImageIcon(Ventana.class.getResource("img/aPremium.png"))); + label.setIcon(new ImageIcon(VentanaMain.class.getResource("img/aPremium.png"))); label.setHorizontalAlignment(SwingConstants.RIGHT); label.setBounds(56, 129, 25, 20); frmUuidRenamer.getContentPane().add(label); @@ -268,14 +269,14 @@ public void stateChanged(ChangeEvent arg0) { // Acciones de los eventos private void eventoRuta1() { - String queAbrir = Archivo.abrir(); + String queAbrir = Archivo.dialogoAbrir(); if (queAbrir != null) { textoOrigen.setText(queAbrir); } } private void eventoRuta2() { - String queAbrir = Archivo.abrir(); + String queAbrir = Archivo.dialogoAbrir(); if (queAbrir != null) { textoDestino.setText(queAbrir); } @@ -284,43 +285,43 @@ private void eventoRuta2() { // EventoBoton 1 y 2 comprueban los campos y inician cada uno su método de // la clase 'Copiar' private void eventoBoton1() { - Ventana.log.setText(Mensaje.msg_empezar + "\n"); + VentanaMain.log.setText(Mensaje.msg_empezar + "\n"); boolean copiado = false; if (comprobarCampos(textoOrigen, textoDestino)) { try { - copiado = Copiar.toNoPremium(textoOrigen.getText(), textoDestino.getText()); + copiado = Copiador.toNoPremium(textoOrigen.getText(), textoDestino.getText()); } catch (Exception e) { e.printStackTrace(); } } if (copiado) { - Ventana.log.append(Mensaje.msg_finalizado); - JOptionPane.showConfirmDialog(Ventana.log, Mensaje.msg_finalizado, Mensaje.msg_nombreVentana, + VentanaMain.log.append(Mensaje.msg_finalizado); + JOptionPane.showConfirmDialog(VentanaMain.log, Mensaje.msg_finalizado, Mensaje.msg_nombreVentana, JOptionPane.PLAIN_MESSAGE); } else { - Ventana.log.append(Mensaje.msg_noCopiado); - JOptionPane.showConfirmDialog(Ventana.log, Mensaje.msg_noCopiado, Mensaje.msg_nombreVentana, + VentanaMain.log.append(Mensaje.msg_noCopiado); + JOptionPane.showConfirmDialog(VentanaMain.log, Mensaje.msg_noCopiado, Mensaje.msg_nombreVentana, JOptionPane.PLAIN_MESSAGE); } } private void eventoBoton2() { - Ventana.log.setText(Mensaje.msg_empezar + "\n"); + VentanaMain.log.setText(Mensaje.msg_empezar + "\n"); boolean copiado = false; if (comprobarCampos(textoOrigen, textoDestino)) { try { - copiado = Copiar.toPremium(textoOrigen.getText(), textoDestino.getText()); + copiado = Copiador.toPremium(textoOrigen.getText(), textoDestino.getText()); } catch (Exception e) { e.printStackTrace(); } } if (copiado) { - Ventana.log.append(Mensaje.msg_finalizado); - JOptionPane.showConfirmDialog(Ventana.log, Mensaje.msg_finalizado, Mensaje.msg_nombreVentana, + VentanaMain.log.append(Mensaje.msg_finalizado); + JOptionPane.showConfirmDialog(VentanaMain.log, Mensaje.msg_finalizado, Mensaje.msg_nombreVentana, JOptionPane.PLAIN_MESSAGE); } else { - Ventana.log.append(Mensaje.msg_noCopiado); - JOptionPane.showConfirmDialog(Ventana.log, Mensaje.msg_noCopiado, Mensaje.msg_nombreVentana, + VentanaMain.log.append(Mensaje.msg_noCopiado); + JOptionPane.showConfirmDialog(VentanaMain.log, Mensaje.msg_noCopiado, Mensaje.msg_nombreVentana, JOptionPane.PLAIN_MESSAGE); } } @@ -330,14 +331,14 @@ public static boolean comprobarCampos(JTextField textoOrigen, JTextField textoDe boolean todoCorrecto = true; if (textoOrigen.getText().isEmpty() || textoDestino.getText().isEmpty()) { System.out.println(Mensaje.msg_avisoCampoVacio); - JOptionPane.showConfirmDialog(Ventana.log, Mensaje.msg_avisoCampoVacio, Mensaje.msg_nombreVentana, + JOptionPane.showConfirmDialog(VentanaMain.log, Mensaje.msg_avisoCampoVacio, Mensaje.msg_nombreVentana, JOptionPane.PLAIN_MESSAGE); todoCorrecto = false; } if (textoOrigen.getText().equals(textoDestino.getText()) && todoCorrecto == true) { System.out.println(Mensaje.msg_avisoIguales); int sinoVentana = 0; - sinoVentana = JOptionPane.showConfirmDialog(Ventana.log, Mensaje.msg_avisoIguales, + sinoVentana = JOptionPane.showConfirmDialog(VentanaMain.log, Mensaje.msg_avisoIguales, Mensaje.msg_nombreVentana, JOptionPane.YES_NO_OPTION); if (sinoVentana == 0) { todoCorrecto = true; @@ -373,12 +374,12 @@ private void cambiarIdioma() { } private void abrirVentanaAbout() { - About acerca = new About(this.frmUuidRenamer, true); + VentanaAbout acerca = new VentanaAbout(this.frmUuidRenamer, true); acerca.setLocationRelativeTo(btn_acercaDe); acerca.setVisible(true); } public static void refrescarLog() { - Ventana.log.update(Ventana.log.getGraphics()); + VentanaMain.log.update(VentanaMain.log.getGraphics()); } } diff --git a/src/img/icon.png b/src/img/icon.png index 869b9e16af515a17275b56ca9b3254f5f791da89..5c046a87c735197fd75cf23c28dd16fd1610753b 100644 GIT binary patch delta 2307 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 Y56OIP@XZ6WB>(^b07*qoM6N<$f|4